STM32的SPI学习笔记
2017-12-15 08:56
267 查看
下面直接介绍SPI的STM32源码解析
GPIO_InitTypeDef GPIO_InitStructure;
//定义一个GPIO初始化的结构体变量
SPI_InitTypeDef SPI_InitStructure;
//定义一个SPI初始化的结构体变量
RCC_APB2PeriphClockCmd(
RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd(
RCC_APB1Periph_SPI2, ENABLE );
//开启对应引脚时钟和SPI的时钟,一般的STM32有两个SPI(硬件SPI)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//配置SPI相应的端口,为复用推挽输出
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
//上面程序时我做的一个测试将主机的MISO配置成输入,也是可行的,但是没弄懂他为什么都配置输出
GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//SPI在设置有几种模式,例如两线只读,1线只读,1线只写等,我们这里用的双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
//SPI通讯时分为主机和从机,这个根据需求设定,一般为主机
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
//通讯数据位,就是一次传输数据的个数,可以是16位,也可是八位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
//这个是SPI的四种模式选择,第一个空闲状态电平的高低,顾名思义即看总线不发数据时电平是为高,还是为低
//第二个是数据在第几个边沿采集,看CLK的跳变是在哪一个,以上这些需要根据时钟时序来进行分析,时序分析可以直接搜四种模式的区别,有详细介绍
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
//NSS引脚控制是由软件控制,还是硬件,大多数都是软件控制,这个原因是因为STM32自身存在缺陷(网上查找资料说的)
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
//这是SPI通讯的波特率,根据SPI通信时序图计算CLK的时钟周期长度,对应的转化为频率即可
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
//这个是设置SPI铜须数据是高位在前还是低位在前
SPI_InitStructure.SPI_CRCPolynomial = 7;
//这个是CRC校验计算的方式选择,一般没有用到可以注释掉
SPI_Init(SPI2, &SPI_InitStructure);
//使能SPI
SPI_Cmd(SPI2, ENABLE);
//开启SPI
SPI通讯中另一个需要注意的问题就是:SPI的MISO和MOSI,MISO是主设备数据输入,从设备数据输出,MOSI是主设备数据输出,从设备数据输入。即我们需要注意我们接线是,主机的MISO接从机的MISO,主机的MOSI接从机的MOSI。
GPIO_InitTypeDef GPIO_InitStructure;
//定义一个GPIO初始化的结构体变量
SPI_InitTypeDef SPI_InitStructure;
//定义一个SPI初始化的结构体变量
RCC_APB2PeriphClockCmd(
RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd(
RCC_APB1Periph_SPI2, ENABLE );
//开启对应引脚时钟和SPI的时钟,一般的STM32有两个SPI(硬件SPI)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//配置SPI相应的端口,为复用推挽输出
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
//上面程序时我做的一个测试将主机的MISO配置成输入,也是可行的,但是没弄懂他为什么都配置输出
GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//SPI在设置有几种模式,例如两线只读,1线只读,1线只写等,我们这里用的双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
//SPI通讯时分为主机和从机,这个根据需求设定,一般为主机
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
//通讯数据位,就是一次传输数据的个数,可以是16位,也可是八位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
//这个是SPI的四种模式选择,第一个空闲状态电平的高低,顾名思义即看总线不发数据时电平是为高,还是为低
//第二个是数据在第几个边沿采集,看CLK的跳变是在哪一个,以上这些需要根据时钟时序来进行分析,时序分析可以直接搜四种模式的区别,有详细介绍
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
//NSS引脚控制是由软件控制,还是硬件,大多数都是软件控制,这个原因是因为STM32自身存在缺陷(网上查找资料说的)
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
//这是SPI通讯的波特率,根据SPI通信时序图计算CLK的时钟周期长度,对应的转化为频率即可
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
//这个是设置SPI铜须数据是高位在前还是低位在前
SPI_InitStructure.SPI_CRCPolynomial = 7;
//这个是CRC校验计算的方式选择,一般没有用到可以注释掉
SPI_Init(SPI2, &SPI_InitStructure);
//使能SPI
SPI_Cmd(SPI2, ENABLE);
//开启SPI
SPI通讯中另一个需要注意的问题就是:SPI的MISO和MOSI,MISO是主设备数据输入,从设备数据输出,MOSI是主设备数据输出,从设备数据输入。即我们需要注意我们接线是,主机的MISO接从机的MISO,主机的MOSI接从机的MOSI。
相关文章推荐
- cortex_m3_stm32嵌入式学习笔记(二十一):SPI实验(通信总线)
- STM32学习笔记——SPI串行通讯(向原子哥学习)
- STM32-SPI实验学习笔记
- STM32 SPI学习笔记!
- STM32学习笔记之硬件SPI读写与极性设置
- stm32寄存器版学习笔记10 SPI
- stm32学习笔记 F1系列SPI
- STM32 SPI 学习笔记
- STM32学习笔记之SPI_DMA寄存器级操作
- STM32学习笔记 — 之GPIO端口篇
- STM32学习笔记3-IO配置输入输出
- STM32学习笔记:SysTick时钟
- SPI协议学习笔记
- UC/OS-II学习笔记--STM32移植
- STM32学习笔记:外部中断的使用
- stm32学习笔记——定时器(1)
- STM32学习笔记之正交编码器…
- stm32学习笔记——GPIO
- STM32待机模式学习笔记
- STM32学习笔记 — 之GPIO端口篇