CC2650使用I2C遇到麻烦
大家好,我看了SensorTag例程,感觉里面的代码太复杂,想把I2C部分移到simpleBLEPeripheral中太难了,而且那些功能我全都不用上(比如选择传感器和各种自检测等),就只参照SWRU393_CC2640_BLE_Software_Developer's_Guide.pdf的I2C部分添加了代码,对于我只需要传一个传感器的数据应该是够用了。但发现I2C仍然不通,用示波器抓SCL和SDA的信号,发现地址的最高位没弄对,下面是示波器图:
代码 :
先在初始化中加上:
I2C_Params_init(&SbpI2cParams);
SbpI2cParams.bitRate = I2C_100kHz;
SbpI2cHandle = I2C_open(CC2650_I2C0, &SbpI2cParams);
然后在循环上加上:
I2C_Transaction i2cTransaction;
uint8 txBuf[] = {0x76};
uint8 rxBuf[5];
i2cTransaction.writeBuf = txBuf;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = NULL;
i2cTransaction.readCount = 0;
i2cTransaction.slaveAddress = 0xd1; //arbitrary for demo
I2C_transfer(SbpI2cHandle, &i2cTransaction);
可以看到它传输了地址0x51和数据0x76,但我想让它输的地址是0xd1,11010001变成了01010001,我试了许多数据,发现都是最高位的地址不见了,而数据都是对的,连续传几次都一样。
请问可能是什么原因呢?
I2C通信第一个字节为从器件地址,后7位为真正地址,最高位代表读或写命令的。需要两个地址的。
也就是一个为写地址,一个为读地址。
谢谢您,刚搞定了。我以前用的STM32,它里面需要写0xd0,就是把最后一位的读写标志位也带上,但是这个例程中所说的器件地址是不能带它的。就是不可能存在0xd0这个东西,而是0x68.改了之后就可以用了。
你这个地址不是0x51,而是0xa2,CC2640底层的I2C函数会把slaveAddress左移一位,从而导致最高位丢失,不是你所说的最高位丢失的情况。
这里的地址0xd1,移位变成了0xa2。
解决办法,就是将地址值右移一位,再赋给i2cTransaction.slaveAddress。