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接口问题的资料。

image

在我的板子上,所有I2C设备都连接到I2C bus 1接口。I2C bus 2被用于串口了。从上图可发现,I2C bus 1接口的SDA信号与FSMC的NADV信号复用。虽然实际应用中,FSMC的NADV信号并没有使用,但FSMC功能是启用的,所以这里就存在冲突。另外,STM32的I2C本身也存在一些硬件bug。

怎么解决这些问题呢?如果不remap,FSMC_NADV信号则会干扰I2C1_SDA信号线。在网上搜索了下资料,看下网友们的解决方法:

归纳起来就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信号冲突问题。

image

GPIO软件模拟I2C

由于上面的STM32 I2C补丁包不适用于我的板子,所以最终使用了IO模拟I2C来解决,实现上参考了安富莱开发板提供的I2C使用例程。

使用IO模拟I2C的实现确实是简单,但效率上肯定及不上使用STM32 I2C接口,而且I2C的通讯速率不好控制。

使用示例

EEPROM读取示例:

image

STM32 I2C DRIVER组件包

ECOS STM32 I2C DRIVER组件包上传到了eCos技术网的资源板块中,供大家下载参考使用。下载链接地址为:http://52ecos.net/thread-527-1-1.html

使用方法详见其中的readme.txt文件。

» 文章出处: reille博客—http://velep.com , 如果没有特别声明,文章均为reille博客原创作品
» 郑重声明: 原创作品未经允许不得转载,如需转载请联系reille#qq.com(#换成@)
分享到:

 Leave a Reply

(必须)

(我会替您保密的)(必须)

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.

   
© 2012 velep.com | reille blog | 管理| 粤ICP备15065318号-2| 谷歌地图| 百度地图| Suffusion theme|Sayontan Sinha

无觅相关文章插件,快速提升流量