初学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;