Other Parts Discussed in Thread: C2000WARE, ADS7028, SYSCONFIG
器件型号: F28377D-SEP
主题中讨论的其他器件: ADS7028、C2000WARE、 SysConfig
我想通过 SPI 读取 ADS7028 的 4 个通道、并以每个 10kHz PWM ISR 将这些数据存储在 DMA 中。 但是、SPI 没有像 DMA 一样被触发。 CLK 和 CS 始终为低电平。
这是我的代码片段 — GSRAM 中的 DMA 缓冲器
#pragma DATA_SECTION (sData、“ramgs0")“);
pragma DATA_SECTION (Rdata、“ramgs0")“);
uint16_t sData[NUM_ADC_channels];
uint16_t RDATA[NUM_ADC_channels];
主循环--
void main (void)
{
uint16_t i;
设备初始化 ();
device_initGPIO();
interrupt_initModule();
Interrupt_initVectorTable();
SysCtl_enablePeripheral (SYSCTL_PERIPH_CLK_DMA);
DINT;
对于 (I=0;I<NUM_ADC_CHANNES;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)
{
//调试循环
}
}
SPI 和 ADS7028 初始化--
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);//复位器件
device_delay_US (10000);
//寄存器 0x12(序列选择)
//选择通道 1、2、3、4:
//二进制:0001 1110 = 0x1E
ADS_Write (0x12、0x1E);
//启用自动序列模式(寄存器 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_setFIFO InterruptLevel (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 初始化--
void InitDMA (void)
{
dma_initController();
//-- RX 通道 (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_CHANNES、0、0);
DMA_configMode (DMA_CH1_BASE、DMA_TRIGGER_SPICRX、DMA_CFG_OneShot_DISABLE | DMA_CFG_CONTINULE_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 通道 (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_CHANNES、0、0); DMA_configMode (DMA_CH2_BASE、 DMA_TRIGGER_SPICTX、DMA_CFG_OneShot_enable | DMA_CFG_CONTINUE_DISABLE | DMA_CFG_SIZE_16BIT);
DMA_enableTrigger (DMA_CH2_BASE);
}
中断--
__中断无效 INT_EPWM1_ISR (void)
{
if (SPI_isBusy (ADS_SPI_BASE)){
SPI_ERROR_COUNT++;
EPWM_clearEventTriggerInterruptFlag (EPWM1_BASE);
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_GROUP3);
返回;
}
EPWM_ISR_COUNT++;
//重置 FIFO
SPI_resetRxFIFO (ADS_SPI_BASE);
SPI_resetTxFIFO (ADS_SPI_BASE);
//将 CS 置为有效
GPIO_writePin (ADS_CS_GPIO、0);
//启动 DMA
DMA_startChannel (DMA_CH1_BASE);
DMA_startChannel (DMA_CH2_BASE);
//强制触发器 (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++;
对于 (I = 0;I < NUM_ADC_CHANNES;I++){
RAW_DATA = RDATA[i];
ADC_VOLTS[i]=(float)((RAW_DATA >> 4) 且 0x0FFF)*(3.3f / 4096.0f);
}
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group7);
}
请使用 SPICTX 检查 DMA 是否存在任何时序问题或初始化错误。