SPI通信协议时序

目录

简介:

一、SPI 硬件接线

二、SPI 4种工作模式时序

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

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

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

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

三、GPIO软件模拟SPI模式0


说明:本文介绍常用的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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值