* UART、 I2C 和 SPI 是单片机系统中最常用的三种通信协议。*
1、SPI简介:
SPI 是一种高速的、全双工、同步通信总线,标准的 SPI 也仅仅使用 4 个引脚,常用于单片机和 EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。 SPI 通信原理比 I2C要简单,它主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的 SPI 是 4 根线,分别是 SSEL( 片选,也写作 SCS)、 SCLK( 时钟,也写作 SCK)、 MOSI( 主机输出从机输入Master Output/Slave Input) 和 MISO( 主机输入从机输出 Master Input/Slave Output)。
SSEL:从设备片选使能信号。如果从设备是低电平使能的话,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通信。
SCLK:时钟信号,由主机产生,和 I2C通信的 SCL 有点类似。
MOSI:主机给从机发送指令或者数据的通道。
MISO:主机读取从机的状态或者数据的通道。
2、程序设计
发送一个字节
void SPISendByte(unsigned char ch)
{
unsigned char idata n = 8; //向SDA上发送一位数据字节,共八位
SCLK = 1 ; //时钟置高
SSEL = 0 ; //选择从机
while(n--)
{
delayNOP();
SCLK = 0 ; //时钟置低
if((ch & 0x80) == 0x80) //若要发送的数据最高位为1则发送位1
{
MOSI = 1; //传送位1
}
else
{
MOSI = 0; //否则传送位0
}
delayNOP();
ch = ch << 1; //数据左移一位
SCLK = 1 ; //时钟置高
}
}
接收一个字节
unsigned char SPIreceiveByte()
{
unsigned char idata n = 8; // 从MISO线上读取一上数据字节,共八位
unsigned char tdata;
SCLK = 1; //时钟为高
SSEL = 0; //选择从机
while(n--)
{
delayNOP();
SCLK = 0; //时钟为低
delayNOP();
tdata = tdata << 1; // 左移一位,或_crol_(temp,1)
if(MISO == 1)
{
tdata = tdata | 0x01;
}// 若接收到的位为1,则数据的最后一位置1
else
{
tdata = tdata & 0xfe;
}// 否则数据的最后一位置0
SCLK = 1;
}
return(tdata);
}
每次开始,时钟线SCLK都为高电平,MISO是数据接收位,先接受最高位,通过左移8次,得到数据,MOSI是数据发送位,先发送数据最高位。
数据的发送和接收都是在SCLK=0;与SCLK=1;语句之间执行,即:
SCLK = 0;
数据的收发与移位
SCLK = 1;
即数据的收发都是以SCLK的下降沿开始,上升沿结束。
---------------------
作者:浊之清
来源:CSDN
原文:https://blog.csdn.net/qq_34706280/article/details/78702106
版权声明:本文为博主原创文章,转载请附上博文链接!
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』