目录
说明:本文介绍常用的4线SPI协议
简介:
SPI(Serial Perripheral Interface,串行外围设备接口)由 Motorola 公司提出,是一种高速、全双工、同步通信总线。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备。
一、SPI 硬件接线
SPI硬件接线如图:

4根引脚功能:
- CS/SS(Slave Select/Chip Select):片选信号线,用于选择需要进行通信的从设备;
- SCK(Serial Clock):串行时钟信号,为 SPI 通信提供时钟;
- MOSI/SDO(Master Out Slave In/Serial Data Output):主输出从输入;
- MISO/SDI(Master In Slave Out/Serial Data Input):主输入从输出;
二、SPI 4种工作模式时序
SPI通过时钟极性(CPOL)和时钟相位(CPHA)的搭配得到 Mode0-3 共四种工作模式:

- CPOL=0,串行时钟空闲状态为低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿;
- CPOL=1,串行时钟空闲状态为高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿;
- CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据
- CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据;
4种工作模式时序图解:

1、模式0:CPOL= 0,CPHA=0
SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换


2、模式1:CPOL= 0,CPHA=1

3、模式2:CPOL= 1,CPHA=0

4、模式3:CPOL= 1,CPHA=1

三、GPIO软件模拟SPI模式0
GPIO软件模拟SPI模式0,CPOL= 0,CPHA=0,串行时钟空闲状态为低电平,串行时钟的第一个跳变沿(上升沿)采集数据。
代码如下:
/* STM32 gpio模拟spi模式0 */
/* SCLK引脚 - PB3 */
#define SCK_0() GPIOB->BSRRH = GPIO_Pin_3
#define SCK_1() GPIOB->BSRRL = GPIO_Pin_3
/* MOSI引脚 - PB4 */
#define MOSI_0() GPIOB->BSRRH = GPIO_Pin_5
#define MOSI_1() GPIOB->BSRRL = GPIO_Pin_5
/* 判断MISO引脚 - PB5 */
#define MISO_IS_HIGH() (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == Bit_SET)
/*
*********************************************************************************************************
* 函 数 名: bsp_SpiDelay
* 功能说明: 时序延迟
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_spiDelay(void)
{
/*
延迟5时, F407 (168MHz主频) GPIO模拟,实测 SCK 周期 = 480ns (大约2M)
*/
for (i = 0; i < 5; i++);
}
/*
*********************************************************************************************************
* 函 数 名: bsp_soft_spiWrite
* 功能说明: gpio模拟spi模式0,向SPI总线发送一个字节。SCK上升沿采集数据, SCK空闲时为低电平。
* 形 参: _ucByte:spi发送1个字节
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_soft_spiWrite(uint8_t _ucByte)
{
uint8_t i;
for(i = 0; i < 8; i++)
{
if (_ucByte & 0x80)
{
MOSI_1();
}
else
{
MOSI_0();
}
bsp_spiDelay();
SCK_1();
_ucByte <<= 1;
bsp_spiDelay();
SCK_0();
}
bsp_spiDelay();
}
/*
*********************************************************************************************************
* 函 数 名: bsp_soft_spiRead
* 功能说明: gpio模拟spi模式0,从SPI总线接收8个bit数据。 SCK上升沿采集数据, SCK空闲时为低电平。
* 形 参: 无
* 返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t bsp_soft_spiRead(void)
{
uint8_t i;
uint8_t read = 0;
for (i = 0; i < 8; i++)
{
read = read<<1;
if (MISO_IS_HIGH())
{
read++;
}
SCK_1();
bsp_spiDelay();
SCK_0();
bsp_spiDelay();
}
return read;
}

7万+

被折叠的 条评论
为什么被折叠?



