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:I2C FIFO 有问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/751405/tm4c1294ncpdt-problem-with-i2c-fifo

器件型号:TM4C1294NCPDT

大家好、  

在 I2C 通信中将 TM4C1294配置为从器件时遇到问题。 在我的项目中、它与其他 MCU (相同类型)通信、后者是主 MCU。 我想将这个配置为从器件、当 FIFO 接收到特定数量的字节时、从器件将上升中断。 例如、我首先尝试使用2、但无法从 FIFO 读取数据。 在调试器中签入时、如果使用"非阻塞"进行读取、则值为0;如果使用阻塞功能进行读取、则代码块为0。 我想我没有很好地配置 MCU 外设。 当我使用单字节接收时、效果不错、但我宁愿使用 FIFO 、因为 MCU 之间传输的消息的长度将为2-3字节。 以下是我的从 MCU 代码:  

void I2C_Configuration ()
{
SysCtlPeripheralDisable (SYSCTL_Periph_I2C2);
SysCtlPeripheralReset (SYSCTL_Periph_I2C2);
SysCtlPeripheralEnable (SYSCTL_Periph_I2C2);
SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
while!SysCtlPeripheralReady (SYSCTL_Periph_I2C2)
GPIOPinConfigure (GPIO_PN4_I2C2SDA);
GPIOPinConfigure (GPIO_PN5_I2C2SCL);
GPIOPinTypeI2CSCL (GPIO_PORTN_BASE、GPIO_PIN_5);
GPIOPinTypeI2C (GPIO_PORTN_BASE、 GPIO_PIN_4);
I2CSlaveInit (I2C2_base、slave_address);
I2CSlaveIntEnable (I2C2_base);
I2CRxFIFOConfigSet (I2C2_base、 I2C_FIFO_CFG_RX_SLAVE | I2C_FIFO_CFG_RX_TRIG_2);
I2CRxFIFOFlush (I2C2_base);
I2CSlaveIntEnableEx (I2C2_base、(I2C_SLAVE_INT_RX_FIFO_REQ));
IntEnable (INT_I2C2);
I2CIntRegister (I2C2_base、I2C2SlaveIntHandler);
I2CSlaveEnable (I2C2_base);
}

void I2C2SlaveIntHandler (void)
{
uint32_t ui32I2CMasterInterruptStatus;
ui32I2CMasterInterruptStatus = I2CSlaveIntStatusEx (void);
I = uint32_I = uint32;uint2 Irupt0
= uint2 (uint2)= uint2 (uint2);uintuint2 i<2;i++)
{
I2CFIFDataGetNonBlocking (I2C2_base、&dat[i]);
}
I2CRxFIFOFlush (I2C2_base);
I2CSlaveIntClearEx (I2C0_BASE、 I2C_SLAVE_INT_RX_FIFO_REQ);
} 

这里是主 MCU 配置和写入函数

void I2C_Configuration ()
{
SysCtlPeripheralEnable (SYSCTL_Periph_I2C2);
SysCtlPeripheralReset (SYSCTL_Periph_I2C2);
SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
GPIOPinConfigure (GPIO_PN4_I2SDA);GPIOPinSCL_GPIOC2_GPIO5
;GPIO 配置(GPIOC2PN5)
GPIOPinTypeI2CSCL (GPIO_PORTN_BASE、GPIO_PIN_5);
GPIOPinTypeI2C (GPIO_PORTN_BASE、GPIO_PIN_4);
I2CMasterInitExpClk (I2C2_base、 G_ui32SysClock、false);
I2CMasterSlaveAddrSet (I2C2_base、slave_adr、false);
}

