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.

[参考译文] TM4C1294NCPDT:TM4C1294NCPDT

Guru**** 2535150 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1167757/tm4c1294ncpdt-tm4c1294ncpdt

器件型号:TM4C1294NCPDT

尊敬的先生:

我使用的是 TM4C1294NCPDT TI 微控制器。 我们开发了软件,用于 使用 I2C 通信协议从微控制器读取输入。 每次上电序列时、输入读数为零、因此我们编写了如下代码:

if (SPI_CS_Test_03=1)

G_LSU_DigitalInput_01_Flags =~I2CReceive (g_LSU_DigitalInput_01_Slave_Address、g_DigitalInput_register);
G_LSU_DigitalInput_02_Flags =~I2CReceive"(g_LSU_DigitalInput_02_Slave_Address、g_DigitalInput_register);
SPI_CS_Test_03 = 0;

我们在主要逻辑中添加了这个例子。请尽快解决这个问题

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

    您好、Tom、

    很抱歉、当您很好地描述您对代码所做的事情时、我看不到有关具体错误的问题声明。

    此致、

    Ralph Jacobi

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

    您好、Ralph Jacobi、

    我正在使用 TN4C1294NCPDT 微控制器、在我们的硬件单元中、我们为一些应用添加了一些输入开关。 此输入开关 从 TCA9534APWR IO 扩展器 IC 连接。 我们连接了具有不同从器件地址的4个 IO 扩展器 IC。

    在上面的原理图中、中断引脚将连接到微控制器、我们编写代码如下所示:

    空 GPIOIntHandler (空)

    uint32_t ui32Status;
    ui32Status = GPIOIntStatus (GPIO_PORTQ_BASE、TRUE);
    GPIOIntClear (GPIO_PORTQ_BASE、GPIO_PIN_0);
    if ((((ui32Status & GPIO_PIN_0)>0))

    G_LSU_DigitalInput_01_Flags =~I2CReceive (g_LSU_DigitalInput_01_Slave_Address、g_DigitalInput_register);

    我们编写的代码与四个中断引脚的代码相同。
    I2C 读取序列为、

    uint8_t I2CReceive (uint32_t slave_addr、uint8_t reg)

    I2CMasterSlaveAddrSet (I2C1_base、slave_addr、false);
    I2CMasterDataPut (I2C1_base、reg);
    //I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_SEND_START);
    I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_SEND);
    while (I2CMasterBusy (I2C1_base));
    I2CMasterSlaveAddrSet (I2C1_base、slave_addr、true);
    I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_Receive);
    while (I2CMasterBusy (I2C1_base));
    返回 I2CMasterDataGet (I2C1_base);

    上述代码在运行序列期间工作正常。在加电序列中,我们可以使用两个边沿,因此无法检测到。

    GPIOPadConfigSet (GPIO_PORTP_BASE、(GPIO_PIN_5)、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
    IntRegister (INT_GPIOP5、RSU_01_GPIOIntHandler);
    GPIOIntTypeSet (GPIO_PORTP_BASE、GPIO_PIN_5、GPIO_Bot_Edges);
    GPIOIntEnable (GPIO_PORTP_BASE、GPIO_INT_PIN_5);

    因此、我们决定在加电期间读取 I2C 读取序列、在 该初始化部分中配置该 I2C 中断序列、以获取以下代码:

    void MasterController_Initialize (void)

    System_Control_Initialize();
    MasterController_StatusLED_Initialize();
    LSU_Drum_pluse_GPIO_Initialize();

    I2C_Initialize();
    IO_Expander Interrupt_Initialize();
    UART3_Initialize();

    G_LSU_DigitalInput_01_Flags =~I2CReceive (g_LSU_DigitalInput_01_Slave_Address、g_DigitalInput_register);
    G_LSU_DigitalInput_02_Flags =~I2CReceive"(g_LSU_DigitalInput_02_Slave_Address、g_DigitalInput_register);
    G_RSU_DigitalInput_01_Flags =~I2CReceive"(g_RSU_DigitalInput_01_Slave_Address、g_DigitalInput_register);
    G_RSU_DigitalInput_02_Flags =~I2CReceive"(g_RSU_DigitalInput_02_Slave_Address、g_DigitalInput_register);

    我们的要求是使用 I2C 读取序列读取正确的输入。

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

    您好、Tom、

    感谢您添加了详细信息并分享了该代码、实际上我想我在这里可以立即了解可能发生的情况、因为这是一款 TM4C1294器件。

    对于 TM4C1294 I2C、建议在 主模块传输数据的任何命令之后执行以下操作:

        //
        // Wait until master module is done transferring.
        // The I2C module has a delay in setting the Busy flag in the register so
        // there needs to be a delay before checking the Busy bit.  The below loops
        // wait until the Busy flag is set, and then wait until it is cleared to
        // indicate that the transaction is complete.  This can take up to 633 CPU
        // cycles @ 100 kbit I2C Baud Rate and 120 MHz System Clock.  Therefore, a
        // while loop is used instead of SysCtlDelay.
        //
        while(!MAP_I2CMasterBusy(I2C7_BASE))
        {
        }
        while(MAP_I2CMasterBusy(I2C7_BASE))
        {
        }

    因此、您应该将代码更新为如下所示:

    I2CMasterSlaveAddrSet(I2C1_BASE, slave_addr, false);
    I2CMasterDataPut(I2C1_BASE, reg);
    //I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_SEND);
    while(!MAP_I2CMasterBusy(I2C1_BASE));
    while(MAP_I2CMasterBusy(I2C1_BASE));
    I2CMasterSlaveAddrSet(I2C1_BASE, slave_addr, true);
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
    while(!MAP_I2CMasterBusy(I2C1_BASE));
    while(MAP_I2CMasterBusy(I2C1_BASE));
    return I2CMasterDataGet(I2C1_BASE);

    让我知道、这种调整是否能够单独解决问题、或者如果有更多问题、我们需要深入研究、以使其按预期工作。

    此致、

    Ralph Jacobi

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

    感谢您的快速响应。我在我的软件中尝试了上述代码、但是

    while (!map_I2CMasterBusy (I2C1_base));

    此命令在我们的驱动程序 library.it 中不可用、显示错误。 如何解决此问题?

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

    您好、Tom、

    很抱歉、当 您未对提供的代码使用映射调用时、我发送了具有映射 API 的代码。 只需从 I2CMasterBusy API 的前面删除 MAP_、它就可以编译。 映射 API 用于尝试和利用 TivaWare API 位于器件 ROM 中、但您需要添加正确的头文件以使用它们、这是触发编译错误的原因。

    此致、

    Ralph Jacobi