点击上方蓝字谈思实验室
获取更多汽车网络安全资讯
01
SPI简介
1.1 SPI概述
SPI (Serial Peripheral Interface) 即串行外围设备接口,是一种全双工同步串行通信接口,可以使MCU与各种外围设备以串行方式进行通信从而交换信息。SPI接口主要应用在EERPOM、FLASH、实时时钟、AD转换器、数字信号处理器、数字信号解码器等设备之间。
-
SPI通信优点
支持全双工通信,通信简单,数据传输速率快。
-
SPI通信缺点
没有指定的流控制,没有应答机制确认是否接收到数据,所以在数据可靠性上有一定的缺陷。
1.2 SPI通信特点
-
SPI主从模式
SPI分为主、从两种模式。一个SPI通讯系统需要包含一个(且只能是一个)主设备,一个或多个从设备。提供时钟的设备为主设备(Master),接收时钟的设备为从设备(Slave),从设备本身不能产生或控制时钟,没有时钟则从设备不能正常工作。SPI接口的读写操作都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。
主从设备必须使用相同的工作模式(SCK、CPOL和CPHA,这些在下文中会详细介绍),才能正常工作。如果有多个从设备,并且它们使用了不同的工作模式,那么主设备必须在读写不同的从设备时需要重新修改对应从设备的模式。
-
同步传输数据
主设备会根据将要交换的数据来产生相应的时钟脉冲,时钟脉冲组成了时钟信号,时钟信号通过时钟极性(CPOL)和时钟相位(CPHA)控制着两个设备之间何时进行数据交换以及何时对接收到的数据进行采样,从而保证数据在两个设备之间是同步传输的。
-
串行、全双工方式数据交换
SPI设备间的数据传输之所以又被称为“数据交换”,是因为SPI协议规定一个SPI设备不能在数据通信过程中仅仅只充当一个发送者或者接收者。在每个时钟周期内,SPI设备都会发送并接收一个bit的数据(无论主从设备),相当于该设备有一个bit的数据被交换了。
1.3 SPI通信原理
-
SPI信号线
SPI接口一般使用四条信号线进行全双工通信,也有三线制实现半双工通信。
SCK (Serial Clock)
串行时钟信号,由主设备产生。
MOSI (Master Output, Slave Input)
主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
MISO (Master Input, Slave Output)
主设备输入/从设备输出引脚。该引脚在主模式下接收数据,在从模式下发送数据。
SS (Slave Select)
从设备片选信号,由主设备控制,用于作为“片选引脚”,也就是选择指定的从设备,让主设备可以单独地与特定从设备进行通讯,避免数据线上的冲突。
单个从设备示意图如下:
多个从设备示意图如下:
-
SPI设备选择
SPI是单主设备通信协议,这意味着总线中只有一个设备能发起通信。当SPI主设备想读/写从设备时,会先拉低从设备对应的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把信号发到MOSI实现“写”操作,同时可对MISO采样从而实现“读”操作。
-
SPI工作模式
在读写数据时序的过程中存在四种工作模式,工作模式由CPOL和CPHA所决定。
CPOL(Clock Polarity)-- 时钟极性
SPI通信的整个过程分为空闲时刻和通信时刻。如果SCK在数据发送之前和之后的空闲状态是高电平,则CPOL = 1;如果SCK的空闲状态是低电平,则CPOL = 0。
CPHA (Clock Phase) -- 时钟相位
当主设备和从设备要交换数据,就会牵涉到一个问题:主设备在什么时刻输出数据到MOSI,而从设备要在什么时刻采样这个数据?
同步通信的一个特点就是所有数据的变化和采样都是伴随着时钟沿进行的,也就是说数据总是在时钟的边沿附近变化或被采样。而一个时钟周期必定包含了一个上升沿和一个下降沿,这是周期的定义所决定的,只是这两个沿的先后并无规定。
数据从产生到稳定是需要一定时间的,如果主设备在上升沿输出数据到MOSI上,那么从设备就只能在下降沿去采样这个数据了。反之如果一方在下降沿输出数据,那么另一方就必须在上升沿采样这个数据。
CPHA = 1,就表示数据的输出是在一个时钟周期的第一个沿上,至于这个沿是上升沿还是下降沿,就要视CPOL的值而定,CPOL = 1(空闲状态为高电平)则为下降沿,反之则为上升沿。那么数据的采样自然就是在第二个沿上了。
CPHA = 0,就表示数据的采样是在一个时钟周期的第一个沿上,同样是什么沿由CPOL所决定,那么数据的输出就是在第二个沿上了。这里会存在一个问题:当一帧数据开始传输第一个bit时,在第一个时钟沿上就需要采样该数据了,那么这个数据是什么时候输出来的呢?有两种情况:一是SS使能的边沿;二是上一帧数据的最后一个时钟沿,有时候这两种情况还会同时生效。
模式总结
Mode 0 -- CPOL = 0 & CPHA = 0
一个时钟周期的第一个沿(上升沿)进行数据采样,第二个沿(下降沿)进行数据输出。
Mode 1 -- CPOL = 0 & CPHA = 1
一个时钟周期的第一个沿(上升沿)进行数据输出,第二个沿(下降沿)进行数据采集。
Mode 2 -- CPOL = 1 & CPHA = 0
一个时钟周期的第一个沿(下降沿)进行数据采样,第二个沿(上升沿)进行数据输出。
Mode 3 -- CPOL = 1 & CPHA = 1
一个时钟周期的第一个沿(下降沿)进行数据输出,第二个沿(上升沿)进行数据采集。
时序图说明
如下图所示,当数据未发送及发送完毕后,SCK都是高电平,因此CPOL = 1。在SCK的第一个沿,MOSI和MISO会发生变化;在SCK的第二个沿,数据已经稳定了,此刻采样数据是合适的,也就是在一个时钟周期的后沿(上升沿)锁存读取数据,即CPHA = 1。SSEL片选通常用于决定是哪个从设备与主设备进行通信。
-
SPI数据发送接收
SPI主设备和从设备都有一个串行移位寄存器,主设备通过向其SPI串行寄存器写入一个字节来发起一次传输。
1. 首先拉低对应从设备的SS信号线,表示与该从设备进行通信。
2. 主设备通过发送SCK时钟信号,来告诉从设备写数据或者读数据。
3. 主设备将要发送的数据写到发送数据缓存区,缓存区经过移位寄存器(0 ~ 7),串行移位寄存器通过MOSI信号线将字节一位一位地移出去传送给从设备,同时通过MOSI接口将接收到的数据经过移位寄存器一位一位地移到接收缓存区。
4. 从设备也将自己的串行移位寄存器(0 ~ 7)中的内容通过MISO信号线返回给主设备,同时通过MOSI信号线接收主设备发送的数据。
SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。如果只进行写操作,主设备只需要忽略接收到的字节;反之,若主设备要读取从设备的一个字节,就必须发送一个空字节来引发从设备的传输。也就是说,主设备发一个数据必然会收到一个数据;主设备要收一个数据也必须要先发一个数据。
从理论上讲,只要实际可行,时钟速率就可以是想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率。
1.4 扩展SPI(Dual SPI、Quad SPI)
Dual SPI和Quad SPI只是针对SPI Flash而言,并不是针对所有的SPI外设。对于SPI Flash,全双工并不常用,因此可以扩展MOSI和MISO的用法,或者还可以增加I/O线,让它们工作在半双工模式,用以加快数据传输。
-
Dual SPI
Dual SPI将原本的MOSI和MISO引脚合并成一对双向数据线,通常称为IO0和IO1。
在一个时钟周期内,通过这两条数据线可以同时传输两位数据,这样理论上可以将数据传输速率提高一倍,但这时SPI工作在半双工模式下, 即在同一时刻只能进行读或者写操作。
-
Quad SPI
Quad SPI是在双线SPI的基础上进一步改进,增加了另外两条双向数据线IO2和IO3。这四条数据线可以在一个时钟周期内传输四位数据,极大地提升了数据传输速率。
在一些实现中,原有的写保护(WR)和保持(HOLD)引脚可能会被复用位数据线IO2和IO3,以减少硬件接口的数量。
02
Nor Flash简介
Nor Flash是一种很常见的存储芯片,掉电后数据不会丢失,并且支持XIP允许,即CPU可以直接从Nor Flash取指令运行,并不需要将程序由Flash中再加载至RAM中,这是由于Nor Flash的接口与RAM相同。而NAND Flash并不支持XIP运行。因此,在嵌入式系统中,Nor Flash很适合作为启动程序的存储介质。
Nor Flash的读取和RAM很类似,可以随机访问任意地址的数据(只要能够提供数据的地址,数据总线就能够正确的给出数据)。Nor Flash进行读操作的效率非常高,但是擦除和写操作的效率很低。另外,Nor Flash的容量一般比较小,NAND Flash进行擦除和写操作的效率更高,并且容量更大。一般而言,Nor Flash用于存储程序,NAND Flash用于存储数据。针对Nor Flash的擦除和写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成相应的操作。
从支持的最小访问单元来看,Nor Flash一般分为8位和16位的。当然,也有很多Nor Flash芯片同时支持8位模式和16位模式,具体的工作模式通过特定的管脚进行选择。
对8位的Nor Flash芯片,或是工作在8位模式的芯片来说,一个地址对应一个字节的数据。例如,一块8位的Nor Flash,假设容量为4字节,则芯片应该有8个数据信号线D7 - D0和2个地址信号线A1 - A0。地址0x0对应第0个字节、地址0x1对应第1个字节、地址0x2对应第2个字节,而地址0x3对应第3个字节。
对16位的Nor Flash芯片,或是工作在16位模式的芯片来说,一个地址对应于一个HALF-WORD(16-BIT)的数据。例如,一块16位的Nor Flash,假设容量位4字节,则芯片应该有16个数据信号线D15 - D0和1个地址信号线A0。地址0x0对应于芯片内部的第0个HALF-WORD,地址0x1对应于芯片内部的第1个HALF-WORD。
FLASH一般都还分为很多个Sector,每个Sector包括一定数量的存储单元。对有些大容量的Flash,还分为不同的Block,每个Block包括一定数目的Sector。Flash的擦除操作一般都是以Sector、Block或是整片Flash为单位。
对Flash进行写操作时,每个bit可以通过编程由1变成0,但不可以由0变成1,只有擦除操作,才能将bit由0变成1。所以,为了保证写操作的正确性,在执行写操作之前,都要先执行擦除操作,擦除操作会把Flash的一个Sector、一个Bank或是整片Flash的值全部修改为0xFF,这样写操作就可以正确完成了。
由于Nor Flash没有本地坏区管理,所以一旦存储区块发生毁坏,软件或者驱动程序必须接手这个问题,否则可能会导致设备发生异常。在解锁、抹除或写入Nor Flash区块时,特殊的指令会先写入已绘测的记忆区的第一页(Page)。接着,Flash芯片会提供可用的指令清单给实体驱动程序,而这些指令是由CFI(Common Flash Interface)所界定的。
2.1 CFI接口
CFI(Common Flash Interface)是JEDEC(Joint Electron Device Engineering Council,电子器件工程联合委员会)制定的一个接口,用来帮助程序读取Flash的制造商ID和设备ID,确定Flash的大小,获得Flash的各个物理特性,比如block块的擦除时间等等。若Flash支持CFI接口,则外部设备可以通过该接口来获取Flash的相关信息。
针对SPI Flash(以Infineon-S25FL128S为例)来说,可以通过以下Command来获取对应信息。
2.2 逻辑架构
下图展示了Infineon-S25FL128S的Logic block diagram。Flash通过I/O引脚与外部设备进行连接,通信接口为SPI协议。
针对Flash的擦除、编程、读取操作是由Control Logic所管理的。
2.3 Registers
下图展示了Infineon-S25FL128S的寄存器。
Status Register 1中的Field WEL和WIP较为常见。
Write Enable Latch (WEL)
Write In Progress (WIP)
2.4 Command Sets
下图展示了Infineon-S25FL128S所支持的Command Sets。外部设备可以通过SPI向Flash发送对应的Command让Flash完成相应的操作。
例如,外部设备发送Bulk Erase (0x60/0xC7)给Flash,Flash识别到该指令后,就会进行擦除全部扇区的操作。
例如,外部设备还可以发送RDSR1 (Read Status Register-1, 0x05)指令给Flash,来获取Flash的Status Register-1的值。
03
Switch固件升级
前面对SPI协议和Nor Flash都做了一些简要介绍,这样就更加容易理解接下来要介绍的Switch固件升级流程。
如下面两张图所示,MCU通过与Switch之间的接口(例如,SMI接口)来操作Switch的SPI Flash Controller相关的寄存器,从而来实现对Switch外挂的SPI Nor Flash的擦除、编程和读操作。至于更新Switch固件,其实也就是先将SPI Nor Flash上原有的Switch固件擦除,然后写入新的固件。
MCU擦除Switch外挂Flash
-
Flash (Infineon-S25FL128S)擦除Block流程
如下图所示,若要对Flash实现擦除Block(64KB)的操作,则需要先向Flash发送Write Enable (WREN)指令,将状态寄存器中的Write Enable Latch (WEL)置为1,使能擦除和编程操作。随后需要向Flash发送Sector Erase指令以及对应的地址来让Flash执行擦除操作。
用户可以查询Write-In Progress (WIP)来确认擦除操作是否已经完成,若操作仍在进行中,则该值为1;若操作已完成,则该值为0。
擦除指令的SPI时序图如下所示:
-
Switch通过SPI接口向Flash发送Command
对于Rtl9071CL来说,只要往寄存器DR写入WREN(0x06)和Sector Erase(0xD8)以及相应的地址,Switch就会将这些Command通过SPI发送至外挂的SPI Nor Flash。
DR
Register Address:0x60
n[31:0]: [Interface][SPI Master] It is data buffer of FIFO for pushing/poping data.
这里值得一提的是,MCU也是通过该寄存器来编程或者读取Switch外挂Nor Flash上的数据的。
-
MCU通过SMI接口操作Switch的SPI Flash Controller
在Switch通过SPI向Nor Flash发送指令之前,MCU需要先通过SMI接口先对Switch的其它一些SPI Flash Controller进行设置。
例如,是否使能SPI通信、将Flash选择为SPI Slave,选择SPI模式(Single channel、Dual channel、Quad channel),选择传输模式(transmit mode、receive mode)等等。
SER
Register Address: 0x10
n[0]: [Interface][SPI Master] Select the flash as SPI slave.
0x0: Flash is not selected
0x1: Flash is selected
SSIENR
Register Address: 0x8
n[0]: [Interface][SPI Master] If SSIENR is disabled, all transfers of user mode are halted and the user can't program some control register if SSIENR is enabled.
0x0: Disable SPIC
0x1: Enable SPIC
3.2 MCU编程Switch外挂Flash
当要对Flash执行Program操作时,MCU需要先向Switch的DR寄存器写入WREN指令,然后写入编程指令(例如,PP Page Program, 0x02)以及相应的地址,当Flash通过SPI接收到Switch发送过来的指令之后就会进入编程模式。此时,MCU就可以通过SMI接口往Switch的DR寄存器写入数据,而这些数据就会被Flash写入到相应的地址上。
3.3 MCU读取Switch外挂Flash
当要对Flash执行读取操作时,Switch要根据配置的模式(SPI、Dual SPI、Quad SPI)对相应的寄存器进行设置。然后MCU要先向Switch的DR寄存器写入读取指令(例如,Read,0x03)以及相应的地址,当Flash接收到这些指令开始进行读操作之后,Flash就会将对应的地址上的数据通过SPI传送给Switch。随后,MCU只要去读取Switch的DR寄存器的值就可以获取这些数据了。
end
专业社群
精品活动推荐
原文始发于微信公众号(谈思实验室):车载以太网之Switch网关详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论