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.

[参考译文] TM4C123GH6PM:SMBus

Guru**** 2610155 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/766769/tm4c123gh6pm-smbus

器件型号:TM4C123GH6PM

我正在尝试在 tm4c123gh下午6时通过 I2C 使用 SMBus。 我使用在 utils 用户指南中给出的示例代码。 但是、每次我调用任何函数从从 i2c 总线挂起进行读取或写入时。 是否有任何人可以从 SMBus 从设备读取或写入任何示例代码。 请帮帮我。

谢谢、此致、

Aman。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能更具体地说明软件在代码中的挂起位置吗? 如果您可以使用示波器或逻辑分析仪跟踪 I2C SCL 和 SDA 线路、也会非常有用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的克罗斯比先生:

    感谢您的回复。 这是我用于初始化和读取的代码。

    void SMBusInitonI2C (void){


    //
    //为 SMBus 主设备启用外设。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    //
    //为 I2C0配置所需的引脚。
    //
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB))


    GPIOPinConfigure (GPIO_PB2_I2C0SCL);
    GPIOPinConfigure (GPIO_PB3_I2C0SDA);
    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
    //
    //配置 IO 多路复用器,使 I2C0的 I2C 引脚位于 PB2/3上。
    //

    //
    //初始化主 SMBus 端口。
    //
    SMBusMasterInit (&g_sMaster、I2C0_BASE、SysCtlClockGet ());

    I2CIntRegister (GPIO_PORTB_BASE、SMBusMasterIntHandler);
    //启用主中断。
    //
    SMBusMasterIntEnable (&g_sMaster);
    I2CMasterEnable (I2C0_BASE);
    IntMasterEnable();

    U8_t readFromSlave (U8_t device_address、U8_t device_register){

    int i;

    SMBusPECEnable (&g_sMaster);

    返回状态= SMBusMasterByteWordRead (&g_sMaster、device_address、device_register、g_pucSlaveRxBuffer、2);
     UARTprintf ("状态:%d \r\n"、返回状态);

    对于(i=0;i<2;i++){

    UARTprintf ("%d \r\n"、g_pucSlaveRxBuffer[i]);

    返回0;

    当我调用 readFromSlave (slave_addr、RegVal)时、它打印0、UC 停止所有操作。

    此致、

    Aman。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从 SMBusMasterByteWordRead 返回的0是命令已启动的状态。 状态0为"SMBus_OK"。 您需要轮询以等待读取完成,方法是调用 SMBusStatusGet (),直到它返回"SMBus_transfer_complete",然后从缓冲区中读取数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:

    我也尝试过这种方法。 我认为它们在初始化中几乎没有问题。 调用 SMBusMasterByteWordRead()后,UC 停止所有其他函数。 比如卡在某个位置、然后 Wachdog 将其重置。

    此致、
    Aman。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在第一篇帖子中、您说它"打印0"。 在下一篇文章中、您告诉我它挂起了。 我很困惑。 代码在哪里挂起? 请仔细检查代码、具体告诉我代码的挂起位置。

    请描述您的硬件。 连接了什么 SMBus 从器件? 它使用的是 ARP 还是固定的从地址? 您是否按照我在第一篇文章中的要求在 I2C 总线线路上放置了示波器或逻辑分析仪?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此示例可能会有所帮助。

    /cfs-file/__key/communityserver-discussions-components-files/908/SMBus.zip

    //简单 SMBus 示例。 此示例使用两个 EK-TM4C123GXL LaunchPad。 I2C0
    //和引脚 PB2和 PB3都用于这两个 LaunchPad。 这些引脚必须连接
    在两个 LaunchPad 之间//并且必须具有公共接地。
    //两个引脚(SDA 和 SCL)必须有外部上拉电阻器。
    //
    //主控方发出 ByteWord 读取命令请求单个字节。
    //从器件用一个字节进行响应,该字节随着每个请求的增加而增加。
    

    这是前3个 I2C 总线事务的逻辑分析仪快照。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Bob。 你让我度过了美好的一天

    此致、
    阿曼