大家好、我一直在尝试使用 Pololu AltIMU-10 v5 (陀螺仪、加速计、指南针和高度计连在一起、所有这些都可以访问 vía I2C)。
我已成功将 AltIMU 与其他器件配合使用、但使用 CC2650-LAUNCHPADXL 时遇到问题、我已将 I2C 代码添加到 simpleBLEPeripheral 应用程序、但调用 I2C_transfer 后从未返回。 我已经尝试调试代码、它被卡在一个信标中(下面的第82行):
bool I2CCC26XX_transfer (I2C_Handle handle、
I2C_Transaction *事务)
{
布尔 RET = false;
通用 密钥;
I2CCC26XX_Object *对象;
I2CCC26XX_HWAttrsV1 const *hwAttrs;
内部 状态;
/*获取对象和 hwAttrs 的指针*/
对象=句柄->对象;
hwAttrs = handle->hwAttrs;
/*检查是否需要写入或读取任何内容*/
如果(!事务->writeCount)&&(!事务->ReadCount)){
/*没有要写入或读取的内容*/
返回(RET);
}
if (object->transferMode = I2C_MODE_CALLACK){
/*检查传输是否正在进行中*/
KEY = Hwi_disable();
if (object->headPtr){
/*正在传输*/
/*
*更新由 tailPtr 指向的消息以指向下一个
队列中的*消息
*
object->tailPtr ->nextPtr =事务;
/*更新 tailPtr 以指向最后一条消息*/
object->tailPtr =事务;
/*仍在使用 I2C */
Hwi_restore (key);
返回(true);
}
否则{
/*存储指示 I2C 正在使用的 HeadPtr */
object->headPtr =事务;
object->tailPtr =事务;
}
Hwi_restore (key);
}
/*设置待机禁止约束。 *
power_setConstraint (PowerCC26XX_SB_disallow);
/*获取此特定 I2C 句柄的锁*/
Semaphore_pend (Semaphore_handle (&(object->mutex)))、BIOS_wait_forever);
/*
* I2CCC26XX_primeTransfer 是一个更长的过程
*需要对 I2C 中断进行保护
*
hwi_disableInterrupt (hwAttrs->intNum);
状态= I2CCC26XX_primeTransfer (handle、transaction);
hwi_enableInterrupt (hwAttrs->intNum);
if (object->transferMode =I2C_mode_blocking){
if (status =I2C_STATUS_ERROR){
Log_Print1 (Diags_User1、
"I2C:(%p)总线忙、传输未开始"、
hwAttrs->baseAddr);
object->mode = I2CCC26XX_BUSBUSY_MODE;
RET = false;
/*释放待机禁用约束。 *
power_releaseConstraint (PowerCC26XX_SB_disallow);
}
否则{
Log_Print1 (Diags_User1、
"I2C:(%p)在传输完成信标上挂起"、
hwAttrs->baseAddr);
/*
*在此处等待传输完成。
*可以从这里阻止、因为 I2C 的 Hwi 将解除阻止
*出错时
*
Semaphore_pend (Semaphore_handle (&(object->transferComplete))、BIOS_wait_forever);
/*这里无需释放待机禁止约束-在 swi 中完成*/
Log_Print1 (Diags_User1、
"I2C:(%p)事务已完成"、
hwAttrs->baseAddr);
/* Hwi 句柄已发布错误的"传输完成"检查*/
if (object->mode = I2CCC26XX_IDLE_MODE){
Log_Print1 (Diags_User1、
"I2C:(%p)传输正常"、
hwAttrs->baseAddr);
RET = true;
}
}
否则{
/*如果无法开始转接,请立即回叫*/
if (status =I2C_STATUS_ERROR){
object->mode = I2CCC26XX_BUSBUSY_MODE;
Swi_post (Swi_handle (&(object->swi)));
RET = false;
}
否则{
/*如果事务已开始,则返回 true */
RET = true;
}
}
/*释放此特定 I2C 句柄的锁*/
Semaphore_post (semaphore_handle (&(object->mutex)));
/*返回状态*/
返回(RET);
}
这是我的 I2C 代码:
I2C_Handle 句柄; I2C_Params 参数; I2C_Transaction i2cTrans; uint8_t txBuf[2]={0};//发送缓冲器 //I2C 驱动程序初始化 I2C_init(); I2C_PARAMS_INIT (params); 句柄= I2C_open (Board_I2C、params); if (!handle){ //Error } //加速计 //地址= 0x10 // 0x80 = 0b10000000 // ODR = 1000 (1.66kHz (高性能));FS_XL = 00 (+/-2g 满量程) TxBuf[0]= 0x10; txBuf[1]= 0x80; i2cTrans.writeCount = 2; i2cTrans.writeBuf = txBuf; i2cTrans.ReadCount = 0; i2cTrans.readBuf =空; i2cTrans.slaveAddress = 0x6B; I2C_transfer (handle、&i2cTrans);
物理连接如下所示:
ALTIDU CC2650 Launchpad
SCL DIO4
SDA DIO5
VDD 3.3V
GND GND GND
有人能帮我弄清楚问题在哪里?
提前感谢

