SPI时序详解

demi的头像

SPI四种模式详解图解及源码:

SPI时序详解

//SPI的模式1:
u8 SPI_ReadWriteOneByte(u8 tx_data)
{
	u8 i,rx_data=0;
	SCK=0; //空闲电平(默认初始化情况)
	for(i=0;i<8;i++)
	{
		/*1. 主机发送一位数据*/
		SCK=0;//告诉从机,主机将要发送数据
		if(tx_data&0x80)MOSI=1; //发送数据
		else MOSI=0;
		SCK=1; //告诉从机,主机数据发送完毕
		tx_data<<=1; //继续发送下一位
		
		/*2. 主机接收一位数据*/
		rx_data<<=1; //默认认为接收到0
		if(MISO)rx_data|=0x01;
	}
	SCK=0; //恢复空闲电平
	return rx_data;
}
 
//SPI的模式2:
u8 SPI_ReadWriteOneByte(u8 tx_data)
{
	u8 i,rx_data=0;
	SCK=0; //空闲电平(默认初始化情况)
	for(i=0;i<8;i++)
	{
		/*1. 主机发送一位数据*/
		SCK=1;//告诉从机,主机将要发送数据
		if(tx_data&0x80)MOSI=1; //发送数据
		else MOSI=0;
		SCK=0; //告诉从机,主机数据发送完毕
		tx_data<<=1; //继续发送下一位
		
		/*2. 主机接收一位数据*/
		rx_data<<=1; //默认认为接收到0
		if(MISO)rx_data|=0x01;
	}
	SCK=0; //恢复空闲电平
	return rx_data;
}
 
//SPI的模式3:
u8 SPI_ReadWriteOneByte(u8 tx_data)
{
	u8 i,rx_data=0;
	SCK=1; //空闲电平(默认初始化情况)
	for(i=0;i<8;i++)
	{
		/*1. 主机发送一位数据*/
		SCK=1;//告诉从机,主机将要发送数据
		if(tx_data&0x80)MOSI=1; //发送数据
		else MOSI=0;
		SCK=0; //告诉从机,主机数据发送完毕
		tx_data<<=1; //继续发送下一位
		
		/*2. 主机接收一位数据*/
		rx_data<<=1; //默认认为接收到0
		if(MISO)rx_data|=0x01;
	}
	SCK=1; //恢复空闲电平
	return rx_data;
}
 
//SPI的模式4:
u8 SPI_ReadWriteOneByte(u8 tx_data)
{
	u8 i,rx_data=0;
	SCK=1; //空闲电平(默认初始化情况)
	for(i=0;i<8;i++)
	{
		/*1. 主机发送一位数据*/
		SCK=0;//告诉从机,主机将要发送数据
		if(tx_data&0x80)MOSI=1; //发送数据
		else MOSI=0;
		SCK=1; //告诉从机,主机数据发送完毕
		tx_data<<=1; //继续发送下一位
		
		/*2. 主机接收一位数据*/
		rx_data<<=1; //默认认为接收到0
		if(MISO)rx_data|=0x01;
	}
	SCK=1; //恢复空闲电平
	return rx_data;
}

版权声明:本文为CSDN博主「void*_」的原创文章,
遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36612961/article/details/89349880