21ic问答首页 - 使用McBSP模拟SPI进行收发数据,通过DMA怎么进行发送呢
使用McBSP模拟SPI进行收发数据,通过DMA怎么进行发送呢
我使用McBSP模拟SPI进行以太网CH395Q收发数据,通过DMA怎么配置了源地址和目的地址,源地址为我要发送的数据,目的地址为McbspaRegs.DXR1.all,那么接下来怎么样进行配置才能发送呢,还需要拉低片选使能和发送写命令吗
EALLOW;
/* 发送DMA初始化 */
DmaRegs.DMACTRL.bit.HARDRESET = 1; // 硬件复位
__asm(" NOP"); // Only 1 NOP needed per Design
DmaRegs.CH1.MODE.bit.CHINTE = 1; // 通道中断使能
DmaRegs.CH1.BURST_SIZE.all = 0; // 每次突发传输1+0个字
DmaRegs.CH1.SRC_BURST_STEP = 0; // 指定处理触发数据时递增/递减后的源地址步长
DmaRegs.CH1.DST_BURST_STEP = 0; // 指定处理触发数据时递增/递减后的目的地址步长
DmaRegs.CH1.TRANSFER_SIZE = 0; // 指定数据传输大小为1+0(每次突发传输的循环次数)
// 在接收到一些数据后移动下一个字到buffer中
DmaRegs.CH1.SRC_TRANSFER_STEP = 1; // 源传输步进寄存器(指针增/减步长)
DmaRegs.CH1.DST_TRANSFER_STEP = 0; // 目的传输步进寄存器(指针增/减步长)
DmaRegs.CH1.SRC_ADDR_SHADOW = (Uint32)&S_MCBSP_DMA.DMATxCash[0]; // 数据源地址影子寄存器
DmaRegs.CH1.SRC_BEG_ADDR_SHADOW = (Uint32)&S_MCBSP_DMA.DMATxCash[0]; // 数据源开始地址影子寄存器
DmaRegs.CH1.DST_ADDR_SHADOW = (Uint32)&McbspaRegs.DXR1.all; // 目的地址起始影子寄存器 = MCBSP数据传输寄存器位15-0
DmaRegs.CH1.DST_BEG_ADDR_SHADOW = (Uint32)&McbspaRegs.DXR1.all; // 目的地址起始影子寄存器 = MCBSP数据传输寄存器位15-0
DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1; // 外设中断清除
DmaRegs.CH1.CONTROL.bit.SYNCCLR = 1; // 清除同步标志位
DmaRegs.CH1.CONTROL.bit.ERRCLR = 1; // 清除同步错误标志位
DmaRegs.CH1.DST_WRAP_SIZE = 0xFFFF; // 目标换行大小寄存器
DmaRegs.CH1.SRC_WRAP_SIZE = 0xFFFF; // 源目标换行大小寄存器
DmaRegs.CH1.MODE.bit.SYNCE = 0; // 同步使能
DmaRegs.CH1.MODE.bit.SYNCSEL = 0; // 同步模式
DmaRegs.CH1.MODE.bit.CHINTE = 1; // 通道中断使能
DmaRegs.CH1.MODE.bit.CHINTMODE = 1; // 通道中断生成模式
DmaRegs.CH1.MODE.bit.PERINTE = 1; // 外设中断触发使能
DmaRegs.CH1.MODE.bit.PERINTSEL = DMA_MXEVTA; // 外设中断触发源
DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1; // 外设中断清除
DmaRegs.CH1.MODE.bit.CONTINUOUS = 1; // 写1重新初始化DMA,等待下次触发信号
DmaRegs.CH1.BURST_SIZE.all = 0;
DmaRegs.CH1.TRANSFER_SIZE = DataLen - 1;
DmaRegs.CH1.CONTROL.bit.RUN = 1;
EALLOW;
/* 发送DMA初始化 */
DmaRegs.DMACTRL.bit.HARDRESET = 1; // 硬件复位
__asm(" NOP"); // Only 1 NOP needed per Design
DmaRegs.CH1.MODE.bit.CHINTE = 1; // 通道中断使能
DmaRegs.CH1.BURST_SIZE.all = 0; // 每次突发传输1+0个字
DmaRegs.CH1.SRC_BURST_STEP = 0; // 指定处理触发数据时递增/递减后的源地址步长
DmaRegs.CH1.DST_BURST_STEP = 0; // 指定处理触发数据时递增/递减后的目的地址步长
DmaRegs.CH1.TRANSFER_SIZE = 0; // 指定数据传输大小为1+0(每次突发传输的循环次数)
// 在接收到一些数据后移动下一个字到buffer中
DmaRegs.CH1.SRC_TRANSFER_STEP = 1; // 源传输步进寄存器(指针增/减步长)
DmaRegs.CH1.DST_TRANSFER_STEP = 0; // 目的传输步进寄存器(指针增/减步长)
DmaRegs.CH1.SRC_ADDR_SHADOW = (Uint32)&S_MCBSP_DMA.DMATxCash[0]; // 数据源地址影子寄存器
DmaRegs.CH1.SRC_BEG_ADDR_SHADOW = (Uint32)&S_MCBSP_DMA.DMATxCash[0]; // 数据源开始地址影子寄存器
DmaRegs.CH1.DST_ADDR_SHADOW = (Uint32)&McbspaRegs.DXR1.all; // 目的地址起始影子寄存器 = MCBSP数据传输寄存器位15-0
DmaRegs.CH1.DST_BEG_ADDR_SHADOW = (Uint32)&McbspaRegs.DXR1.all; // 目的地址起始影子寄存器 = MCBSP数据传输寄存器位15-0
DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1; // 外设中断清除
DmaRegs.CH1.CONTROL.bit.SYNCCLR = 1; // 清除同步标志位
DmaRegs.CH1.CONTROL.bit.ERRCLR = 1; // 清除同步错误标志位
DmaRegs.CH1.DST_WRAP_SIZE = 0xFFFF; // 目标换行大小寄存器
DmaRegs.CH1.SRC_WRAP_SIZE = 0xFFFF; // 源目标换行大小寄存器
DmaRegs.CH1.MODE.bit.SYNCE = 0; // 同步使能
DmaRegs.CH1.MODE.bit.SYNCSEL = 0; // 同步模式
DmaRegs.CH1.MODE.bit.CHINTE = 1; // 通道中断使能
DmaRegs.CH1.MODE.bit.CHINTMODE = 1; // 通道中断生成模式
DmaRegs.CH1.MODE.bit.PERINTE = 1; // 外设中断触发使能
DmaRegs.CH1.MODE.bit.PERINTSEL = DMA_MXEVTA; // 外设中断触发源
DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1; // 外设中断清除
DmaRegs.CH1.MODE.bit.CONTINUOUS = 1; // 写1重新初始化DMA,等待下次触发信号
DmaRegs.CH1.BURST_SIZE.all = 0;
DmaRegs.CH1.TRANSFER_SIZE = DataLen - 1;
DmaRegs.CH1.CONTROL.bit.RUN = 1;
您需要登录后才可以回复 登录 | 注册