OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5975|回复: 6

SPI_DMA rx模式 接收数据求教

[复制链接]

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-5-7
在线时间
5 小时
发表于 2014-7-2 18:05:10 | 显示全部楼层 |阅读模式
5金钱
stm32m0 使用SPI-DMA RX接收数据,配置如下:
DMA_InitTypeDef   DMA_InitStructure;
NVIC_InitTypeDef  NVIC_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
  RCC_APB1PeriphClockCmd(A7130_SPI2, ENABLE); 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

//SPI2 RX DMA  将数据从外设读取到内部存储器中
DMA_DeInit(DMA1_Channel4); //
DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)RfBuf;
DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;//外设为源地址
//DMA_InitStructure.DMA_BufferSize         = 65;

DMA_InitStructure.DMA_BufferSize         = 64;
DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable; //传输时外设地址不自增
DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable; //内存自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设传输长度为8 bit
DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte; //内存传输长度为8 bit
DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal; //非循环采集
//DMA_InitStructure.DMA_Priority           = DMA_Priority_High; //优先级为中
DMA_InitStructure.DMA_Priority           = DMA_Priority_VeryHigh; //优先级为中
DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable; //非存储器到存储器模式
DMA_Init(DMA1_Channel4, &DMA_InitStructure);


DMA_ITConfig(DMA1_Channel4,DMA_IT_TC | DMA_IT_TE ,ENABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE); 
DMA_Cmd(DMA1_Channel4, DISABLE);



DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_ADDRESS;
// DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)A7130_READ_ADDR;

DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)&A7130_READ_ADDR;
// DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)&dummy;
DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralDST;
//DMA_InitStructure.DMA_BufferSize         = 65;

DMA_InitStructure.DMA_BufferSize         = 64;
DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
// DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;

DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority           = DMA_Priority_Low;
DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);

DMA_ITConfig(DMA1_Channel5,DMA_IT_TC | DMA_IT_TE,ENABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE); 
DMA_Cmd(DMA1_Channel5, DISABLE);

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

准备将接收的数据放到RfBuf数组中,在主函数中使能发送和接收,主要如下:

DMA_Cmd(DMA1_Channel5, DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel5,66);    //配置发送数据长度
DMA_Cmd(DMA1_Channel4, DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel4,64);   //配置接收数据长度

DMA_Cmd(DMA1_Channel5, ENABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx , ENABLE);
DMA_Cmd(DMA1_Channel4, ENABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);

现在的情况如下:SPI DMA 能收到数据,能放入RfBuf中,当每运行一次,数据的位置都在变化,
例如原本RfBuf的第一次收到的数据为
01,02,03,04.....第二次运行的时候就为00,00,00,01,02,03...第三次运行的时候就为00,00,01,02,03...
第四次运行的时候就为00,01,02,03... 第5次的时候为 01,02,03,04....

还有另外一个问题就是按道理来说,要使用DMA-RX接收数据,需要使用DMA-TX发送时钟,但我发送的时钟已经比接收时钟多两个字节了,却还是先进入发送完成中断先,难道DMA接收和发送的时钟不是同步的吗?

请指教,谢谢!



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-2 23:20:41 | 显示全部楼层
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-5-7
在线时间
5 小时
 楼主| 发表于 2014-7-3 08:11:21 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,你也帮顶,叫我情何以堪....我还有希望不..
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-3 23:42:16 | 显示全部楼层
回复【3楼】sinc_mark:
---------------------------------
等待高手出现.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-5-7
在线时间
5 小时
 楼主| 发表于 2014-7-4 13:50:22 | 显示全部楼层
折腾啊折腾,还只能折腾...
回复

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-4-15
在线时间
3 小时
发表于 2015-4-15 15:13:36 | 显示全部楼层

请问STM32F407 SPI1 DMA接收数据时,必须使能发送吗?

回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-5-7
在线时间
5 小时
 楼主| 发表于 2015-5-4 07:56:39 | 显示全部楼层
回复【6楼】wenzong:
---------------------------------
407不清楚,但051的接收还是发送(记不清楚了)是需要发送空时钟的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 05:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表