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.

[参考译文] LAUNCHTXL-F2.8069万M:Motorware中的I2C通信问题。

Guru**** 2574265 points
Other Parts Discussed in Thread: MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/642863/launchxl-f28069m-i2c-communication-issue-in-motorware

部件号:LAUNCHTXL-F2.8069万M
主题中讨论的其他部件:MOTORWARE

大家好,

我一直在尝试在Motorware Instaspin实验室中使用上述UC进行I2C通信。

我在网上找到了I2C驱动程序,我认为我有能力写入数据。 不幸的是,成功的好坏参半。 有时我根本无法在I2C线路上获得任何输出,有时它工作正常,奇怪的是,从字节和数据字节中的位会被一个向右移动。 在做了各种更改后,我甚至可以更长时间地得到这些信息。 I2C线路保持较高。

我认为设置代码正常工作,问题出在我的写入功能。 如果我注释掉,设备将不再处于"空闲"状态,电机将正常运行。 查看寄存器时(它们没有变化),I2CSTR为0x0420,MDR寄存器为0x0220。 我认为唯一值得注意的是SCD位已设置。

我将包括我更改的所有文件(hal,i2c等),以防它们有所帮助。 e2e.ti.com/.../I2CCode.zip

以下是写功能,因为我认为它是罪魁祸首:

