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;
}

猜你喜欢

转载自blog.csdn.net/qq_36612961/article/details/89349880