I2C总线,只有2根信号线,结构简单,易于实现,因此在嵌入式中应用非常广泛。在eCos中,I2C的设计框架与SPI类似,都是由IO层和Device Driver层组成。与linux I2C框架相比,eCos I2C框架设计简洁实用。
STM32提供了2个I2C接口,由于STM32芯片本身存在的缺陷,eCos STM3210E-EVAL模板并没有提供I2C的驱动组件包。但可在eCos官方bug网站上找到相应的补丁包。
遗憾的是,这个补丁包在我的板子上还是不能使用(下面会介绍原因)。所以,后面采用GPIO软件模拟I2C来实现。经初步测试,本人编写的eCos I2C driver初步成功。
关于STM32 I2C问题
在网上,可以搜索到大量关于STM32 I2C接口问题的资料。
在我的板子上,所有I2C设备都连接到I2C bus 1接口。I2C bus 2被用于串口了。从上图可发现,I2C bus 1接口的SDA信号与FSMC的NADV信号复用。虽然实际应用中,FSMC的NADV信号并没有使用,但FSMC功能是启用的,所以这里就存在冲突。另外,STM32的I2C本身也存在一些硬件bug。
怎么解决这些问题呢?如果不remap,FSMC_NADV信号则会干扰I2C1_SDA信号线。在网上搜索了下资料,看下网友们的解决方法:
- 方法1:http://blog.gkong.com/more.asp?name=zjcsharp&id=113287
- 方法2:http://blog.csdn.net/lbing7/article/details/5707092
- 方法3:http://racede.me/talk_about_stm32_i2c_peripheral.html
- 方法4:使用IO模拟I2C处理
归纳起来就3方法,一是软件模拟;二是使用I2C接口,但必须使用最高优先级中断和DMA方法;三是redmap(针对I2C BUS 1)。
第2种解决方法,看了网友们的实现,感觉无比的复杂,因此弃用。第3种方法在我的板子不适用。因此,最终使用GPIO软件模拟I2C解决。
关于eCos I2C for STM32补丁包
eCos STM3210E-EVAL模板并没有提供I2C的驱动组件包,但在eCos官方bug网站上找到了相应的补丁。链接地址为:http://bugs.ecos.sourceware.org/show_bug.cgi?id=1001268
这个网页提供的补丁源码不可下载,因此需要自己整理。当然,你也可以从eCos技术网提供的I2C驱动组件包里面获取到(链接地址见下面)。
由于我的板子不可用,因此该I2C驱动补丁包没有经过调试和验证,因此,不保证可以正常使用。
这个STM32 I2C驱动补丁提供了完整的I2C驱动实现,可用于STM32 F1、F2和F4系列,包含中断和POLL方式,并实现了I2C BUS 1 REMAP功能,解决STM32 I2C bus 1接口的SDA信号与FSMC的NADV信号冲突问题。
GPIO软件模拟I2C
由于上面的STM32 I2C补丁包不适用于我的板子,所以最终使用了IO模拟I2C来解决,实现上参考了安富莱开发板提供的I2C使用例程。
使用IO模拟I2C的实现确实是简单,但效率上肯定及不上使用STM32 I2C接口,而且I2C的通讯速率不好控制。
使用示例
EEPROM读取示例:
STM32 I2C DRIVER组件包
ECOS STM32 I2C DRIVER组件包上传到了eCos技术网的资源板块中,供大家下载参考使用。下载链接地址为:http://52ecos.net/thread-527-1-1.html
使用方法详见其中的readme.txt文件。
推荐阅读相关文章:
- stm32移植ecos #33,ecos sd driver,SD卡驱动(3)
- stm32移植ecos #28,ecos i2s driver,音频驱动(上)
- stm32移植ecos #27,串行SPI flash驱动移植(下)
- stm32移植ecos #26,串行SPI flash驱动移植(上)
- stm32移植ecos #34,ecos sd driver,SD卡驱动(4)
- stm32移植ecos #31,ecos sd driver,SD卡驱动(1)
- stm32移植ecos #30,ecos i2s driver,音频驱动(下)
- stm32移植ecos #29,ecos i2s driver,音频驱动(中)