一、原理
1、SPI介绍
1、SPI(Serial Peripheral Interface)是由Motorola公司开发的一种同步,全双工的通用数据总线。
2、四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)
3、支持总线挂载多设备(一主多从)。SPI通信线比较多,开销大。且SPI在通信中造成的资源浪费比较多。
2、硬件电路
所有设备必须供地。SCK完全由主机掌控。主机通过将各个SS线置低电平来选择从机地址,SS先有且只有一根线被置低。规定:当从机的SS引脚为高电平时,从机的MISO引脚必须为高阻态。
3、SPI原理——移位示意图
在SPI通信时,主机与从机要将交换的数据放到移位寄存器中。时钟由主机中的波特率发生器控制。
在一个时钟边沿跳变时,主机和从机都会输出,主机将要发送的数据的最高位放到通信线(输出数据寄存器)上。
在下一个时钟边沿跳变时,主机和从机都会采样输入,主机和从机一起把线上的数据存入移位寄存器的最低位。
4、SPI时序
1、起始条件和终止条件
2、交换字节
由CPOL和COHA寄存器控制交换的模式。
在常用的模式0中,空闲状态下SCL为低电平,当他第一个电平开始跳变的时候,主机和从机就要完成“读线”的操作。可在此之前“线”上并没有数据,因此其实在第一个上升沿之前,还有一个第0个跳变,在这个跳变中,主机和从机将数据放到“线”上。其他几个模式同理。
二、硬件SPI
1、SPI外设简介
2、SPI框图
接收缓冲区与发送缓冲区都用于接收和发送时数据的存储。当有数据要发出去时,先将高位数据放到发送缓冲区(TDR)中,然后检测到移位寄存器已经完成操作(检测TDRN标志位变化),将缓冲区数据放入移位寄存器中········发送和接收共用一个移位寄存器。
3、SPI的非连续传输模式![](https://img-blog.csdnimg.cn/e3914855c7774bfa8088cccf44960728.png)
第1步:等待TXE为1
第2步:写入发送的数据至TDR
第3步:等待RXNE为1
第4步:读取RDR接收的数据
三、代码实现SPI(CubeIDE)
将SPI2配置成motorola模式,传输8位数据,高位先行
时钟配置为4分频,传输速率为42.5M,CPOL = 0、CPHA = 0为模式0。
CRC校验的多项式不使用、使用软件NSS。
输出的GPIO口如上。
四、代码输出结果
后续分频系数调整为256分频,这样逻辑分析仪能抓取到
五、SPI中断收发
1、代码实现
2、任务结果
上面的是MISO,下面是MOSI