void accel_Write(HAL_Handle halHandle, uint16_t register_add, uint16_t data ){


While (I2C_ISMasterBusy (halHandle->i2cHandle));
I2C_clearStopConditionDetection (halHandle->i2cHandle);
While (I2C_ISMasterStopBitSet (halHandle->i2cHandle));


while (!((I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_Bits)));
//如果出现nack,SCL保持在低位,STP位被清除
如果( I2C_isNoAck(halHandle->i2cHandle))
{
I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
}
I2c_putData(halHandle->i2cHandle, register_add);
I2C_MasterControl (halHandle->i2cHandle,I2C_Control_Single_TX,0,2);
//while (I2C_ISMasterBusy (halHandle->i2cHandle));

// while (!(I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_bits))));
//如果一个nisack/Handle/被清除

,则出现2I2I2I2Handle/I2I2_I2lle (I2hallle,且I2I2I2scle/清除了I2sclle (I2sHandlle
I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
// I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
//}//
I2C_putData(halHandle->i2cHandle, register_add);

while (!((I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_Bits)));
//如果出现nack,SCL保持在低位,STP位被清除
如果( I2C_isNoAck(halHandle->i2cHandle))
{
I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
}
I2C_putData (halHandle->i2cHandle,数据);

while (!((I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_Bits)));
//如果出现nack,SCL保持在低位,STP位被清除
如果( I2C_isNoAck(halHandle->i2cHandle))
{
I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
}


while (!I2C_isStopConditionDetected(halHandle->i2cHandle));
}// Accel_Write()函数结束 

While循环是确保数据在就绪时加载到输出移位寄存器并处理nacks的结果。

如果您能为您提供帮助,我将不胜感激。  

谢谢!

Joshua Russell

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

    更新:我已更新,设法在I2C线路上恢复输出。 以下是我的更新代码:

    void accel_Write(HAL_Handle halHandle, uint16_t register_add, uint16_t data ){//
    I2C_enable(halHandle->i2cHandle);
    //
    While (I2C_ISMasterBusy (halHandle->i2cHandle));
    I2C_clearStopConditionDetection (halHandle->i2cHandle);
    I2C_ISMasterStopBitSet (halHandle->i2cHandle));
    
    
    // while (!(I2C_getStatus(halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_bits| I2CSTR_ARDY_bits));//
    如果已清除了一个nisack/Handlle/
    处理数(Handl/I2_I2cle),
    则清除了I2_I2I2_I2I2_I2_I2cle
    I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
    // I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
    //}
    //I2C_DISABLE (halHandle->i2cHandle);
    I2C_MasterControl (halHandle->i2cHandle,I2C_Control_Single_TX,0,2);
    
    
    while (!((I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_Bits)));
    //如果出现nack,SCL保持在低位,STP位被清除
    如果( I2C_isNoAck(halHandle->i2cHandle))
    {
    I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
    I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
    返回;
    }
    I2c_putData(halHandle->i2cHandle, register_add);
    
    while (!((I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_Bits)));
    //如果出现nack,SCL保持在低位,STP位被清除
    如果( I2C_isNoAck(halHandle->i2cHandle))
    {
    I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
    I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
    返回;
    }
    I2C_putData (halHandle->i2cHandle,数据);
    
    while (!((I2C_getStatus (halHandle->i2cHandle)&(I2C_I2CSTR_XRDY_BITS | I2CSTR_ARDY_Bits)));
    //如果出现nack,SCL保持在低位,STP位被清除
    如果( I2C_isNoAck(halHandle->i2cHandle))
    {
    I2C_setMasterStopBit(halHandle->i2cHandle);//将STP发送到端传输
    I2C_clearNoAckBit(halHandle->i2cHandle); //清除nack位
    返回;
    }
    
    I2C_setMasterStopBit(halHandle->i2cHandle);
    
    while (!I2C_isStopConditionDetected(halHandle->i2cHandle));
    }// Accel_Write()函数结束 

    下面是我的输出的屏幕截图。 奇怪的是,大多数时候我都在左边得到结果。 这几乎是正确的,但所有的位似乎都被一个向右移动。 我相信原因是启动条件保持时间太短。 我不知道如何操纵这种情况。  

    右侧是我希望看到的内容。 第一个“菱形”表示较长的启动条件,最后两个表示“Ack”和“Stop”位。  

    代码如上所述进行更新后,大多数数据帧显示在左侧,其中奇数帧正确无误。  

    如果我在函数中注释掉前3行代码(while busy / clearSCD/isStpbitset行),我将设法获得几乎正确的输出。 除了没有Stop位,发出的前两个写入显示在左侧。  

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

    Joushua您好!

    在简要概述初始化和写入功能时,我看不到任何必要的突出内容。 您能否确认SYSCLK以90Mhz的速比运行? 这是为了确认您的I2C模块时钟在下面的设置是否正确:

    // I2CCLK = SYSCLK/(I2CPSC+1)
    //预分频器-模块上需要7-12 MHz clk bitTimeLow = 10,bitTimeHigh = 5
    I2C_setupClock(obj->i2cHandle, 9, 76, 38);//I2C_prescaler, I2C_BITIMELOW, I2C_BITTIMEHIGH); 

    我相信您看到所有数据都移到了左边显示的数据集中的右边1位是正确的。 这似乎是由下面突出显示的SCL blip引起的,其中创建了额外的0位:

    某种原因导致SCL线在很短的时间内变低。 您多久会看到此问题? MCU不应导致这种情况,因为这不是真正的SCL时钟周期(即似乎与设置的时钟特性不匹配或在其他SCL周期中看到的时钟特性不匹配)。

    我建议进一步调查此问题,确保您的连接都是安全的。 如果可能,甚至可以在不同的I2C波形分析仪上进行测试。

    希望这能有所帮助,

    Kevin

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

    我设法改变了时钟寄存器的值,这样它们就会产生一个50 % 50 % Low时间,并且周期是100kHz,我用我的逻辑分析器检查了这个频率,所以我相信主板的运行速度是90MHz。

    SCL问题非常零散,并且没有真正的一致性。 有时,通过关闭然后再打开主板来实现(有时是"固定"的)。 我已仔细检查连接。

    我继续写一个函数,它可以通过I2C读取一个字节。 信号看起来如预期,(写入,Sub_Addr+W,重新启动,Sub_Addr+R, 数据)。 然后,开始/位移再次出现。 但它正在检索的数据仍然正确。 这让我最初认为这是我的逻辑分析仪的问题,但现在我考虑了这一点,我也可以看到其他可能的问题,例如由于定时要求,从设备看不到短寿命启动条件。 我将使用不同的逻辑分析器进行仔细检查,然后从那里开始。

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

    你好,Joshua,

    我认为这是个好主意。 这可能是导致I2C不同步的另一个原因,但我认为这是一个很好的起点。 您的信号分析仪也可能捕获不是全时钟脉冲的东西,不 会实际导致I2C总线损坏。

    100kHz是最大I2C标准模式时钟频率。 某些从属设备(不支持快速模式)无法在高于100kHz的频率下读取/写入,有时可能会拉伸时钟以保持同步。

    请注意,我们的设备具有0.6 Us最小保留时间,以满足(最高)快速模式规格。

    查看从属设备是否准确接收正确的数据可能值得查看是否实际发生了位错误。

    最佳,

    Kevin