主题中讨论的其他器件:ADS131E08、
工具/软件:Starterware
您好!
我将 ADS131E08 ADC (TIDA-0061)板与 AM3359 ICE 板(TMDXICE3359)相连。
ADC SPI 连接到 AM3359 SPI1实例。
ADC DRDY 引脚 IN 连接到 GPIO3引脚20、引脚20配置为下降沿中断。
在 GPIO ISR 中、我触发 SPI DMA 传输事件;在 SPI1 TX 和 RX DMA 完成事件中、我将 DMA RX 缓冲器传输到我的内部缓冲器。
我已将 Starterware SPI DMA 代码作为参考并使用 IAR ARM 编译器。
当我尝试读取 SPI1 DAM Rx 缓冲器时,第一次它显示 ADC 帧的值(8个 ADC 通道为3个状态字节和27个字节),但在下一次 DAM ISR 事件数据在 Rx 自助餐中不更新。
如果我注释要从 Rx 缓冲区中读取的代码、我可以在调试器观察窗口中看到 Rx 缓冲区中的数据正在更新。
我可以观察到在逻辑分析仪上更新 SPI 总线上的数据、但 Rx 缓冲器不会更新相同的数据。
我尝试启用和禁用高速缓存、但 Rx 缓冲器行为没有变化。
/* DMA 回拨例程*/
静态空回调(unsigned int tccNum、unsigned int status)
{
volatile static int samples=0、CHN=0、ADC_Channel_Buffer[8];
unsigned char Reset=1;
unsigned char *temp=NULL;
易失性静态特性 tempBuffer[30];
if (tccNum == MCSPI_TX_EVENT)
{
flagTx = 1;
/*禁用 McSPI 发送事件*/
McSPIDMADisable (SOC_SPI_1_regs、MCSPI_DMA_TX_EVENT、MCSPI_CH_NUM);
}
if (tccNum == MCSPI_RX_EVENT)
{
flagRx = 1;
/*禁用 McSPI 接收事件*/
McSPIDMADisable (SOC_SPI_1_regs、MCSPI_DMA_RX_EVENT、MCSPI_CH_NUM);
}
if ((flagTx ==1)&&(flagRx==1)&&(flagISR==1))
{
CHN=0;
memcpy (tempBuffer、ucptrRxBuff、30);
// for (int x=3;x<27;x=x+3)
//{
//ADC_Channel_Buffer[CHN]=0;
//ADC_Channel_Buffer[CHN]=(int)((((int) ucptrRxBuff[x][<24)|(((int) ucptrRxBuff[x+1])<16)|(((int) ucptrRxBuff[x+2]<8))/0xff);
//adc_Channel_Buffer[CHN]=(int)((((int) ucptrRxBuff<<24)|(((int) ucptrRxBuff+1)<<16)|((int) ucptrRxBuff[x+2]<8))/0xff);
//CHN++;
//}
// if (tempBuffer[0]!=rxBuffer[5])
// tempBuffer[0]= rxBuffer[5];
// temp=(unsigned char *)&rxBuffer[0];
/* for (int x=0;x<30;x++)
{
tempBuffer[x]=*temp;
temp++;
// tempBuffer[x]=rxBuffer[x];
rxBuffer[x]=0;
}*/
SmartSampling_MultiChannelResample (& SmartChannel[0]、(Int32*)&ADC_Channel_Buffer[0]、Reset);
if (SmartChannels[0].Buffer.ValuesInBuffer >0)
{
//传输数据
//假设没有故障
如果(样本数>31)
SA采样 值= 0;
for (int x=0;x<8;x++)
{
通道[x][samples]=0;
通道[x][samples]= ADC_Channel_Buffer[x];
}
Sample++;
}
McSPICSDeAssert (SOC_SPI_1_regs、MCSPI_CH_NUM);
McSPIChannelDisable (SOC_SPI_1_regs、MCSPI_CH_NUM);
GPIOPinIntEnable (GPIO_INST_BASE_ADD_CD、
GPIO_INT_LINE_1、
GPIO_CD_PIN_NUM%32);
标志 Tx=0;
flagRx=0;
标志 ISR=0;
RESET=0;
}
}
/*GPIO ISR */
/*
** GPIO 中断服务例程。
配置为从 ADC drdy 引脚输出
以 ADC 的 EOC 速率触发
*
extern unsigned char 标志 ISR;
空 GPIOIsr (空)
{
/*检查 GPIO 卡检测引脚的中断状态。 *
if (GPIOPinIntStatus (GPIO_INST_BASE_ADD_CD、
GPIO_INT_LINE_1、
GPIO_CD_PIN_NUM%32)和(1 << GPIO_CD_PIN_NUM%32)
{
/*清除 GPIO 卡检测引脚的中断状态。 *
GPIOPinIntClear (GPIO_INST_BASE_ADD_CD、
GPIO_INT_LINE_1、
GPIO_CD_PIN_NUM%32);
GPIOPinIntDisable (GPIO_INST_BASE_ADD_CD、
GPIO_INT_LINE_1、
GPIO_CD_PIN_NUM%32);
标志 ISR=1;
McSPITransfer_ISR (30);
}
/***** DMA 时
//gpioIsrFlag = 1;*
}
/*通道配置*/
/*用于 ISR 传输的 Init DMA
*
void ADC_Init_ISR_DAM (void)
{
无符号短长度= 0;
for (int i=0;i<35;i++)
txBuffer[i]=(0x00);
长度= 30;
/*为 EDMA 传输配置 McSPI 的闪存状态读取参数。*/
McSpiTxEdmaParamSet (MCSPI_TX_EVENT、MCSPI_TX_EVENT、txBuffer、
长度);
/*为 EDMA 接收配置 McSPI 的闪存状态读取参数。*/
McSpiRxEdmaParamSet (MCSPI_RX_EVENT、MCSPI_RX_EVENT、ucptrRxBuff、
长度、真);
/*注册 McSPI 的 Tx/Rx EDMA 事件的回调函数。*/
CB_Fxn[MCSPI_TX_EVENT]=回调(&B);
CB_Fxn[MCSPI_RX_EVENT]=回调(&B);
// McSPITransfer_ISR (24);
//McSPITransfer (length);
// IsADCBusy();
// return (rxBuffer[1]);
}
void McSPITransfer_ISR (无符号短长度)
{
/*使用要传输的数据长度设置字节数字段。*/
ADC_Init_ISR_DAM ();
flagTx = 0;
flagRx = 0;
McSPIWordCountSet (SOC_SPI_1_regs、长度);
/*强制 SPIEN 处于低状态。*/
McSPICSAssert (SOC_SPI_1_regs、MCSPI_CH_NUM);
/*为 McSPI 启用 Tx/Rx DMA 事件。 *
McSPIDMAEnable (SOC_SPI_1_regs、(MCSPI_DMA_RX_EVENT | MCSPI_DMA_TX_EVENT)、
MCSPI_CH_NUM);
/*启用 McSPI 通道进行通信。*/
McSPIChannelEnable (SOC_SPI_1_regs、MCSPI_CH_NUM);
INTCPS_EnableIRQ (SYS_INT_EDMACOMPINT);
//等待控制权从 ISR 返回。*/
// while ((0 = flagTx)||(flagRx = 0));
/*强制 SPIEN 处于高状态。*/
// McSPICSDeAssert (SOC_SPI_1_regs、MCSPI_CH_NUM);
/*禁用 McSPI 通道进行通信。*/
// McSPIChannelDisable (SOC_SPI_1_regs、MCSPI_CH_NUM);
}
/