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.

[参考译文] TM4C129ENCPDT:将 TivaWare 器件配置为 I2C/SMBus 从器件

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1202474/tm4c129encpdt-configure-tivaware-device-as-i2c-smbus-slave

器件型号:TM4C129ENCPDT

您好!

我正在使用TM4C129ENCPDT  Arm 芯片的平台上。 为了进行开发、我使用 EK-TM4C129EXL

此模块充当 I2C/SMBus 从器件、它将接收充当主器件的主机板的命令。 我的开发板将解析主器件发送给它的命令(以及任何参数)、并在必要时返回任何必要的数据。 为了进行测试、我尝试将器件设置为从模式、并连接 Analog Discovery 2以作为 I2C 主设备发送命令。 理想情况下、一旦从器件接收到 STOP 条件、就会发生中断、允许我从 Rx 缓冲区中提取消息的内容。  

我正在使用相应的软件 API 进行开发。  

在将 I2C 中断获取到 proc 时遇到问题。 我以前将 AD2用作主器件、因此我怀疑问题可能出在我的 C 代码中的某个位置(张贴在下面)。  

////////////////////////////////////////////////
// code in tm4c129encpdt_startup_ccs.c
extern void i2cIntHandler(void);
...
#pragma DATA_SECTION(g_pfnVectors, ".intvecs")
void (* const g_pfnVectors[])(void) =
{
    (void (*)(void))((uint32_t)&__STACK_TOP),
                                            // The initial stack pointer
    ResetISR,                               // The reset handler
    NmiSR,                                  // The NMI handler
    FaultISR,                               // The hard fault handler
    ...
    i2cIntHandler,                          // I2C0 Master and Slave
    ...
};
////////////////////////////////////////////////
////////////////////////////////////////////////
// code in init.c

#include "init.h"

#include <stdio.h>

#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"

void i2cIntHandler(void)
{
    uint8_t buffer[4] = {0};
    uint32_t x = 0u;

    x = I2CFIFODataGetNonBlocking(I2C0_BASE, buffer);

    uint32_t y = x;
}

void initSMBus(void)
{
    GPIOPinConfigure(GPIO_PB2_I2C0SCL);
    GPIOPinConfigure(GPIO_PB3_I2C0SDA);
    GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2); // configure SCL line
    GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);    // configure SDA line

    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C0));

    I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), false);

    I2CSlaveEnable(I2C0_BASE);
    I2CSlaveFIFOEnable(I2C0_BASE, I2C_SLAVE_RX_FIFO_ENABLE);
    I2CRxFIFOConfigSet(I2C0_BASE, I2C_FIFO_CFG_RX_SLAVE);

    uint8_t address = 0x12;
    I2CSlaveInit(I2C0_BASE, address);
    I2CSlaveAddressSet(I2C0_BASE, 0, address);

    I2CSlaveIntEnable(I2C0_BASE);
    I2CSlaveIntEnableEx(I2C0_BASE, I2C_SLAVE_INT_STOP);
    I2CIntRegister(I2C0_BASE, i2cIntHandler);
}

我还将附上 AD2设置的屏幕截图。  

对我的问题有什么想法吗? 我确信我的"主设备"已正确连接到开发套件。  

谢谢!

扎赫·夏普

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

    大家好、Zach、

    删除这个函数调用、因为它仅适用于 TM4C123x 器件:

    I2CSlaveIntEnable(I2C0_BASE);

    您还需要在 NVIC 级别启用中断:

    IntEnable(INT_I2C0);

    同样为确保确定性、也要确保使能主中断:

    IntMasterEnable();

    此致、

    拉尔夫·雅各比

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

    嗯、我仍然有问题。 我在系统中确实有其他中断正常工作(计时器和 ADC)、因此我知道主中断已启用。

    进一步调试后、上拉电阻似乎可能存在一些问题。 下面是初始化后的 I2C SCL 和 SDA 线路的示波器捕获、根据 I2C 协议应保持高电平。

    据我了解、以下 API 调用将为每条线路配置上拉电阻器、除非我对文档有误解。 这些函数来自 TivaWare 库 GPIO.c/.h 库文件。  

    void
    GPIOPinTypeI2CSCL(uint32_t ui32Port, uint8_t ui8Pins)
    {
        //
        // Check the arguments.
        //
        ASSERT(_GPIOBaseValid(ui32Port));
    
        //
        // Make the pin(s) be peripheral controlled.
        //
        GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_HW);
    
        //
        // Set the pad(s) for push-pull operation.
        //
        GPIOPadConfigSet(ui32Port, ui8Pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
    }
    
    void
    GPIOPinTypeI2C(uint32_t ui32Port, uint8_t ui8Pins)
    {
        //
        // Check the arguments.
        //
        ASSERT(_GPIOBaseValid(ui32Port));
    
        //
        // Make the pin(s) be peripheral controlled.
        //
        GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_HW);
    
        //
        // Set the pad(s) for open-drain operation with a weak pull-up.
        //
        GPIOPadConfigSet(ui32Port, ui8Pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_OD);
    }

    因此、我认为问题的根源在于上拉电阻器配置、但我不确定还需要在 SW 中执行哪些其他操作。 我想知道是否需要在 TM4C129ENCPDT  开发套件上安装跳线或0欧姆电阻器。

    感谢你的帮助。

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

    大家好、Zach、

    感谢您分享有关系统设置的详细信息。 下一个问题已经清楚了。

    TM4C MCU 上的内部上拉电阻器强度不足以用于 I2C 总线应用、这意味着:

    1. 您需要在引脚上使用外部上拉电阻器、I2C 才能正常运行。
    2. TivaWare I2C API 进行的操作  不会 配置上拉电阻器、避免 I2C 总线上存在并联电阻器降低总体电阻的情况。

    此致、

    拉尔夫·雅各比

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

    感谢您的快速响应。

    我将继续操作、并报告结果。

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

    好的! 添加外部上拉电阻解决了该问题、我将获得中断成功触发。 感谢您的帮助