大家好、
在 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; }