|
本帖最后由 foxpro2005 于 2013-10-23 19:02 编辑
首先,非感谢原作者lj2505大侠提供的例子“相信这是ouravr共享中,目前最完美的STM32读写EEPROM驱动,硬件I2C中断加DMA方式(原创)”
http://www.amobbs.com/forum.php? ... highlight=I2C%2BDMA
目前,我在此基础上再次进行了修改与完善:
对原来存在的一些bug, 基本上移出while轮询, 并加入超时特性 防止等死, 并对数据传递方式进行了部分改进....
应该是目前比较完善的版本..., 在程序中做大量的中文注释, 方便大家阅读....(相信应该不需要我再整一个流程图或状态图了吧, ...)
并在野火M3板上测试通过,手上只有at2402,已测试验证通过..., 现欢迎大家进行测试,以及讨论...
更新及具体特性如下:
1.支持EEPROM: AT24C01 ~ AT24C512
2.修正了lijie大侠发布的原版中,不能读取1个字节数据的BUG
3.支持了对于有I2C1, I2C2模块的选择配置, 只要需要在头文件中一条宏开关即可快速完成
4.支持了I2C1引脚重映射功能选择配置,也是在头文件中一条宏即可快速完成
5.增加了对函数调用参考的有效性检测
6.修改了数据的读/写操作方式:
从EEPROM中读取数据
读取数量 = 0 : 返回错误, 一般不会这么操作吧!
读取数量 = 1 : 只读取1个字节数据,使用中断直接完成的方式。
读取数量 > 1 : 采用DMA方式, 并使用中断进行辅助配合完成。
向EEPROM写入数据
写入数量 = 0 : 只是对从器件内部单元地址指针进行设定,不执行数据写入,相当于骚扰一下从器件。
写入数量 = 1 : 只写一个字节数据,只采用中断直接完成的方式。
写入数量 > 1 : 采用DMA方式, 并使用中断进行辅助配合完成。
I2C中断
它只是辅助进行器件寻址, 从器件内部单元地址指针的设定,当读/写数据的数量大于1时,数据的传递主要是使用DMA完成, 这样可以大大减轻CPU的负担, 只是在数据的开始和结束时,才需要CPU的参与(I2C中断,DMA传输完成中断部分),所以大家不要担心会占用太多的CPU资源。
代码下载
I2C_EE_DMA:
STM32F103工程文件: |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|