微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2541 I2C restart 问题

CC2541 I2C restart 问题

时间:10-02 整理:3721RD 点击:

问题:采用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;

}

请大家帮忙解答,不胜感激!

楼主这个问题有解决么?

同问楼主问题解决了吗

这个问题提的太好了,我也遇到这个问题,不知能有解答下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top