Other Parts Discussed in Thread: TM4C1294NCPDT
When setting the I2C Bus 0 in loop back mode and using the DMA to transfer and receive data out messages across the I2C bus I never seeing the DMA shifting data into the FIFO.
To start the program I am initializing the DMA by:
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA); ROM_IntEnable(INT_UDMAERR); ROM_uDMAEnable(); ROM_uDMAControlBaseSet(pui8ControlTable); ROM_IntEnable(INT_UDMA); ROM_uDMAChannelAssign(UDMA_CH1_I2C0TX);
ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_USBEP1TX, UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK); //ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_USBEP1TX, UDMA_ATTR_USEBURST); ROM_uDMAChannelControlSet(UDMA_CHANNEL_I2S0TX | UDMA_PRI_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_4); ROM_uDMAChannelAssign(UDMA_CH0_I2C0RX); ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_USBEP1RX, UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT | (UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK)); ROM_uDMAChannelControlSet(UDMA_CHANNEL_USBEP1RX | UDMA_PRI_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_4); ROM_uDMAChannelControlSet(UDMA_CHANNEL_USBEP1RX | UDMA_ALT_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_4);
I then initialize the GPIO port for I2C and loop back mode by:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0); ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_I2C0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinConfigure(GPIO_PB2_I2C0SCL); GPIOPinConfigure(GPIO_PB3_I2C0SDA); GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2); GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3); IntEnable(INT_I2C0); HWREG(I2C0_BASE + I2C_O_MCR) |= 0x01; I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), false); I2CSlaveEnable(I2C0_BASE); I2CSlaveInit(I2C0_BASE, ADDRESS); I2CRxFIFOConfigSet(I2C0_BASE, (I2C_FIFO_CFG_RX_SLAVE_DMA | I2C_FIFO_CFG_RX_TRIG_8)); I2CMasterSlaveAddrSet(I2C0_BASE, ADDRESS, false); I2CMasterIntEnable(I2C0_BASE); I2CMasterTimeoutSet(I2C0_BASE, 0x7D); // 20 ms Timeout I2CTxFIFOConfigSet(I2C0_BASE, (I2C_FIFO_CFG_TX_MASTER_DMA | I2C_FIFO_CFG_TX_TRIG_1)); IntMasterEnable();
Then I setup and enable the RX DMA for Ping Pong Mode:
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_USBEP1RX | UDMA_PRI_SELECT, UDMA_MODE_PINGPONG, ((void *)(I2C0_BASE + I2C_O_FIFODATA)), g_ui8RxBuf, 1023); ROM_uDMAChannelTransferSet(UDMA_CHANNEL_USBEP1RX | UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, ((void *)(I2C0_BASE + I2C_O_FIFODATA)), g_ui8RxBufB, 1023); ROM_uDMAChannelEnable(UDMA_CHANNEL_USBEP1RX);
I then add data to my transmit buffer used for DMA and setup and run the I2C in Bust Transmit mode:
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_USBEP1TX | UDMA_PRI_SELECT, UDMA_MODE_BASIC, g_ui8TxBuf, ((void *)(I2C0_BASE + I2C_O_FIFODATA)), (dataToSend - 1)); ROM_uDMAChannelEnable(UDMA_CHANNEL_USBEP1TX); I2CMasterBurstLengthSet(I2C0_BASE, dataToSend); I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_FIFO_BURST_SEND_START);
After starting the Data being transmitted the Timeout is always reached with nothing in either one of the RX buffers. Is something missing in the setup before data transfers start?