工具/软件:Code Composer Studio
McBSP (SPI模式)用于使用DMA发送和接收132字节数据。 接收数据时出现问题。 有时,接收的第一个字节是总线上传输的字节;有时,第一个字节是随机 数据。 我 怀疑 在 传输开始时DRR1可能不是空的,然后 我尝试 通过在传输前读取来清除DRR1,但 它没有帮助。 下面是我的代码:
132字节传输完成后,通过以下方式关闭DMA:
EALLOW;
DmaRegs.CH1.control.bit.halt = 1;
DmaRegs.CH2.control.bit.halt = 1;
DmaRegs.CH1.control.bit.SOFTRESET = 1;
DmaRegs.CH2.control.bit.SOFTRESET = 1;
EDIS;
开始传输132字节:
EALLOW;
DmaRegs.CH1.SRC_wrap_size = 0xff;//在N个脉冲后自动换行源地址
DmaRegs.CH1.SRC_wrap_step =0;//源代码换行的步骤
DmaRegs.CH1.dst_wrap_size = 0xFFff;//在N个突发后包装目的地址
DmaRegs.CH1.DST_Wrap步骤= 0;//目标换行的步骤
EDIS;
EALLOW;
DmaRegs.CH2.SRC_wrap_size = 0xff;//在N个脉冲后自动换行源地址
DmaRegs.CH2.SRC_wrap_step =0;//源代码换行的步骤
DmaRegs.CH2.dst_wrap_size = 0xFFff;//在N个突发后包装目的地址
DmaRegs.CH2.dst_wrap_step =0;//目标自动换行的步骤
EDIS;
//通道1,McBSPA传输
EALLOW;
DmaRegs.CH1.SRC_beG_ADDR_shadow =(UINT32) src;
DmaRegs.CH1.SRC_ADDR_shadow = (UINT32) src;
DmaRegs.CH1.DST_beG_ADDR_shadow =(UINT32)(UINT16 *)&McbspaRegs.DXR1.all;
DmaRegs.CH1.DST_ADDR_shadow = (UINT32)(UINT16 *)&McbspaRegs.DXR1.all;
EDIS;
//通道2,McBSPA接收
EALLOW;
DmaRegs.CH2.SRC_beG_ADDR_shadow =(UINT32)&McbspaRegs.DR1.all;
DmaRegs.CH2.SRC_ADDR_shadow = (UINT32)&McbspaRegs.DR1.all;
DmaRegs.CH2.DST_beG_ADDR_shadow =(UINT32)(UINT16 *) DES;
DmaRegs.CH2.DST_ADDR_shadow = (UINT32)(UINT16 *) DES;
EDIS;
EALLOW;
DmaRegs.CH1.control.bit.run = 1;
DmaRegs.CH2.control.bit.run = 1;
EDIS;
//必须在DXR获得其值后设置frst,
//所以必须在启用DMA后设置frst。
EALLOW;
McbspaRegs.SPR2.bit.frst = 1;
EDIS;