i2c之初体验

       最近一直在做p2020项目的bsp适配,感觉好久没写心得体会了,趁现在有些间隙,抓紧时间写一写。这次想说说关于I2C的一些体验。

        其实在读书期间就早有耳闻I2C总线,只是当时并没有实战过。有些映像但是并没有感性认识,就更不必说理性认识了。(闲话好像扯得有点多了,总之表达一个意思,得知此事要躬行哈)。进入主题,I2C是一种板级总线。常见的还有SPI(这个将在下篇博客中推出),I2C总线由两根线构成,一根为时钟线,一根为数据线。具体的硬件细节我就不在这里展开了,说得好的、规范专业的,大有人在。

         以前在学校期间,上过某个大牛的网课,大牛说可以通过I2C总线来学习时序,当时听着并没什么感触(蜻蜓并没有来点水)。但是现在我非常赞同此位大牛的观点,由于I2C总线时序并不复杂,所以非常适合我们一些初级的驱动从业者去从中了解学习时序,目前我所理解的时序就是在时间线上做相应的操作(见解如果不对,欢迎指正)。

         现在进入项目,说说相关背景,此块板卡目前从cpu上引出了两路I2C,第一路I2C上挂有PCF8563(RTC)、PCA9672(外扩gpio)、AT24C02(EEPROM),第二路I2C上挂有两个PCA9672(外扩gpio)。第一次接触I2C就有这么多外设可以调,原谅我有点小激动。还有一点要注意就是I2C总线的拓扑结构可以是一主多从。这里,我主要向大家说说关于I2C_EEPROM的调试过程,其他的比较类似,一通百通。经过对硬件环境的分析比对、主要调试点在I2C_EEPROM时序过程中,话不多说先上两张在AT24C02手册上找的I2C的读写时序图

在字节写模式下 ,主器件发送起始命令和从器件地址信息 R/W 位置零 给从器件, 在从器件产生应答信号后, 主器件发送 CAT24WC01/02/04/08/16 的字节地址, 主器件在收到从器件的另一个应答信号后 ,再发送数据到被寻址的存储单元        CAT24WC01/02/04/08/16 再次应答 ,并在主器件产生停止信号后开始内部数据的擦写, 在内部擦写过程中 ,CAT24WC01/02/04/08/16 不再应答主器件的任何请求。
 

CAT24WC01/02/04/08/16 的地址计数器内容为最后操作字节的地址加 1, 也就是说, 如果上次读/写的操作地址为 N, 则立即读的地址从地址 N+1开始。 如果 N=E, 这里对 24WC01, E=127; 对 24WC02,E=255 ;对 24WC04, E=511; 对 24WC08, E=1023 ;对 24WC16 ,E=2047。 则计数器将翻转到 0 且继续输出数据 CAT24WC01/02/04/08/16 接收到从器件地址信号后 R/W 位置 1。 它首先发送一个应答信号 ,然后发送一个 8 位字节数据 ,主器件不需发送一个应答信号, 但要产生一个停止信号。

       而代码中通过I2C操作EEPROM的读写时序也应该严格按照以上两张图的顺序执行,否则执行会出现奇怪的EEPROM读写问题。大家还需要注意一点,我们的驱动代码与硬件有很强的相关性,所以需要了解从端芯片的相关信息。比如这里我们操作的EEPROM芯片的型号是AT24C02,存储大小为256个字节,这决定了一件事儿,你在读写操作中传输的寄存器地址是(unsigned char型)数据而不是word型更不是unsigned int型。

        总结,I2C总线需要注意I2C总线号 、设备地址、操作寄存器号。如若以上三点均无误,可是结果不正确,那么你需要再次确定硬件信息是否正确。硬件信息确认无误,就需要考虑时序问题了。  

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值