STC15系列单片机SPI功能详解及应用指南

初学STC15的硬件SPI可能会使用不当,这里直接介绍使用方法,(不使用中断)

SPI的特殊功能寄存器:

其中主要使用到的有SPCTL,SPSTAT,SPDAT。其他可按需求使用,这里不做介绍。

1.SPI控制寄存器SPCTL:

特别注意:对于容易出错的地方为SSIG位,SSIG = 0时会导致SIP不作为主机从而你的SPI操控不了外设。

如果SSIG为0是要使得为主机则需要P1.2引脚为高电平,否则为从机。具体作为从机还是主机的所有情况如下:

2.SPI状态寄存器SPSTA:

特别注意蓝色字体:“写1清零”。

3. SPI数据寄存器SPDAT

对该寄存器进行写操作时触发SPI传输

SPI时钟频率:

SPI的速率由单片机的主频以及状态寄存器的位0和1决定,如下:

代码:

初始化:

void SPI_Init()

{

    SPDAT = 0;                  // 初始化SPI数据

    SPSTAT = SPIF | WCOL;       // 清除SPI状态位

    SPCTL = SPEN | MSTR | SSIG; // 主机模式,忽略SS引脚

                                // IE2 |= ESPI; // 开启SPI中断

                                // EA = 1;

}

交换一个字节以及开始和停止:

void SPI_Start()

{

    SPISS = 0;

}



void SPI_Stop()

{

    SPISS = 1;

}



unsigned char SPI_Swap(unsigned char dat)

{

    SPDAT = dat; // 触发SPI发送数据

    while (!(SPSTAT & SPIF))

        ;                 // 等待发送完成

    SPSTAT = SPIF | WCOL; // 清除SPI状态位

    return SPDAT;         // 返回SPI数据

}

相关宏定义以及特俗功能寄存器定义:

sfr SPCTL = 0xCE;

#define SSIG 0x80 // SPCTL.7

#define SPEN 0x40 // SPCTL.6

#define DORD 0x20 // SPCTL.5

#define MSTR 0x10 // SPCTL.4

#define CPOL 0x08 // SPCTL.3

#define CPHA 0x04 // SPCTL.2



sfr SPSTAT = 0xCD;

#define SPIF 0x80 // SPSTAT.7

#define WCOL 0x40 // SPSTAT.6



#define SPDHH 0x00 // CPU_CLK/4

#define SPDH 0x01  // CPU_CLK/8

#define SPDL 0x02  // CPU_CLK/16

#define SPDLL 0x03 // CPU_CLK/32



sfr SPDAT = 0xCF; // SPI数据寄存器



sfr IE2 = 0xAF;

#define ESPI 0x02 // IE2.1



sfr IP2 = 0xB5;

sfr AUXR1 = 0xA2;



// SPI从机选择口, 连接到其它MCU的SS口

// 当SPI为一主多从模式时,

// 请使用主机的普通IO口连接到从机的SS口

sbit SPISS = P1 ^ 1;

作者:简子辉

物联沃分享整理
物联沃-IOTWORD物联网 » STC15系列单片机SPI功能详解及应用指南

发表评论