多从机SPI通信

2019-07-21 04:22发布

用STM32f4做主机,和3个从设备通过一个SPI用中断进行通信
现在TXE的中断进去了以后,往DR里面写命令
很奇葩的有两个问题
第一,SPI4->DR = 0x28;
用debug看了之后DR寄存器里是0x00ff,数据位是8bit
第二,现在DR里面写了0x00ff之后,TXE仍然置位,
RXNE一直进不去。。。。
什么个原因啊?为何不能往DR里正确写命令呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
xuande
1楼-- · 2019-07-21 09:24
1、DR是一个名字、一个地址、两个buffer,
      读的时候自动指向“接收寄存器”,而不是“发送寄存器”。后者不可读——设计者认为不需要。
2、SPI动作很快,你没有观察到 TXE 为0的情况。
    RXNE=1,说明接收到新内容了,你要读一下DR,就会自动清除;或者你武力清除。

yyisme1988
2楼-- · 2019-07-21 11:35
回复【2楼】xuande:
---------------------------------
感谢你的回复
我明白你的意思,发送时,写入数据寄存器DR后发送至发送缓存器,同时接受到数据后,进入接受混存器后从DR中读取
你的意思是我debug中SPI4->DR中显示的数据时由从器件收到的数据?而不是我发送的指令?
那么,如果是这样的话,为何RXNE没有置位呢?说不通啊
而且,在TXE中断中,我向DR写入命令后,应该会复位TXE,但实际debug来看并没有复位,而是一直死在TXE的中断里面了
何况,debug每一步运行,应该可以观测到TXE=0 RXNE=1的吧。。。。。。
望解答谢谢
xuande
3楼-- · 2019-07-21 17:24
1、关于DR,你理解对了。
   两个物理buffer,虽然同名,但读、写的对象是分开的。

2、标志该变化但没有变化,可能与你的操作方法有关。
  单步调试时,芯片的中断往往观察不到。这种情况其他地方也会有。
  正确做法是:
  从触发SPI工作(即给DR赋值),到产生标志和中断,这期间要保证芯片连续运行,不能单步,也不能设置断点。
  这种调试方法,会经常用到。
yyisme1988
4楼-- · 2019-07-21 22:41
回复【4楼】xuande:
---------------------------------
确实如你所说的DR里面的数值其实就是从器件里返回的数据了。。。
但是RXNE的中断一直进不去。。。。难道是其实进去了,而我以为没进去?
yyisme1988
5楼-- · 2019-07-22 03:56
回复【4楼】xuande:
---------------------------------
测试了,确实是RXNE无法置位。。。。。我再看看到底哪里设置有问题
xuande
6楼-- · 2019-07-22 08:10
我用407,至少用到两个硬件SPI,没有发现问题。

一周热门 更多>