uint8_t I2CWriteData (uint8_t slave_addr、uint8_t dev_reg、uint8_t * dat、uint8_t count)
{
while (I2CMBusy (I2C2_base));

I2CMastereAddrSet (I2C2_base、slave_adt

);i=uint8_t;uint8

while (I2CMasterBusy (I2C2_base));
I2CMasterControl (I2C2_base、I2C_MASTER_CMD_BURST_SEND_START);

for (i=0;6i <count;  i++)
{
while (I2CMasterBusy (I2C2_base));
I2CMasterDataPut (I2C2_base、dat[i]);

if (i!=(count-1))
I2CMasterControl (I2C2_base、I2C_masterDataPut (I2C_masterCMD_burst_se_send_cont);
否则
I2CMasterControl (I2C2_base、I2C_MASTER_CMD_BURST_SEND_STOP);
}
while (I2CMasterBusy (I2C2_base));
return 1;
} 

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

    查看您的从器件代码、我不确定这是根本原因、但我发现您有错误的 I2C 基础用于中断清除:

    I2CSlaveIntClearEx (I2C0_BASE、I2C_SLAVE_INT_RX_FIFO_REQ);

    应为 I2C2_base。 看看这种更改是否有用。

    您是否还查看了我们的 I2C 应用手册以及软件示例? www.ti.com/.../spma073.pdf 您也可以在此处找到有关 I2C FIFO 的一些有用提示。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jacobi 先生、您好、是的、我现在看到我在那里犯了错误、但这是在我测试和更改一些代码以查看错误时发生的。 但我的中断一点也不会被命中。 我查看了这份文档、但它对于如何将 MCU 配置为从器件和使用 FIFO 寄存器没有太多了解。  

    此外、如果我有两个 MCU 发送一些长度约为2-3字节的消息、那么如果我在没有 FIFO 的情况下进行此通信、可能会有一些指示  消息开始和结束的自定义标志吗?  

    此致、

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

    您是否说过、如果您使用 I2CSlaveIntEnableEx (I2C2_base、I2C_SLAVE_INT_DATA)、那么当您使用 I2CSlaveIntEnableEx (I2C2_base、(I2C_SLAVE_INT_RX_FIFO_REQ)时、它将中断、但不会中断?

    是否可以从 CCS 中的寄存器浏览器窗口转储 I2C2从器件寄存器内容?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    蔡先生、您好!

    当数据被发送时、当我也使用 I2CSlaveIntEnableEx (I2C2_base、(I2C_SLAVE_INT_RX_FIFO_REQ)时、会发生中断。 但是、即使只发送一个字节、无论 I2C_FIFO_CFG_RX_TRIG 级别如何、也会发生这种情况、并且无法使用上述用于从 ISR 的代码读取数据、我仍然只能使用 I2CSlaveDataGet (I2C2_base)访问数据。 这是具有从器件设置的图像。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您何时获取了寄存器屏幕截图? 我建议您首先在 I2C2SlaveIntHandler 的开头放置一个断点。 我提出的原因是、根据您的屏幕截图、RXFIFO 为空、如 I2C FIFO 状态寄存器中所示、I2C_SRI 和 I2C_SMIS 均为零、表示没有设置中断标志。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、这是在配置完成后进行的、并且仍然没有输入数据。 下面是  接收到第一个字节时的屏幕截图、即使我设置 了触发器、它也会立即命中 ISR  4.

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

    您好!

     您具有以下代码序列、 在这里您首先调用 I2CSlaveIntEnable、然后再次调用 I2CSlaveIntEnableEx。 是否可以删除第一行。 在屏幕截图中、您是否同时启用了数据中断以及 RX FIFO 中断? 看看它是否会产生影响。  

    I2CSlaveIntEnable (I2C2_base);
    I2CRxFIFOConfigSet (I2C2_base、I2C_FIFO_CFG_RX_SLAVE | I2C_FIFO_CFG_RX_TRIG_2);
    I2CRxFIFOFlush (I2C2_base);
    I2CSlaveIntEnableEx (I2C2_base、(I2C_SLAVE_INT_RX_FIFO_REQ); 

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

    蔡先生、您好!  

    我曾尝试过、但在这种情况下、触发器根本没有触发、尽管我在数据寄存器中看到数据、但 FIFO 仍然为空。 这是寄存器视图。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我看不到您调用 I2CSlaveFIFOEnable 来为 I2C 从设备启用 FIFO。 在调用 I2CSLaveEnable 后、需要调用 I2CSlaveFIFOEnable。 请尝试以下操作。

    I2CSlaveEnable (I2C2_base);
    I2CSlaveFIFOEnable (I2C2_base、I2C_SLAVE_RX_FIFO_ENABLE);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、非常感谢、这解决了我的问题、您答对了。
    I2CSlaveIntEnable (I2C2_base);
    在配置函数中没有必要、我添加了
    I2CSlaveFIFOEnable (I2C2_base、I2C_SLAVE_RX_FIFO_ENABLE);
    现在、它会像应该那样触发。 非常感谢、很抱歉让您花时间。
    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您的问题得到解决。