CC2541 I2C restart 问题
问题:采用CC2541 的I2C读取MPU6050数据失败,在执行 if ( i2cMstStrt(address,I2C_MST_RD_BIT)!=mstAddrAckR)时, i2cMstStrt(address,I2C_MST_RD_BIT返回,0x28.不是mstAddrAckR(0x40),不知为什么?
I2C_STOP( );增加这行代码运行正确,但下一次调用时,进入i2cMstStrt()里的I2C_STRT();一直等待,为知什么?
按照手册应该不用加I2C_STOP( ); 就可以重新S条件的。
读取MPU6050数据要求是这样
所在要重新设置S条件,在读函数修改如下:
i2cLen_t HalI2CRead(uint8 address,uint8 regst, i2cLen_t len, uint8 *pBuf)
{
uint8 cnt = 0;
if (i2cMstStrt(address, 0) != mstAddrAckW)
{
len = 0;
return 1;
}
I2C_WRITE(regst);
if(I2CSTAT!=mstDataAckW)
{
len = 0;
return 1;
}
// I2C_STOP(); /*增加这行时,代码运行正确,但下一次调用时,进入i2cMstStrt()里的I2C_STRT();一直等待,为知什么*/
if ( i2cMstStrt(address,I2C_MST_RD_BIT)!=mstAddrAckR)
{
len = 0;
return 1;
}
// All bytes are ACK'd except for the last one which is NACK'd. If only
// 1 byte is being read, a single NACK will be sent. Thus, we only want
// to enable ACK if more than 1 byte is going to be read.
if (len > 1)
{
I2C_SET_ACK();
}
while (len > 0)
{
// slave devices require NACK to be sent after reading last byte
if (len == 1)
{
I2C_SET_NACK();
}
// read a byte from the I2C interface
I2C_READ(*pBuf++);
cnt++;
len--;
if (I2CSTAT != mstDataAckR)
{
if (I2CSTAT != mstDataNackR)
{
// something went wrong, so don't count last byte
cnt--;
}
break;
}
}
I2C_STOP();
return 0;
}
请大家帮忙解答,不胜感激!
楼主这个问题有解决么?
同问楼主问题解决了吗
这个问题提的太好了,我也遇到这个问题,不知能有解答下