第12章Cortex-M4-SPI-Bus
12.1 标准SPI-Bus简介
12.1.1 SPI-Bus简介
SPI(Serial Peripheral interface):是由Motorola公司开发的串行外围设备接口,是一种高速的,全双工,同步的通信总线。主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器等器件。
SPI总线的通信方式:同步串行全双工。
SPI总线的通信速度:10MHz以上~100MHz~(……)
12.1.1 SPI-Bus物理拓扑结构
- 五线制接口(四线制SPI)
MOSI:主出从入、MISO:主入从出、SCK:时钟线、CS:片选、GND:地线
全双工通信
- 四线制接口(三线制SPI)
IO:双向通信数据线、SCK:时钟线、CS:片选、GND:地线
半双工通信
- 物理拓扑结构
一主多从
依靠片选线去区分从设备,每增加一个从设备会增加一个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 }