在线时间17 小时
UID347708
注册时间2012-3-16
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 330
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2015-1-26 09:20:51
|
显示全部楼层
本帖最后由 冰水混合物-347708 于 2015-1-26 09:40 编辑
谢谢,第一个问题和第二个问题明白了,但是我现在必须使用软件触发,因为需要在中断中判断是否要进行DMA传输,所以只能用软件触发,我使用软件触发,在进行内存到内存的传输是ok的,但是我需要将数据从内存传输到SPI0的数据寄存器PUSHR,修改配置之后发现,SPI1的接收有点问题,请问有什么方法可以验证SPI0的数据发送时没有问题的啊?我现在只能通过SPI1接收然后打印出来看,但是我总觉得应该是接收那块有问题,我把我的DMA的配置发您看看,DMA0通过软件触发,DMA1通过SPI1的接收触发,运行结果是DMA0的major loop完成了触发了中断,DMA1的major loop没有完成,即没有触发中断,打印出来传输正确的数据也只有前5个数据(总共24个数据,大小96字节),您看有什么错误没:
//DMA0初始化
DMA_InitTypeDef dma0_init_struct;
//DMA参数配置
memset(&dma0_init_struct, 0, sizeof(dma0_init_struct));
dma0_init_struct.DMA_CHx = DMA_CH0; //CH0通道
dma0_init_struct.DMA_Req = 0; //触发源关闭
dma0_init_struct.DMA_MajorLoopCnt = 1; //主循环计数值
dma0_init_struct.DMA_MinorByteCnt = 96; //次循环传输的字节数
dma0_init_struct.DMA_SourceAddr = (uint32_t)&info; //源地址
dma0_init_struct.DMA_SourceAddrOffset = 4; //源地址偏移:每次读入增加n字节
dma0_init_struct.DMA_SourceDataSize = DMA_SRC_32BIT;//源地址数据宽度
dma0_init_struct.DMA_LastSourceAddrAdj = -96; //配置源数据地址在主循环完成后的调整量
dma0_init_struct.DMA_DestAddr = (uint32_t)&SPI0->PUSHR; //目的地址
// dma0_init_struct.DMA_DestAddr = (uint32_t)dest;
dma0_init_struct.DMA_DestAddrOffset = 0; //目的地址偏移:每次写入增加0
dma0_init_struct.DMA_DestDataSize = DMA_SRC_32BIT; //目的地址数据宽度
dma0_init_struct.DMA_LastDestAddrAdj = 0; //配置目的数据地址在主循环完成后的调整量
dma0_init_struct.DMA_AutoDisableReq = TRUE; //自动禁用请求
dma0_init_struct.DMA_Isr = DMA0_Isr;
dma0_init_struct.DMA_MajorCompleteIntEnable = TRUE;
//初始化DMA
DMA_Init(dma0_init_struct);
DMA_EnableIrq(dma0_init_struct);
DMA_EnableReq(DMA_CH0);
//DMA1初始化
DMA_InitTypeDef dma1_init_struct;
//DMA参数配置
memset(&dma1_init_struct, 0, sizeof(dma1_init_struct));
dma1_init_struct.DMA_CHx = DMA_CH1; //CH0通道
dma1_init_struct.DMA_Req = SPI1_REV_DMAREQ; //SPI0_TRAN_DMAREQ为触发源
dma1_init_struct.DMA_MajorLoopCnt = 24; //主循环计数值
dma1_init_struct.DMA_MinorByteCnt = 4; //次循环传输的字节数
dma1_init_struct.DMA_SourceAddr = (uint32_t)&SPI1->POPR; //源地址
dma1_init_struct.DMA_SourceAddrOffset = 0; //源地址偏移:每次读入增加n字节
dma1_init_struct.DMA_SourceDataSize = DMA_SRC_32BIT;//源地址数据宽度
dma1_init_struct.DMA_LastSourceAddrAdj = 0; //配置源数据地址在主循环完成后的调整量
dma1_init_struct.DMA_DestAddr = (uint32_t)&dest;
dma1_init_struct.DMA_DestAddrOffset = 4; //目的地址偏移:每次读入增加4
dma1_init_struct.DMA_DestDataSize = DMA_SRC_32BIT; //目的地址数据宽度
dma1_init_struct.DMA_LastDestAddrAdj = -96; //配置目的数据地址在主循环完成后的调整量
dma1_init_struct.DMA_AutoDisableReq = TRUE; //自动禁用请求
dma1_init_struct.DMA_Isr = DMA1_Isr;
dma1_init_struct.DMA_MajorCompleteIntEnable = TRUE;
//初始化DMA
DMA_Init(dma1_init_struct);
DMA_EnableIrq(dma1_init_struct);
DMA_EnableReq(DMA_CH1);
还有个问题就是之前问的:如果我设置软件触发,多次传输,那么如何重新激活DMA?(问题中红色英文描述)
Use explicit software re-activation. In this option, the DMA is configured to transfer
the data using both minor and major loops, but the processor is required to re-activate
the channel (by writing to the DMA registers) after every minor loop. For this option,
the DMA channel should be disabled in the DMA channel MUX.
|
|