TIwilliam hill官网
直播中

龙慧

7年用户 151经验值
私信 关注
[问答]

CC3200 I2C arbitration lost

尊敬的ti工程师:
我将CC3200 与 mpu6050 用I2C相连。 mpu6050 上能另加一个ak8975,可选择性的用一个函数将ak8975加入I2C总线。
我遇到的情况是:我一度通过访问 Who_am_I 成功获得mpu6050 的回馈。接着我不知道修改了什么,或者什么出了错误,我再也的得不到正确的回馈。
错误的WHO_AM_I 回馈如下图: 


MPU6050 的 slave address是0x68, who_am_i 的register address 是0x75. 正确读取应该是0x34.
我找出错误的类型是:I2C_MASTER_ERR_ARB_LOST (arbitration lost, 失去总线控制??)
在成功读取MPU605 的Who_am_i之后, 我记得我有两个操作,其余的忘记了:
1.尝试将
// Configure PIN_03 for I2C0 I2C_SCL
PinTypeI2C(PIN_03, PIN_MODE_5);
// Configure PIN_04 for I2C0 I2C_SDA
PinTypeI2C(PIN_04, PIN_MODE_5);
中的PIN_MODE_5 改为PIN_MODE_1(因为i2c demo例程中为pin_mode_1, 但是发现不运行后我立即修改回pin_mode_5);
2. 我尝试将ak8975加上I2C 总线,并找到ak8975的who_am_i register

我的问题是, 
1.什么原因会导致arbitration lost, 从上图的波形中, 能看出具体是什么原因吗
2. 如何修改

//l另外,我的启动函数如下:
void MPU6050_I2C_Init(void)[

// Configure PIN_03 for I2C0 I2C_SCL
PinTypeI2C(PIN_03, PIN_MODE_5);
// Configure PIN_04 for I2C0 I2C_SDA
PinTypeI2C(PIN_04, PIN_MODE_5);

MAP_PRCMPeripheralClkEnable(PRCM_I2CA0, PRCM_RUN_MODE_CLK);
MAP_PRCMPeripheralReset(PRCM_I2CA0);
MAP_I2CMasterInitExpClk(I2CA0_BASE,SYS_CLK,false); // set up the transfer to standard mode

MAP_I2CMasterEnable(I2CA0_BASE);
MAP_I2CMasterIntEnable(I2CA0_BASE);
]

回帖(5)

李秀芳

2018-5-14 00:24:38
我找到到了自己的错误。是因为,cc3200 的默认I2C 为Pin 1 和Pin2, 如果想用其他Pin 来做I2C 的话,需要先将Pin 1 和2 设置为GPIO。
我能够正确的读取mpu6050 的ID, 但是不能够获取mpu6050 的数据。 因为写入一直不成功,以至于,我无法写入想要的bit 来唤醒mpu6050。 
请问我的initialization启动函数是正确的吗??


谢谢 
举报

龙慧

2018-5-14 00:38:07
我找到了我接收数据为0的原因:
1. MPU6050 需要上电时间, 在初始化I2C之后需要,加上一个延迟,
for( int  i=0; i<10000; i++)[
for( int i=0; i<1000;i+=)[
]
]
然后再把MPU6050 从休眠状态唤醒
2. 我之前运用 i2c_demo 中的 I2C_IF_Write() 函数来 组成一个写writeRegister 的函数,例如
[
I2C_IF_Write(slaveAddr, regAddr, 1, 0); // 停止位为零, 写入regAddr 
I2C_IF_Write(slaveAddr,content,1,1); // 停止位为1, 写入寄存器的值 

我在逻辑分析仪上看这种代码的发送的读写并没问题,但是,实际上,这种将写寄存器地址和写数据分开的方法,并没有将数据真正的写入寄存器!!!(可能是由于间隔时间过长)
正确的方法是想i2c_demo中一样, 将regAddr 和数据存在一个 array中,然后只使用一个I2C_IF_WRITE()函数,进行连续传输


希望对大家有帮助
举报

王海燕

2018-5-14 00:43:42
引用: ncaskd 发表于 2018-5-14 00:24
我找到到了自己的错误。是因为,cc3200 的默认I2C 为Pin 1 和Pin2, 如果想用其他Pin 来做I2C 的话,需要先将Pin 1 和2 设置为GPIO。
我能够正确的读取mpu6050 的ID, 但是不能够获取mpu6050 的数据。 因为写入一直不成功,以至于,我无法写入想要的bit 来唤醒mpu6050。 
请问我的initialization启动函数是正确的吗??

请教,我现在在使用I2C读取PCF8563的数据,同样读出来的也都为0,想知道问题是因为什么,用的引脚是GPIO10和GPIO13,方便內留个联系方式吗,多谢。
举报

赵文平

2018-5-14 00:59:38
引用: 黄黄挂怪 发表于 2018-5-14 00:38
我找到了我接收数据为0的原因:
1. MPU6050 需要上电时间, 在初始化I2C之后需要,加上一个延迟,
for( int  i=0; i<10000; i++)[

您好!I2C 写MPU6050 一直有问题,数据传输完成中断无法获得~  您能给一段 读写MPU的代码嘛?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分