打印
[学习笔记]

AC7811的I2C-DMA方式读写eeprom

[复制链接]
4193|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 RunningX 于 2021-6-24 13:39 编辑

这次用的是I2C-DMA读写eeprom的方式,因为DMA只负责数据搬运,所以还是需要有中断参与到这个过程来。传输时序图跟我上一篇用I2C中断读写eeprom的时序一样,如下:写时序:

读时序:

代码也是参考了之前的做法,写的时序写了2个数据:

读时序也是读了5个数据:


使用I2C-DMA传输需要注意以下几点:
1.DMA只负责传输数据部分,所以从机地址需要手动发送,而不是通过DMA
2.I2C主机DMA发送完成后,不能直接在DMA发送完成中断里面发stop信号;因为只是DMA搬运数据搬完了,I2C还在发送中。需要在DMA完成中断里面把dmaTx跟dmaRx给禁能了,然后最后一个数据发送完成会触发BND中断,在BND中断里面发stop信号。
3.与注意点2同理,在读时序中,有个restart信号,也是要在BND中断里面完成。
4.I2C主机DMA接收完成后,可以直接在DMA接收完成中断里面发stop信号。因为I2C发完才触发DMA搬运。

附上工程如下(为了使用方便,修改了一些库函数):
I2C_master_dma.rar (1.78 MB)


这种DMA实现的方式,相比于中断实现的方式,会显得比较复杂。对于一般的应用场景来说,建议是用中断实现就可以了,一是因为I2C本身的通信速率也不高,一般是几百K的波特率,不会用来传输大量的数据,所以用DMA估计也不会说省下多少CPU资源;二是因为使用DMA情况下步骤稍微多些,例如还要禁能跟使能dmaTx跟dmaRx,还要进行DMA通道使能,这些步骤本身也会占用MCU资源。
(附上用中断实现的帖子:https://bbs.21ic.com/icview-3141900-1-1.html

再说个题外话,对于有大量数据传输的应用。可以挂个带SPI接口的FLASH芯片,然后用SPI-DMA的方式传输(SPI通信速度也很高),使用了才知道,真香!






使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

223

帖子

4

粉丝