SPI2 DMA方式接受

SPI2 DMA方式接受

        这篇博文也是平时学习的整理总结吧!感觉自己记性不好,学习的东西不整理一下,以后用的时候还得查资料再次编辑。所以强迫自己养成个好的习惯,学完了总结整理一番,为自己,也方便需要的人。

spi_dma.h文件

#ifndef __SPI_DMA_H
#define __SPI_DMA_H

#include "stm32f10x.h"
#define SPI2_RxDataLength  5//宏定义接受数组长度
void SPI_DMA_Config(void);

#endif


spi_dma.c文件

#include "spi_dma.h"//从机DMA接受

uint16_t SPI2_RxBuf[SPI2_RxDataLength];

void SPI_DMA_Config(void)
{  	
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure;
DMA_InitTypeDef  DMA_Initstructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

/* 设置 SPI2 引脚: SCK, MISO 和 MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

DMA_DeInit(DMA1_Channel4);//SPI2对应的DMA通道数
DMA_Initstructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;//外设地址(u32)SPI2_DR_Address;
DMA_Initstructure.DMA_MemoryBaseAddr = (u32)SPI2_RxBuf;//内存地址,就是你想要把采样值存在那个变量的地址
DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralSRC ;//方向
DMA_Initstructure.DMA_BufferSize = 3;//开辟3个连续的DMA存储单元
DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable ;//外设地址不变
DMA_Initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable ;//内存地址自增
DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ;//设置外设数据长度为半字,即16位
DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;//设置DMA存储数据长度为半字,即16位
DMA_Initstructure.DMA_Mode = DMA_Mode_Circular ;//循环模式
DMA_Initstructure.DMA_Priority = DMA_Priority_VeryHigh ;//DMA优先级为高
DMA_Initstructure.DMA_M2M = DMA_M2M_Disable ;
DMA_Init(DMA1_Channel4 , &DMA_Initstructure  );
DMA_Cmd(DMA1_Channel4 , ENABLE );

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex ;//两线全双工的通讯模式 
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave ;//从机模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b ;//数据格式为2进制16位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//空闲时,时钟极性为低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二个时钟沿采集数据
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//配置NSS引脚为软件模式,一般一主一从的情况下用此模式
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2 ;//设置波特率分频值为2,即18Mhz。因为SPI2挂在低速时钟APB1上
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB ;//设置高位数据在先
SPI_InitStructure.SPI_CRCPolynomial = 7;//此处设置CRC校验中的多项式。本程序不用CRC校验,所以随便设了个值。
SPI_Init(SPI2 , &SPI_InitStructure  );

SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);//使能SPI DMA
SPI_Cmd(SPI2 , ENABLE);//使能SPI2
}

   用的时候只要在所引用的文件中声明外部变量即可,即extern  uint16_t SPI2_RxBuf[SPI2_RxDataLength];

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值