对51系列单片机SPI总线的认识

来源:互联网 发布:李杰灵的淘宝店 编辑:程序博客网 时间:2024/06/09 20:19

* 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的下降沿开始,上升沿结束。

原创粉丝点击