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.

[参考译文] TMS320F28035:I2C 在 F28035上不工作

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/794057/tms320f28035-i2c-does-not-work-on-f28035

器件型号:TMS320F28035

大家好、

我的客户正在 F28035上开发 I2C EEPROM 代码。

当他们使用我们的示例代码时、一切都正常。 但是、如果它们切换到自己的 I2C 代码、SCL 和 SDA 都会始终保持高电平状态。

随附的文件是它们的 I2C 初始化和 I2C 函数代码:

void Class_I2CDrv::Drv_I2CInit (void)

Int16 i16_Temp;

I2caRegs.I2CSAR = 0x50;  

I2caRegs.I2CPSC.all = 5;
I2caRegs.I2CCLKL = 10;  
I2caRegs.I2CCLKH=5;

I2caRegs.I2CIER.ALL = 0x0000;  
I2caRegs.I2CMDR.ALL = 0x0020;  
I2caRegs.I2CFFTX.ALL = 0x6000;  
I2caRegs.I2CFFRX.ALL = 0x2040;  

m_i16_Pagewields = 32;

对于(i16_Temp = 0;i16_Temp < 10000;i16_Temp++)  

asm (" rpt #99||nop");

void Class_I2CDrv::Drv_I2CRead (UINT16 U16_Addr、Int16 i16_Num、UINT16 *pDest)

int16 i16_Temp0、i16_Temp1、i16_Temp2、i16_DataCnt;
uint16 u16_DataL、u16_DataH;  

i16_DataCnt = i16_Num << 1;


I2caRegs.I2CCNT = 2;  
I2caRegs.I2CDXR = U16_Addr >> 8;
I2caRegs.I2CDXR = U16_Addr & 0x00FF;
I2caRegs.I2CMDR.ALL = 0x6620;

i16_Temp1 = 0;
while (I2cRegs.I2CSTR.bit.ARDY!= 1)  

i16_Temp1++;

IF (i16_Temp1 > 5000)

返回;  


I2caRegs.I2CCNT = i16_DataCnt;
I2caRegs.I2CMDR.ALL = 0x6C20;

i16_Temp2 = 0;
while (I2caRegs.I2CMDR.bit.STP==1)

i16_Temp2++;

IF (i16_Temp2 > 5000)

返回;

对于(i16_Temp0 = 0;i16_Temp0 < i16_Num;i16_Temp0 ++)

U16_DataH = I2caRegs.I2CDRR;
U16_DataL = I2caRegs.I2CDRR;

*(pDest + i16_Temp0)=(U16_DataH << 8)| U16_DataL;/


I2caRegs.I2CSTR.bit.ARDY = 1;  
//test EEPROM read cnt
objFaultRecord.testEEPROMRad++;
if (objFaultRecord.testEEPROMRad>60000)

objFaultRecord.testEEPROMRead= 60000;

//test EEPROM read cnt

它们只是将读取函数放置在主 while (1)循环中、并且无法观察 IO 上的任何内容。

请帮助确定问题。

此致、

Brian

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

    您好 Brian、

    它们是否为 I2C 正确配置 GPIO、您能否共享其代码的这一部分? 在调试代码时、代码是否会卡在某个位置? 可以通过暂停执行来检查这一点。

    在开始通过 I2C 写入之前、他们应该检查 STP 位是否被清零、以及总线是否不忙:

    //
    //等待 STP 位从任何之前的主设备通信中清零。
    //模块清除该位的操作被延迟到 SCD 位之后
    //设置。 如果在启动新消息之前未选中此位
    // I2C 可能会被混淆。
    //
    IF (I2caRegs.I2CMDR.bit.STP==1)
    {
    返回 I2C_STP_NOT _READY_ERROR;
    }
    
    //
    //检查总线是否占线
    //
    IF (I2cRegs.I2CSTR.bit.BB = 1)
    {
    返回 I2C_BUS_BUS_BUSY_ERROR;
    } 

    您是否确定在总线上看不到任何内容? 这是如何测试的? 根据该代码、我预计会发生一些活动、至少是要发送的从器件地址。

    最棒的

    Kevin

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

    是的、他们在 I2C 代码之前肯定已经配置了 GPIO。 它们使用示波器观察输出引脚、SDA 和 SCL 都保持高电平。 有时、可以观察到一个 SCL 下降沿、然后它切换回高电平。

    这不应是硬件问题、因为我们的示例代码运行良好。 我也很奇怪、他们不能观察到引脚上的任何东西、这就是我请你们帮忙的原因。

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

    您提供的代码片段集成了多个超时。 发生这些超时时时时、I2C 模块是否正在复位(I2CMDR.BIT.IRS 设置为0、然后设为1)? 如果是、这可能是这些问题的原因。

    要进一步调试代码、应注释掉这些超时。 然后、他们可以查看代码是否卡在某个位置。

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

    您能否更具体地说明什么是"集成超时"?

    最好在我发布的代码中直接指出。

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

    您好 Brian、

    当然。 我将讨论当递增变量达到特定值时返回的 if 语句。 在整个代码中有几个这样的代码:

    i16_Temp2++;
    
    if (i16_Temp2 > 5000)
    {
    return;
    } 

    最棒的

    Kevin