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

 

  • 15
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值