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.

[参考译文] RM48L952:halcogen 生成的 RM48L952 i2c 驱动器所需的紧急帮助。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/593818/rm48l952-help-required-urgent-for-rm48l952-i2c-driver-is-not-working-generated-by-halcogen

器件型号:RM48L952
主题中讨论的其他器件:HALCOGENTMP112

 它将进入 void i2cSendByte (i2cBASE-t * i2c、uint8字节) 而((i2c->STR &(UINT32) I2C_TX_INT)== 0U) { }/*等待*/即使选择了中断也是如此。

PINMUX i2c 也被选中和取消选中。

外部10K 上拉电阻器已连接。

已尝试100kHz 和400kHz i2c 波特率仍然不起作用。

 

如果有人有工作代码、请分享。

 

 

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

    您是否应用了示波器来查看总线上发生的情况? 即、您是否收到任何到引脚的信号?

    您是否尝试过环回模式?

    请确保适当的设置不会与 PINMUX 选项卡中的冲突、并根据器件所在总线的所需波特率选择正确的波特率。 您是否观察过 SCL 线路、是否看到了适当的时钟速率?

    网络上其他设备的状态是什么? 请注意、在 I2C 中、SDA 线路被驱动为低电平并悬空为高电平(因此需要上拉电阻)。 如果总线上有另一个驱动为低电平的器件、则 Hercules 器件将无法在线路上进行通信。 这是 I2C 的一项功能、允许从器件延长时序、以适应网络上较慢的器件。

    有关您的应用程序的其他信息也很有用。 Hercules 器件是总线上的从器件主器件吗?

    您是否还了解了 Halcogen --> Help --> Examples 中提供的示例。 我认为、其中包含了用于主器件和从器件操作的 I2C 示例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们将基于 TMP112 I2C 的温度传感器连接到 Hercules RM48L952
    1)我尝试使用示波器时、我们在 SDA 和 SCL 线路上都没有获得信号。
    2)我尝试了环回它正在工作。
    3)我尝试了较低和较高的波特率。
    4) 4) I2C 网络上只有一个器件。
    5) 5)我们在 Hercules MCU 上运行是主器件、而 TMP112传感器是从器件。
    6) 6)还尝试使用 PINMUX I2C 外设检查和取消选中模式。 10k 上拉电阻器连接到 SDA 和 SCL 线路。
    7)使用 i2c 中断和轮询方法时、还会尝试在以下代码部分中挂起。

    它将进入由 Halcogen 生成的以下函数
    void i2cSendByte (i2cBASE-t * i2c、uint8字节)
    while ((i2c->STR &(UINT32) I2C_TX_INT)== 0U){}

    请参阅以下代码


    i2cInit();

    i2cSetOwnAdd (i2cREG1、Master_Address);

    i2cSetSlaveAdd (i2cREG1、Slave_Addr_write_tempSensor);//配置从器件的地址以与*/通信

    i2cSetDirection (i2cREG1、I2C_transmitter);//将方向设置为发送器*///*注意:可选-在 Init 中完成*/

    i2cSetMode (i2cREG1、I2C_MASTER);//将模式设置为 Master *

    i2cSetStart (i2cREG1);//启动传输的启动条件*/

    i2cSendByte (i2cREG1、Slave_Addr_WRITE_tempSensor);
    // while (i2cIsBusy (i2cREG1)== true);//等待总线忙被清除*/
    i2cSendByte (i2cREG1、CONFIG_BYTE1);
    i2cSendByte (i2cREG1、CONFIG_BYTE2);
    // i2cSetStop (i2cREG1);

    i2cClearSCD (i2cREG1);/*清除停止条件检测标志*/

    i2cSetDirection (i2cREG1、I2C_RECEIVER);
    i2cSetMode (i2cREG1、I2C_MASTER);//将模式设置为 Master *
    // for (delay=0;delay<1000000;delay++);//开始下一个块之前的简单延迟*////*取决于从站准备就绪的速度*/

    while (1)

    i2cSetStart (i2cREG1);
    i2cSendByte (i2cREG1、Slave_Addr_Read_tempSensor);

    // while (i2cIsBusy (i2cREG1)== true);//等待总线忙被清除*/
    i2cSendByte (i2cREG1、tempature_register);
    i2C_rcv_data=i2cReceiveByte (i2cREG1);
    i2C_rcv_data=i2cReceiveByte (i2cREG1);
    // i2cSetStop (i2cREG1);

    i2cClearSCD (i2cREG1);/*清除停止条件检测标志*/



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

    您好 Murali、

    [引用 user="Murali Prasad"]1)我尝试使用示波器时,没有在 SDA 和 SCL 线路上获得信号。
    2)我尝试了环回,它正在工作。[/引述]

    您使用了哪种回送类型? 数字还是模拟? 在这两种情况下、回送中的代码函数都指向硬件问题。 即、除 MCU 之外、其他器件正在驱动信号。 如果 Hercules 是主器件、它应该至少控制 SCL、所以这个信号应该计时。 如果这些信号始终被驱动为低电平、则会有某种情况以这种方式驱动它们(尝试断开外部器件并查看 SCL 发生了什么情况)。

    其他要点对您所看到的问题具有不同级别的标志。

    [引用用户="Murali Prasad"]3)我尝试使用较低和较高的波特率。[/引用]

    外部器件应定义要使用的波特率。 但是、由于您根本没有获得任何 SCL 输出、波特率选择与您目前的问题无关。

    [引用 USER="Murali Prasad]4) I2C 网络上只有一个器件。
    5) 5)我们在 Hercules MCU 上运行是主 器件、而 TMP112传感器是从器件。[/quot]

    您需要了解从器件 TMP112对信号线路的影响。 它是否会持续将其驱动为低电平? TMP112的接线是否存在问题? 它的拉动要求是什么?

    Murali Prasad 说:
    6)检查 PINMUX I2C 外设并尝试未检查的模式。 10k 上拉电阻器连接到 SDA 和 SCL 线路。[/QUERP]

    如果您使用的是 I2C 外设、则需要确保引脚具有适当的功能并且没有冲突。 检查配置页顶部列表中的 I2C 外设是主要步骤、但您应该确认也检查了 I2C SCL 和 SDA 线路。 此外、如果您使用的是 Launchpad、请仔细检查您正在使用的特定引脚(如引脚多路复用表中所述)是否与您在 Launchpad 上连接了温度传感器的位置相同。

    Murali Prasad 说:
    7)使用 i2c 中断和轮询方法时、仍会尝试在代码的以下部分挂起。

    由于您已声明软件在回送模式下工作、因此如果您的基本 I2C 代码中存在特定问题、并且您在 SDA 或 SCL 线路上看不到任何输出、我将对此表示怀疑、 还让我相信这是引脚多路复用配置问题或硬件连接问题。

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

    感谢您的回答。

    1) 1)我们使用了数字回路。
    2) 2) Pinmux 选择中没有冲突。
    3) TMP112 (TI 制造)支持100kHz 至2.85MHz 的速度、因此我们已经尝试了100kHz 和400kHz 的 I2C 标准波特率。
    4) 4) SDA 和 SCL 线路将处于高电平状态、因为我们使用10K 电阻器上拉。
    5) 5) I2C 读取和写入函数按照 TMP112波形/通信帧格式写入。
    6) 6)如果代码中存在任何偏差、请告知我。
    7) 7)我们已检查 TMP112电源输入是否正常。

    如果我们使用轮询方法并且中断、则固件也会在以下代码中挂起。

    void i2cSendByte (i2cBASE-t * i2c、uint8字节)


    /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
    while (((i2c->STR &(UINT32) I2C_TX_INT)== 0U) <<<< ---------------- 它会在这里被击中、

    }/*等待*/

    I2C->DXR =(uint32)字节;



    上面的注释@ while loop 说它是一个可能无限的循环、这就是 MCU 在这里挂起的原因。

    请帮助我们尽早解决问题、我们有项目截止日期。

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

    如果软件在环回模式下工作、您为什么会怀疑软件有任何问题? 为了进一步确认软件、您还可以尝试模拟回路模式、该模式还将运行器件的模拟缓冲器。

    请仔细检查您使用的电路板上的引脚。 I2C 功能位于引脚 B2和 C3 (J11扩展连接器上的引脚71和72)上。

    要交叉检查引脚多路复用器选择、您可以在非功能模式(GPIO 模式)下选择 I2C SDA 和 I2C SCL 线路、并通过软件或通过 CCS 中的直接寄存器操作来切换它们。 如果您在 C3和 B2引脚上看到信号发生变化、则 PINMUX 被正确设置。