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.
大家好、
在 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; }
Jacobi 先生、您好、是的、我现在看到我在那里犯了错误、但这是在我测试和更改一些代码以查看错误时发生的。 但我的中断一点也不会被命中。 我查看了这份文档、但它对于如何将 MCU 配置为从器件和使用 FIFO 寄存器没有太多了解。
此外、如果我有两个 MCU 发送一些长度约为2-3字节的消息、那么如果我在没有 FIFO 的情况下进行此通信、可能会有一些指示 消息开始和结束的自定义标志吗?
此致、
是的、这是在配置完成后进行的、并且仍然没有输入数据。 下面是 接收到第一个字节时的屏幕截图、即使我设置 了触发器、它也会立即命中 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);