请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:TMS320F2.8377万S 我最初使用SPI中断从SPI接收数据。 此操作正常。
我正在尝试使用DMA切换到读取SPI C接收缓冲区。 DMA似乎没有将数据写入变量内存。
我配置了所有内容,在调试过程中,我可以看到指向内存中变量位置的阴影寄存器,但数据保持为零。
我还可以看到调试中到达SpicRegs.SPIRXBUF的数据。 RXFFST寄存器将增加或降低至RXFFIL级别。
它还可以正确触发设置为在DMA传输结束时触发的中断。
这是我的代码:
//DMA配置文件
#定义连拍 (FIFO_LVL-1)//突发大小应小于8#define
传输 0 //[(MEM_BUFFER_Size/Fifo_LVL)-1]
#define Fifo_LVL 二 // FIFO中断级别
易失性UINT16 *DMADest;
void DMA_init()
{
//
//初始化DMA
//
DMAInitialize();
DMADest =(volatile UINT16 *) RDATA;
DMACH1AddrConfig (DMADest,&SpicRegs.SPIRXBUF);
DMACH1BurstConfig (burst,0,1); //连拍大小,源码步长,目标步长
DMACH1TransferConfig (transfer,0,1); //传输大小,源步骤,目标步骤
DMACH1ModeConfig (DMA_SPICRX,PERINT_ENABLE,OneShot_DISABLE,CONT_ENABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,十六位,
chint_end,chint_enable);
}
//在ISR文件中中断
__interrupt void local_D_INTCH1_ISR(void){
EALLOW;//需要在ISR内执行EALLOW!!!
//DmaRegs.CH6.control.bit.halt = 1;
PieCtrlRegs.PIEACK.ALL |= PIEACK_group7;// ACK接收更多中断
//来自此饼图组
EDIS;
CPU2CLA_Vctrl =(签名长) RDATA[0];
//Vctrl_Test =(签名长) RDATA[0];
返回;
}
//全局文件中声明的变量
extern DEC volatile UINT16 RDATA[2];
编辑以包括SPI配置
//SPI配置
//SPICCR寄存器 SpicRegs.SPICCR.bit.SPISWRESET = 0; SpicRegs.SPICCR.bit.SPICHAR = 0xF;//16位字符 SpicRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性(数据在上升时钟边缘输出) //SPICCL Reigsters SpicRegs.SPICTL.bit.MASTER_SLAVE =0;//配置为从属设备以在SPISOMIA上传输 SpicRegs.SPICTL.bit.CLK_PHASE =0;//时钟相位,半周期偏移 SpicRegs.SPICTL.bit.Talk = 0;//通过SPI禁用数据传输 SpicRegs.SPICTL.bit.SPIINTENA = 0;//启用SPI中断 //SPIPRI寄存器 SpicRegs.SPIPRI.Bit.STEINV = 0; //SPISTE bar acitve low (低) SpicRegs.SPIPRI.Bit.TRIWIRE = 0;//正常4线操作 //SPICCR寄存器,用于启用高速模式(50MHz最大时钟) SpicRegs.SPICCR.bit.HS_MODE = 1; //SPIFFTX寄存器 SpicRegs.SPIFFTX.Bit.SPIFFENA = 1;//启用FIFO功能 //SPIFFRX寄存器 SpicRegs.SPIFFRX.bit.RXFFIENA = 1; //启用FIFO RX中断 SpicRegs.SPIFFRX.bit.RXFFIL = 0x2; 生成中断前收到的//2个字 //SPIBRR寄存器 SpicRegs.SPIBRR.All = 0;//将波特率设置为最大速率 SpicRegs.SPIFFTX.Bit.SPIRST = 1; SpicRegs.SPIFFTX.Bit.TXFIFO = 1; SpicRegs.SPIFFRX.Bit.RXFIFO = 1;//启用FIFO功能 SpicRegs.SPIFFTX.Bit.TXFFINTCLR = 1; SpicRegs.SPICCR.bit.SPISWRESET = 1;