第12章Cortex-M4-SPI-Bus

12.1 标准SPI-Bus简介

12.1.1 SPI-Bus简介

SPI(Serial Peripheral interface):是由Motorola公司开发的串行外围设备接口,是一种高速的,全双工,同步的通信总线。主要应用在 EEPROMFLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器等器件。

SPI总线的通信方式:同步串行全双工。

SPI总线的通信速度:10MHz以上~100MHz~(……)

12.1.1 SPI-Bus物理拓扑结构

  1. 五线制接口(四线制SPI)

MOSI:主出从入、MISO:主入从出、SCK:时钟线、CS:片选GND:地线

全双工通信

  1. 四线制接口(三线制SPI)

IO:双向通信数据线、SCK:时钟线、CS:片选、GND:地线

半双工通信

  1. 物理拓扑结构

一主多从

依靠片选线去区分从设备,每增加一个从设备会增加一个IO口。

12.1.1 SPI-Bus通信格式

通信数据帧过程:

① 拉低片选线

② 产生上升沿让MOSI以及MISO准备数据

③ 产生下降沿让MOSI以及MISO发送并且接收数据

④ 完成一个字节数据以后

⑤ 拉高片

 能够满足模式0的一般会满足模式3;能够满足模式1的一般会满足模式2

Q

SPI总线的数据帧格式不固定,可以发送并且接收任意bit的数量。

 SPI发送过程或接收过程都可以暂停。

为了方便使用,很多情况下会将SPI总线数据格式转成一个字节发送并且接收。

SPI总线每发送一个bit必然会接收到一个bit数据。

 模拟SPI发送并且接收一个字节数据:

 1 /*
 2 函数功能:模拟SPI总线发送并且接收一个字节
 3 函数形参:需要发送的数据
 4 函数返回值:接收道的结果
 5 备注:通信速度:100MHz
 6 */
 7 u8 spi_send_and_recive_byte(u8 send_byte_data)
 8 {
 9     u8 recive_byte_data = 0;
10     u8 value = 0;
11     
12     CS = 0;
13     
14     //上升沿准备数据;下降沿发送并且接收数据
15     for(value = 0; value < 8; value++)
16     {
17         CLK = 1;//让主从设备准备数据
18         if(send_byte_data & (0x80 >> value))
19         {
20             MOSI = 1;
21         }
22         else
23         {
24             MOSI = 0;
25         }
26         CLK = 0;//让主从设备发送并且接收数据
27         recive_byte_data <<= 1;//把最高位及出去,空出最低位补0
28         recive_byte_data |= MISO;//然后最低位移移移,移到最高位
29     }
30     
31     CS = 1;
32 }
View Code
原文地址:https://www.cnblogs.com/zhouyuqing1024/p/11847067.html