|
RxNE事件后,硬件自动会按DMA配置的那样
1. 把I2C的DR中的内容放到预先指定的内存区域;同时CNDTR自减一次。
比如利用DMA接收10个数据,每收到一个数据,CNDTR自减一次,跟stop位有什么关系,stop位要10个数据接收完后才出现在总线上啊。
2. 使用DMA方式进行从设备的接收,有个通信长度的问题。
最简单的就是从设备本来就知道一次通信有几个数据要接收,于是在DMA初始化时便可以设定好。
如果从设备并不知道每次通信有几个数据,只能把DMA的BufferSize放到最大,好像是64K,但是需要打开ITEVTEN中断,来监测stop位,以便及时停止DMA。
3. 从lz5楼的问题“从机接收应答后接收了一部分数据后,紧接着从机初始化DMA和I2C,那主机后续发的数据和结束位从机还能不能收到呢”
比如先收了10个数据,然后从设备只是重新配置DMA,比如改变内存中的目的地址,或者做其它一些比较耗时的处理。在这个处理的过程中,master继续发送第11个数据,从设备硬件把11th放在DR中,同时置位RxNE标志;如果从设备还在处理自己的事情,master又发送第12个数据了,从设备硬件把12th放在移位寄存器中,同时置位BTF标志。然后这个从设备就可以按照I2C协议说的那样,把时钟线拉底,并保持。这样master就不会再发了。直到从设备处理完自己的事情,然后11th和12th数据后,master才会继续发送。
但是如果收了一部分数据后,STM32重新配置自己的I2C,(不知道lz为什么会有这种要求),后续还会再接收数据么,是怎样的,没有试过。 |
|