SPI通讯以STC15W4K58S4为例
串行口主要用于单片机与计算机和其它单片机进行通讯,SPI主要用于单片机与外围芯片之间的通讯。
例如:可以和DS1302芯片进行数据通讯,与SD卡进行通讯,与VS1003音乐播放芯片进行通讯,可以和串行移位芯片74HC595进行通讯,与AD转换芯片MCP3202-B通讯,与DA转换芯片TLC5615进行通讯,与其它单片机通讯,因此SPI接口的应用是非常广泛的。
通信线路:
SPI通讯最多需要4根数据线,片选线SS(低电平有效),SCLK(时钟线,由主机控制),MOSI(主机输出从机输入),MISO(主机输入从机输出)。
其中,如果是单主机单从机的话,片选线可以不要,将SS直接接地,使它始终保持低电平。当SS为高电平时,从器件的各个通讯管脚呈高阻态,相当于从通讯线路上断开。
重要概念:
(1)时钟极性(CPOL):定义了时钟处于空闲状态时的电平。
CPOL=0:时钟空闲状态为低电平
CPOL=1:时钟空闲状态为高电平
(2)时钟相位(CPHA):定义了数据的采样时刻
CPHA=0:前沿采样,后沿输出。单片机在每个时钟周期的第一个跳变沿(上升沿或下降沿)采样外部数据,在第二个跳变沿输出数据。
CPHA=1:前沿输出,后沿采样。单片机在每个时钟周期的第一个跳变沿(上升沿或下降沿)输出数据,在第二个跳变沿对外部数据进行采样。
时钟极性(CPOL)和时钟相位(CPHA)的组合可形成四种不同的数据传输时序:
不使用片选时,两种时钟相位(CPHA)的通讯波形
时序图的解读:
以时钟相位CPHA=1时为例子,CPHA=1时,是前沿输出,后沿采样。
可以看到,在红圈标示的地方,表示数据生成(或者说是改变也可以,也就是数据开始建立),当数据稳定后,在后沿,也就是绿线标明的虚线处,数据被采样。主机从机都遵从此时序。
一般,如果采用软件模拟SPI通讯,我们需要尽量设置在数据信号的中心位置进行读取,因为这时数据是最稳定的。如果使用SPI硬件通讯,则不必关心这些细节,硬件会自动控制时序。
硬件SPI接口相关寄存器:
位号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位名称 | SSIG | SPEN | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |
SSIG:片选引脚是否有效选择位
1:片选引脚无效。
0:片选引脚有效(主机无需片选)。片选线/ss为低时芯片选中,可正常通信,当片选线/ss为高时芯片没有选中,不参与通讯。
SPEN:SPI通讯使能位
1:开启SPI通讯模式,相关引脚为SPI通讯管脚。
0:SPI引脚不工作,与SPI相关的引脚就是普通IO口。也就是默认的弱上拉输出状态。
DORD:字节发送顺序
1:低位在前,高位在后
0:高位在前,低位在后
MSTR:用来设置单片机是主机还是从机
1:主机
0:从机
CPOL:时钟极性
定义了时钟线处于空闲状态时的电平
1:空闲时为高电平
0:空闲时为低电平
CPHA:时钟相位
定义了一个时钟周期中的采样时刻,即前沿采样还是后沿采样,前沿输出还是后沿输出。
1:前沿输出,后沿采样。
0:前沿采样,后沿输出。
SPR1,SPR0:设置SPI通讯速度
SPR1 | SPR0 | 时钟SCLK(STC15F2K60S2系列和以前的STC12系列) | 时钟SCLK(STC15W系列) |
0 | 0 | SYS_clk/4 | SYS_clk/4 |
0 | 1 | SYS_clk/16 | SYS_clk/8 |
1 | 0 | SYS_clk/64 | SYS_clk/16 |
1 | 1 | SYS_clk/128 | SYS_clk/32 |
例如,如果系统时钟SYS_clk是22.1184MHz,则默认情况下SPR1,SPR0为00,也就是系统时钟的4分频,22.1184MHz/4=5.5MHz左右。
只有主单片机才需要设置时钟,从单片机无法设置时钟,时钟信号是由主单片机控制的。所以,这两位对于从单片机来说无效。
从机能够接受的时钟频率最高不得超过主单片机时钟频率SYS_clk的4分频。
例如,主机和从机都使用内部RC时钟33.1176MHz,主机和从机最高允许的时钟频率为33.1176MHz/4=8.3MHz。
SPI允许的最高通信速度大约在8MHz左右。
SPSTAT:SPI通讯状态寄存器
位号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位名称 | SPIF | WOCL | - | - | - | - | - | - |
SPIF:SPI传输完成标志。
当一次传输完成时,SPIF被置1,此时,如果SPI中断被打开(ESPI=1,EA=1),则产生中断,SPIF标志通过软件向其写入1而清零,例如:
SPSTAT=0xC0;执行后SPSTAT=0x00。
WOCL:SPI写冲突标志。
当一个数据还在传输,又向数据寄存器SPDAT写入数据时,WOCL被置1,WOCL标志通过软件向其写入1而清零。
SPDAT:SPI数据寄存器
位号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位名称 | MSB | LSB |
位7—0:保存SPI通信数据字节。MSB为最高位,LSB为最低位。
例如,主机发送数据:
SPDAT=XX; //执行此命令后硬件电路自动输出变量XX数据并接收从机数据。
a=SPDAT; //执行此命令后,将读出SPI接口收到的数据
这里需要说明一下的是:SPI传输数据时会使用到移位寄存器,与这个移位寄存器地址相同的还有一个缓冲寄存器。它们虽然地址相同,但却是两个不同的存储区域。
SPDAT=XX;
这条语句就是将数据XX写入移位寄存器,之后硬件自动启动发送过程,在时钟信号的控制下,数据将被发送出去。
当SPI接收外围芯片发送的数据时,操作的是缓冲寄存器,例如:
a=SPDAT;
执行此命令后,将读取SPI端口收到的数据,并把这个数据放到变量a中
SPDAT代表同一物理地址,但是在SPI发送数据和接收数据时,操作的是不同的寄存器。
发送时操作的是移位寄存器,接收时操作的是缓冲寄存器。
移位寄存器和缓冲寄存器
SPI接口管脚切换
通过对特殊功能寄存器AUXR1的SPI_S1与SPI_S0的设置可以切换SPI模块引脚位置。AUXR1寄存器不能位寻址,只能按字节操作方式对其进行设置。
AUXR1辅助功能寄存器1:
位号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位名称 | S1_S1 | S1_S0 | CCP_S1 | CCP_S0 | SPI_S1 | SPI_S0 | 0 | DPS |
其中SPI_S1和SPI_S0是SPI引脚切换选择位:
SPI_S1 | SPI_S0 | SPI接口引脚位置 | |||
SS/ | MOSI | MISO | SCLK | ||
0 | 0 | P1.2 | P1.3 | P1.4 | P1.5 |
0 | 1 | P2.4 | P2.3 | P2.2 | P2.1 |
1 | 0 | P5.4 | P4.0 | P4.1 | P4.3 |
1 | 1 | 无效 |
以上就是基于STC15W4K58S4单片机SPI通讯的基本知识。