8.1 SPI 简介
SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,广泛用于嵌入式系统中连接微控制器与外围设备,如传感器、存储器、显示屏等。
主要特点
1. 全双工通信:支持同时发送和接收数据。
2. 同步通信:依靠时钟信号(SCLK)同步数据传输。
3. 主从架构:一个主设备控制一个或多个从设备。
4. 高速传输:速度通常高于I2C和UART。
优点:高速传输,全双工通信,硬件简单。
缺点:需要更多引脚,无内置错误检测,协议复杂度较高。
全双工,这里就跟I2C区别开了,I2C只有一根数据线,发送数据时不能接收,接收数据时不能发送,所以SPI相较于I2C通信十分迅速,但是,主从身份是无法改变的,硬件(接的线)固定了,一个主机多个从机,主机是这些从机永远的主机。就是接的线相对多一点,I2C就用个SCL,SDA,SPI至少用四根。
信号线
1. SCLK(Serial Clock):主设备提供的时钟信号。
2. MOSI(Master Out Slave In):主设备发送数据,从设备接收。
3. MISO(Master In Slave Out):从设备发送数据,主设备接收。
4. SS/CS(Slave Select/Chip Select):主设备选择从设备。
应用场景
存储器:如Flash、EEPROM。
传感器:如温度、加速度传感器。
显示屏:如OLED、LCD。
通信模块:如Wi-Fi、蓝牙模块。
8.2 SPI 工作原理
1. 初始化:主设备配置时钟频率、数据格式等参数。
2. 选择从设备:主设备拉低(或者拉高,取决于从机)对应从设备的SS线。
3. 数据传输:主设备通过MOSI发送数据,同时通过MISO接收数据。
4. 结束通信:主设备拉高(或拉低)SS线,结束传输。
SPI(Serial Peripheral Interface)、SSI(Synchronous Serial Interface)和Microwire是三种常见的同步串行通信协议,它们在帧格式、通信方式和应用场景上有所不同。
8.3 XT25 简介
XT25F02E 含有2Mb串行FLASH,支持标准串行外围接口(SPI),并支持Dual SPI:串行时钟、芯片选择、串行数据I/O0(SI)、I/O1(SO)。Dual I/O数据以160Mbits/s的速度传输。下图为XT25内部方框图。
8.4 寄存器
8.4.1 控制寄存器0 SSP0CR0, SSP1CR0
这里CPOL和CPHA可改变空闲状态和接收时刻,而I2C就是固定的
位 | ||
3:0 | DSS | 数据长度选择,控制每帧中传输的位的数目,0000~0010无效 0011 ~ 1111分别对应4-16位,相当于DSS的二进制值加一 |
5:4 | FRF | 帧格式 00 SPI 01 TI SPI 10 Microwire 11 不适用 |
6 | CPOL | 时钟输出极性 只用于SPI模式 0 使帧之间的总线时钟保持低电平 1 使帧之间的总线时钟保持高电平 |
7 | CPHA | 时钟输出相位 0 SSP控制器在帧传输第一次跳变(01 or 10)时捕获串行数据, 即跳变远离时钟线的帧间状态 1 SSP控制器在帧传输第二次跳变时捕获串行数据,即跳变靠近时钟线的帧间状态 |
15:8 | SCR | 串行时钟速率 位频率为 PCLK / (CPSDVSR * [SCR + 1]), CPSDVSR为预分频器分频值 PCLK为APB时钟PCLK计时预分频器 |
8.4.2 控制寄存器1 SSP0CR1 SSP1CR1
位 | ||
0 | LBM | 0 正常操作 1 串行输入脚可做串行输出脚 启用后,发送的数据会直接回环到接收端,用于测试或调试,无需外部连接。在LBM模式下,原本用于接收数据的串行输入脚(如MISO)可以临时用作串行输出脚(类似MOSI),直接输出发送的数据。 |
1 | SSE | SSP使能 0 禁能 1 与总线上的其他设备相互通信,置位前先向其他SSP寄存器和中断控制寄存器写入合适的控制信息 |
2 | MS | 主master/从slave模式 SSE为0时才能写入(I/O是输入in/输出out) 0 SSP控制器作为总线主机,驱动SCLK,MOSI和SSEL接收MISO 1 SSP控制器作为总线从机,驱动MISO,接收SLCK、MOSI和SSEL |
3 | SOD | 从模式下有用,从机输出禁能, 1 将禁止MISO,从机就发不出去了 |
7:4 | 保留 |
8.4.3 数据寄存器 SSP0DR、SSP1DR
16位,可往寄存器写入,可从寄存器读出
写入:
状态寄存器 TNF 置1,即Tx FIFO未满时,软件就可以将帧数据写入,满了不能写;
Tx FIFO 原来为空并且总线上SSP控制器空闲,写了立马发,不然排队等
小于16位,写入寄存器的数据右对齐
读出:
状态寄存器 RNE 置一,即Rx FIFO未空,就能读出数据
读的时候返回Rx FIFO最早接收到的帧数据
读出的数据小于16位,高位补零
8.4.4 状态寄存器 SSP0SR、SSP1SR
只读
位 | E为empty F为full | 描述 |
0 | TFE | 1 发送FIFO为空 |
1 | TNF | 1 发送FIFO未满 |
2 | RNF | 1 接收FIFO未空 |
3 | RFE | 1 接收FIFO为空 |
4 | BSY忙 | 0 空闲 1 发送/接收一个帧或TxFIFO非空 |
7:5 | 保留 |
8.4.5 时钟预分频寄存器 SSP0CPSR SSP1CPSR
该寄存器对SSP外设时钟SSP_PCLK分频来获得预分频时钟,再被SSPnCR0(8.4.1)中的SCR因数分频得到位时钟
[7:0] CPSDVSR 为2~256之中的一个偶数,第0位就保持0不变了
实际硬件限制使得SCLK速率不能超过SSP外设时钟的1/12。
8.4.6 中断屏蔽置位/清零寄存器 SSP0IMSC SSP1IMSC
4个中断条件的使能
位 | ||
0 | ROIM | 当SPI接收缓冲区已满(即已接收到数据但未被读取),而新的数据又到达时,会发生接收溢出。 使能ROIM中断后,当发生接收溢出时,SPI模块会触发中断,通知程序处理溢出情况。 |
1 | RTIM | 接收超时(Rx FIFO非空且在超时周期内没有读出任何数据)后,置位该位会触发接收超时中断 |
2 | RXIM | Rx FIFO至少有一半满,产生中断 |
3 | TXIM | Tx FIFO至少有一半空,产生中断 |
7:4 | 保留 |
8.4.7 原始中断状态寄存器 SSP0RIS SSP1RIS
不管SSPnIMSC中的中断是否使能,只要出现有效的中断条件,SSP原始中断状态寄存器就将相应的位置一。
位 | ||
0 | RORRIS | 当SPI接收缓冲区已满(即已接收到数据但未被读取),而新的数据又到达时,会发生接收溢出。该位置一 |
1 | RTRIS | 接收超时 |
2 | RXRIS | Rx FIFO至少有一半满 |
3 | TXRIS | Tx FIFO至少有一半空 |
7:4 | 保留 |
8.4.8 屏蔽中断状态寄存器 SSP0MIS SSP1MIS
中断条件触发且中断使能时,相应位置一
位 | ||
0 | RORRIS | 当SPI接收缓冲区已满(即已接收到数据但未被读取),而新的数据又到达时,会发生接收溢出。该位置一 |
1 | RTRIS | 接收超时 |
2 | RXRIS | Rx FIFO至少有一半满 |
3 | TXRIS | Tx FIFO至少有一半空 |
7:4 | 保留 |
8.4.9 SSP中断清零寄存器 SSP0ICR SSP1ICR
用于清零接收溢出Receive Overrun 和接收超时 Receive Timeout 的中断
另外两个RXIM、TXIM通过读/写 Rx/ Tx FIFO会自动清零
位 | 写1清除 | |
0 | RORIC | 清除ROIM |
1 | RTRC | 清除RTIM |
7:2 | 保留 |
8.5 SPI实现读取XT25
持续更新。。。