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