This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C123GH6PM:TI-RTOS I2C 实现会一直处于低电平状态、并且在不步进时不起作用。

Guru**** 2034770 points
Other Parts Discussed in Thread: TM4C123GH6PM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/570676/rtos-tm4c123gh6pm-ti-rtos-i2c-implementation-gets-stuck-low-and-doesn-t-work-when-not-stepping

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123

工具/软件:TI-RTOS

大家好、我已经为 BNO055 IMU 布线了一个驱动器、以便与我的 tm4c123配合使用。

当我单步执行程序时、驱动程序按预期工作、所有数据均可正确读取并按预期工作。 此外、该器件还可在连续模式下以100Hz 读取速率与 Arduino 配合使用

但是、当我尝试以100Hz 的读取速率在任务内持续运行它时、我发现总线故障和 SDA 被从器件拉低、或者我由于某种原因处于空闲任务、因此不会离开。

因此、当时钟扩展到远离从器件或任务可能发生变化时、我认为 I2C API 会发生故障。

此外、是否有从总线故障中恢复的软件方法? 例如、i2c API 是否需要处理该问题?

这是 i2c 的读取和写入  

我将 TI-RTOS 用于 TM4c123GH6PM、这些函数从 void i2c_task_fxn ()中调用;它们在步进时按预期工作。

此外、我只想说我只打开 I2C_open (1、&i2cParams)一次、我是否应该为每次传输重新初始化这个?

//函数将 BNO055库连接到 TM4C 外设驱动程序//
读取函
数 s8 i2c_bno055_read (u8 dev_address、u8 reg_address、u8*reg_data、u8 cnt)
{
uint8_t txBuffer[10];
txBuffer[0]= reg_address;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = reg_data;
i2cTransaction.ReadCount = cnt;
while (!I2C_transfer (i2c、&i2cTransaction))
{
Task_sleep (10);
}
返回0;
}

//函数将 BNO055库连接到 TM4C 外设驱动程序
//写入函
数 s8 i2c_bno055_write (u8 dev_address、u8 reg_address、u8 reg_data、u8 uintt

、u8 uintt)
txBuffer[10];
txBuffer[0]= reg_address;
对于(k = 1;k < cnt+1;k++)
{
txBuffer[k]=*(reg_data+k-1);
}
i2cTransaction.slaveAddress = DEV_address;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = cnt+1;
i2cTransaction.readBuf = reg_data;
i2cTransaction.ReadCount = 0;
if (I2C_transfer (i2c、&i2cTransaction))
{
返回0;
}
LOG_info0 ("fault");
RESET_FAULT();
return 1;
} 

侧注:在初始设置期间,我经常使用 Task_sleep()来处理读取和写入之间的延迟,这是否可能是一个问题?

在 SDA 被拉至低电平后、我在这里结束

void ide_run()
{
int i;

if (BIOS_smpEnabled = true){
UINT CoreID = Core_getid();
对于(i = 0;i < Idle_funclist.length;i++){
if (idle_coreList.elem[i]=CoreID){
idle_funclist.elem[i]();
}
}

否则{
对于(i = 0;i < Idle_funclist.length;i++){
idle_funclist.elem[i]();
}
}

请提供任何帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Chris:

    您使用的是 TI-RTOS 的哪个版本?

    您无需重新打开实例。 设置参数并使用它们打开后、您就可以开始了。

    他们的多个任务是否调用 i2c_bno055_read 和 i2c_bno055_write? 这应该是好的...只是尝试进行故障排除。

    您是否见过该导线上的什么?

    我假设缓冲区大小合适、因为它在您单步执行时起作用。

    是否可以附加已导出的示例项目?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是在项目中运行的唯一任务。

    e2e.ti.com/.../7635.i2c_5F00_test.zip


    ***** 编辑*****  四分之四算…
    感谢你的帮助

    我的 SDA 信号质量看起来很差、因此我更换了导线、将速度从400kHz 降低到100kHz、现在看起来工作正常

    让它运行大约5分钟、没有问题、数据看起来很完美。

    谢谢、只要知道某件事应该起作用、就能帮助我找出我的问题所在。

    一旦我获得更好的接线、我将再次尝试400kHz。