Part Number: F28377D-SEP
Other Parts Discussed in Thread: ADS7028, C2000WARE, SYSCONFIG
I wanted to read the 4 channels of ADS7028 though SPI and and store this data in DMA at every 10KHz PWM ISR. However, the SPI is not getting triggered as well as DMA. The CLK and CS are always low.
here is my code snippet - DMA bugffer in GSRAM
#pragma DATA_SECTION(sData, "ramgs0");
#pragma DATA_SECTION(rData, "ramgs0");
uint16_t sData[NUM_ADC_CHANNELS];
uint16_t rData[NUM_ADC_CHANNELS];
the main loop --
void main(void)
{
uint16_t i;
Device_init();
Device_initGPIO();
Interrupt_initModule();
Interrupt_initVectorTable();
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DMA);
DINT;
for(i=0; i<NUM_ADC_CHANNELS; i++) {
sData[i] = 0xAAAA;
rData[i] = 0x0000;
}
InitSystem();
InitSPI_and_ADS7028();
InitDMA();
Interrupt_register(INT_EPWM1, &INT_EPWM1_ISR);
Interrupt_register(INT_DMA_CH1, &INT_DMA_CH1_ISR);
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
InitEPWM_Trigger();
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
Interrupt_enable(INT_EPWM1);
Interrupt_enable(INT_DMA_CH1);
EINT;
ERTM;
while(1)
{
// Debug Loop
}
}
SPI and ADS7028 intialization --
void InitSPI_and_ADS7028(void)
{
SPI_disableModule(ADS_SPI_BASE);
SPI_setConfig(ADS_SPI_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1, SPI_MODE_MASTER, 1000000, 8);
SPI_enableModule(ADS_SPI_BASE);
SPI_disableFIFO(ADS_SPI_BASE);
ADS_Write(0x01, 0x01); // Reset Device
DEVICE_DELAY_US(10000);
// Register 0x12 (Sequence Select)
// To select Ch 1, 2, 3, 4:
// Binary: 0001 1110 = 0x1E
ADS_Write(0x12, 0x1E);
// Enable Auto Sequence Mode (Register 0x10 = 0x11)
ADS_Write(0x10, 0x11);
SPI_disableModule(ADS_SPI_BASE);
SPI_setConfig(ADS_SPI_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1, SPI_MODE_MASTER, ADS_SPI_SPEED, 16);
SPI_enableFIFO(ADS_SPI_BASE);
SPI_resetTxFIFO(ADS_SPI_BASE);
SPI_resetRxFIFO(ADS_SPI_BASE);
SPI_setFIFOInterruptLevel(ADS_SPI_BASE, SPI_FIFO_TX0, SPI_FIFO_RX1);
SPI_enableInterrupt(ADS_SPI_BASE, SPI_INT_TXFF | SPI_INT_RXFF);
SPI_enableModule(ADS_SPI_BASE);
}
DMA initialization --
void InitDMA(void)
{
DMA_initController();
// --- RX Channel (Ch1) ---
DMA_configAddresses(DMA_CH1_BASE, (const void *)rData, (const void *)(ADS_SPI_BASE + SPI_O_RXBUF));
DMA_configBurst(DMA_CH1_BASE, 1, 0, 1);
DMA_configTransfer(DMA_CH1_BASE, NUM_ADC_CHANNELS, 0, 0);
DMA_configMode(DMA_CH1_BASE, DMA_TRIGGER_SPICRX, DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_DISABLE | DMA_CFG_SIZE_16BIT);
DMA_setInterruptMode(DMA_CH1_BASE, DMA_INT_AT_END);
DMA_enableInterrupt(DMA_CH1_BASE);
DMA_enableTrigger(DMA_CH1_BASE);
// --- TX Channel (Ch2) ---
DMA_configAddresses(DMA_CH2_BASE, (const void *)(ADS_SPI_BASE + SPI_O_TXBUF), (const void *)sData);
DMA_configBurst(DMA_CH2_BASE, 1, 1, 0);
DMA_configTransfer(DMA_CH2_BASE, NUM_ADC_CHANNELS, 0, 0); DMA_configMode(DMA_CH2_BASE, DMA_TRIGGER_SPICTX, DMA_CFG_ONESHOT_ENABLE | DMA_CFG_CONTINUOUS_DISABLE | DMA_CFG_SIZE_16BIT);
DMA_enableTrigger(DMA_CH2_BASE);
}
Interrupt --
__interrupt void INT_EPWM1_ISR(void)
{
if(SPI_isBusy(ADS_SPI_BASE)) {
spi_error_count++;
EPWM_clearEventTriggerInterruptFlag(EPWM1_BASE);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
return;
}
epwm_isr_count++;
// Reset FIFOs
SPI_resetRxFIFO(ADS_SPI_BASE);
SPI_resetTxFIFO(ADS_SPI_BASE);
// Assert CS
GPIO_writePin(ADS_CS_GPIO, 0);
// Start DMA
DMA_startChannel(DMA_CH1_BASE);
DMA_startChannel(DMA_CH2_BASE);
// Force Trigger (Kickstart)
DMA_forceTrigger(DMA_CH2_BASE);
EPWM_clearEventTriggerInterruptFlag(EPWM1_BASE);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
}
__interrupt void INT_DMA_CH1_ISR(void)
{
int i;
uint16_t raw_data;
while(SPI_isBusy(ADS_SPI_BASE));
GPIO_writePin(ADS_CS_GPIO, 1);
dma_isr_count++;
for(i = 0; i < NUM_ADC_CHANNELS; i++) {
raw_data = rData[i];
adc_volts[i] = (float)((raw_data >> 4) & 0x0FFF) * (3.3f / 4096.0f);
}
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP7);
}
Kindly check if there is any timing issue or wrong initialization of the DMA using SPICTX.