最近芯片缺货得严重,我们之前用的一款触摸芯片供货出了问题。供应商说可以用另外一款芯片替代,因为工艺不一样供货不成问题,但是需要修改程序。在和供应商调试的过程中发现我的i2c出了问题,但是之前一直没事。
通过对通讯波形的对比发现,和新款芯片通讯时少了一个CLK。有时候这个CLK的地方变得很窄。思来想去应该是我的软件出了问题,于是把通讯速率放低。这时通讯正常了,CLK数量没有少。但是总有一个CLK变窄了。和供应商的技术沟通了才知道,触摸芯片在通讯一个字节之后会处理忙状态。在这个状态下它会把SCLK拉低,导致主机不能拉高。所以波形上看到有个别SCLK丢失或者变窄。
供应商的技术还是很有经验的。技术 给出的方案是主机在拉高SCLK后等等SCLK变高。
一直以来没有太留意这些细节。网络上的资料也是没有这一部分的内容。一般情况下不会出问题,只是代码的容错性不是很好。
修改的代码:
//i2c.h
//============================================================================
#define SetI2CSCK() GROUP_OF_PIN_I2C_SCLK->ODR |= (unsigned char)(PIN_I2C_SCLK);\
WaiteI2CSClkHigh();
#define GetI2CSCK() (GROUP_OF_PIN_I2C_SCLK->IDR & (unsigned char)(PIN_I2C_SCLK))
//i2c.c
//============================================================================
BOOL WaiteI2CSClkHigh(void)
{
unsigned int t = 500;
while(--t)
{
if(0 != GetI2CSCK())
return true;
}
return false;
}