设计STM32内部硬件外设的表都得参考引脚定义表。
SCK-----CLK
MISO----DO
MOSI----D
VCC(电路的供电电压)---3.3V
GND---GND
常用非连续化输出方案
由软件实线改为硬件实现功能时基于通信层的业务代码不需要更改,代码经过封装后仅需考虑调用实现即可。
硬件SPI的代码分为两部分
第一部分-----SPI外设的初始化代码
SPI初始化的流程
1.开启时钟开启GPIO和SPI的时钟
2.初始化GPIO口
其中SCK和MOSI是由硬件外设控制的输出信号,所以配置为复用推挽输出
补----------------------------------------------------------------推挽输出可以输出高,低电平,连接数字器件;
推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度
复用推挽输出,此时IO受内部外设控制,比如定时器的PWM,比如SPI的MOSI,MISO等。 而普通的推挽输出,则IO受ODR控制。
MISO是硬件外设的输入信号可以配置为上拉输入(输入设备有多个不存在复用输入)普通IO口可以输入,外设也可以输入。
a-----------SS是软件控制的输出信号,配置为通用推挽输出
b--------------SCK和MOSI是由硬件外设控制的输出信号,所以配置为复用推挽输出
补----------------------------------------------------------------推挽输出可以输出高,低电平,连接数字器件;
推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度
复用推挽输出,此时IO受内部外设控制,比如定时器的PWM,比如SPI的MOSI,MISO等。 而普通的推挽输出,则IO受ODR控制。
先查定义图,找到对应引脚
c------- MISO是硬件外设的输入信号可以配置为上拉输入(输入设备有多个不存在复用输入)普通IO口可以输入,外设也可以输入。
3.配置SPI外设
使用结构体选参数,调用之前的底层代码SPI_Init,其中的8位16位数据帧、高位先行、低位先行、SPI模式、主从机选择等。
初始化函数第一个参数是SPI1,参数第二个是初始化结构体,用&把结构体的地址传递给了初始化函数,根据结构体的参数自动配置相应寄存器。
上面是结构体变量变量名SPI_InitStructture.
结构体说明:
1 SPI_MODE决定当前设备是SPI的主机MASTER还是从机SLIVE
2 SPI_DIRECTON配置SPI裁剪引脚的功能。全双工半双工之类
3 SPI_DATASIZE配置数据帧
4 FRIST BIT配置高低位先行-------MSB高位先行----ISB低位先行
5 BAUDRATE-波特率预分频器------------------2到256的分频系数分频外设时钟得时钟频率
6 SPI_CPOL时钟极性------High/Low高低电平----CPOL=1/0
7 SPI_CPHA时钟相位规定第一个边沿开始采样还是第二个边沿开始采样,采样=输出
8 SPI_NSS模式,有硬件NSS和软件两种形式
9 SPI_CRC一般填默认值7,不用过多了解
4.开关控制
调用SPI_CMD,给SPI使能。单片机中的使能通常指的是控制某个器件或模块的开关信号。触发对应器件或模块。
注,开启SPI后还要调用函数默认给SS置高电平,不选中从机
第二部分---SPI操作时序交换一个字节的流程
调用交换字节的函数,硬件的SPI外设就会自动控制SCK,MOSI,MISO这三个引脚生成时序。
1.等待TXE为1发送寄存器为空
调用函数
注意后面加daly函数,图片没加
2.软件写入数据至SPI_DR
3.只需等待RXNE出现即可,RXNE为1了,进入第四步
4.读取DR,从RDR中读出交换接收数据,并返回
注意:TXE 和RXNE这两者并不需要我们手动清除硬件会自动清除。
至此硬件SPI读写完成