模拟I2C通讯驱动调试的些许感悟

 

下面传的图是在调试一款温湿度传感器的时候捕获到的信号,该xxx温湿度传感器芯片采用的是I2C通讯接口。本来想用硬件I2C接口来进行通讯的,发现通过STM32CUBEMX这款软件自动生成的接口。这里额外介绍一下STM32CUBEMX这款软件,STM32CUBEMX是ST公司设计的一款免费软件,软件可以通过其官网下载。现在已经下载到。通过STM32CUBEMX可以完成从单片机选型,程序初始化,中断配置……工作。并生成对应的"HAL库程序",其目前支持的编译器包括EWARM,MDK-ARM V4,MDK-ARM V5,TreeSTUDIO,SW4STM32,Makefile,Other Toolahains(GPDSC)等7款软件,软件主要分为5部分:单片机选型,管脚定义,时钟配置,中断配置,功耗计算器。

        通过STM32CUBEMX生成的I2C接口,在进行EEPROM的读写通讯时,遇到两个问题:一个芯片读写地址有两个固定的地址,这里你说的地址不是写入和读取数据的地址,写入和读取的地址肯定是根据编码可以随便修改的。另一个是写入的数据的bit位数,有的是8bit的,有的是16bit的,这个应该根据具体的情况来选择,这个是作为操作接口的参数可自行选择的。搞错了读写数据就会有问题。可以通过芯片手册查阅,或者通过仿真调试来确认。

 

首先第一个问题,针对这个问题,在网上进行了一些了解,并且阅读了芯片手册读写地址这一块的说明。这个读写地址是如何来的?从硬件上是如何区分的?如何根据硬件引脚来自行计算?针对这几个问题进行了了解。我这里用到EEPROM芯片是AT24C02这一款,就拿这一款来说明吧。

看一下AT24C02的芯片资料,我们会发现AT24C02有三个地址A0,A1,A2。同时,我们会在资料的Device Address介绍发现I2C器件一共有七位地址码,还有一位是读/写(R/W)操作位,而在AT24C02的前四位已经固定为1010。R/W为1则为 读操作,为0则为写操作。R/W位我们要设置为0(写操作)规则为:1010(A0)(A1)(A2)(R/W)

 

模拟I2C通讯驱动调试的些许感悟_第1张图片

 

针对遇到的第二个问题进行了一个了解,一开始参考了网上一个读写接口的教程,发现读写的数据存在问题,写入和读出的数前边几个字节一致,后面的数据不一致了。后来了解到不用的E2PROM芯片的读写数据位数可能是不一样的,后来通过调试发现果然是这里的问题。

 

后面有在网上了解,有些EEPR0M芯片是采用16bit结构,读取数据时须注意是16bit还是8bit否则会除夕拿高低位颠倒甚至数据错误的结果,调试EEPROM接口时须特别注意。

 

上面是在调试硬件I2C接口和EEPROM通讯时遇到的问题,后面编写和调试模拟I2接口驱动程序的时候有遇到另一个问题,I2C通讯接口的两个引脚 如果硬件上没有外部上啦的话,软件IO口要执行内部上拉操作。

 

选用的温湿度传感器芯片是I2C通讯接口的,这里的I2C通讯接口采用的模拟I2C驱动程序。遇到的问题也大致有两个吧:一个是驱动接口的程序编写时,写入数据的频率较低,是因为每写入一个bit数据时停留的延时的时间太长了导致。还有就是在读取和写入的操作时,IO口引脚电平切换的延时时间要保持一致。该时间根据具体芯片可调试修改。 另外一个需要注意的问题就是I2C DATA引脚信号开始信号,ack响应信号,停止信号等,这个问题在另一篇博客里对I2C协议进行了介绍,可以阅读了解,这里就不在详细描述了。

 

模拟I2C通讯驱动调试的些许感悟_第2张图片

模拟I2C通讯驱动调试的些许感悟_第3张图片

 

模拟I2C通讯驱动调试的些许感悟_第4张图片模拟I2C通讯驱动调试的些许感悟_第5张图片

你可能感兴趣的:(单片机)