2、硬件接口基础:SPI接口协议详解、I2C接口协议详解、并行接口与NAND Flash接口对比

各位同学,欢迎来到第二章。这一章我们聊聊硬件接口。

说实话,做存储芯片驱动,最绕不开的就是接口协议。你想想看,芯片和主控之间怎么说话?数据怎么传?全靠这些接口。我当年刚入行时,觉得协议就是背时序图,后来踩了坑才明白——时序图背后是硬件的脾气

今天咱们重点讲三个:SPI、I2C、并行接口。尤其是前两个,嵌入式开发里天天见。NAND Flash的并行接口,我也会拿来做对比,帮你理解为什么有些场景非它不可。

2.1 SPI接口协议详解

SPI,全称Serial Peripheral Interface。说白了就是四根线搞定通信:SCK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。

为什么它快?因为它是全双工的。主设备发数据的同时,从设备也能回数据。我习惯把SPI比作两个人打电话——你说话的同时也能听到对方说,效率自然高。

2.1.1 四种模式,别搞混

SPI有四种模式,由时钟极性(CPOL)和时钟相位(CPHA)决定。我刚开始总记不住,后来总结了个口诀:

  • CPOL=0:空闲时时钟为低电平
  • CPOL=1:空闲时时钟为高电平
  • CPHA=0:在时钟的第一个边沿采样数据
  • CPHA=1:在时钟的第二个边沿采样数据

嗯,这里要注意:主设备和从设备的模式必须一致。我在项目中遇到过,一块Flash怎么都读不对,折腾了两天,最后发现是CPHA配反了。从那以后,我每次调SPI第一件事就是对着数据手册确认模式。

避坑指南:我曾经在调试一款Nor Flash时,发现读出来的数据全是0xFF。查了半天,原来是主控默认用模式0,但Flash芯片要求模式3。改过来后,一切正常。所以,先看从设备手册,再配主设备

2.1.2 多设备连接

SPI支持一主多从。每个从设备独占一根CS线。你想想看,如果挂4个设备,就需要4根CS线。优点是设备之间互不干扰,缺点是占用的GPIO多

我个人的习惯是:如果设备数量超过3个,我会考虑用I2C或者加一个GPIO扩展芯片。否则板子上的走线会乱成一团。

2.2 I2C接口协议详解

I2C和SPI最大的区别是什么?I2C只用两根线:SDA(数据线)和SCL(时钟线)。而且它是半双工的,同一时刻只能一个方向传数据。

为什么I2C能只用两根线挂那么多设备?因为它有设备地址。每个从设备都有一个7位或10位的地址。主设备发数据时,先发地址,再发数据。从设备听到是自己的地址,就应答一下。

2.2.1 起始条件和停止条件

I2C的通信开始和结束有固定的时序:

  • 起始条件:SCL为高时,SDA从高变低
  • 停止条件:SCL为高时,SDA从低变高

这个时序很关键。我见过有人用GPIO模拟I2C时,起始和停止条件没处理好,导致总线卡死。嗯,这里有个小技巧:如果总线卡死了,可以连续发9个时钟脉冲,让从设备复位

个人经验:I2C的速率通常有100kHz(标准模式)和400kHz(快速模式)。但实际项目中,我建议不要跑满。尤其是板子走线比较长的时候,跑400kHz容易出问题。我一般留20%的余量,比如目标400kHz,实际配320kHz。

2.2.2 应答机制

I2C的每个字节后面都跟着一个应答位(ACK)。从设备收到数据后,如果正常,就拉低SDA表示应答。如果没拉低,主设备就知道出问题了。

这个机制很实用。我曾经调试一款温度传感器,读出来的值忽高忽低。后来用逻辑分析仪抓波形,发现从设备偶尔不返回ACK。查了一圈,原来是电源纹波太大,导致从设备偶尔复位。所以,I2C的应答位是很好的诊断工具

2.3 并行接口与NAND Flash接口对比

讲完串行接口,咱们来看看并行接口。NAND Flash用的就是并行接口——数据线、地址线、控制线分开

为什么NAND Flash不用SPI或I2C?因为速度。你想想看,一个NAND Flash芯片动辄几GB,如果用SPI传,那得传到猴年马月。并行接口一次能传8位或16位数据,速度是串行的好几倍。

2.3.1 NAND Flash的接口信号

典型的NAND Flash接口包含以下信号:

信号名 功能
I/O[7:0] 数据/地址/命令复用总线
CLE 命令锁存使能
ALE 地址锁存使能
CE# 片选信号(低有效)
RE# 读使能(低有效)
WE# 写使能(低有效)
WP# 写保护(低有效)
R/B# 就绪/忙指示(低表示忙)

你看,信号很多。但好处是控制灵活。比如,通过CLE和ALE,你可以复用同一组I/O线来发命令、地址和数据。这样虽然信号线多,但引脚数反而减少了。

2.3.2 并行接口 vs 串行接口

我做个对比,帮你理解:

特性 SPI I2C 并行接口(NAND)
线数 4根(含片选) 2根 10-20根
传输方式 全双工 半双工 半双工
速度 几十MHz 几百kHz~几MHz 几十~上百MHz
设备寻址 片选线 地址 片选线
典型应用 Nor Flash、SD卡 传感器、EEPROM NAND Flash、SRAM

从表里能看出来,并行接口的优势是速度,代价是引脚多。所以,如果你的项目对容量和速度要求高(比如做固态硬盘),那NAND Flash的并行接口是唯一选择。如果只是存个配置参数,SPI或I2C就够用了。

注意:NAND Flash的并行接口对时序要求很严格。尤其是读使能(RE#)和写使能(WE#)的脉冲宽度,必须满足数据手册的最小值。我见过有人把RE#的脉冲设得太短,导致数据读出来是错的。所以,写驱动时,一定要用示波器或逻辑分析仪验证时序

2.4 小结

这一章我们聊了三种接口:

  • SPI:四线全双工,速度快,适合Nor Flash、SD卡等
  • I2C:两线半双工,引脚少,适合传感器、EEPROM
  • 并行接口:信号多速度快,NAND Flash的标配

我个人觉得,没有最好的接口,只有最合适的接口。选型时,先看你的存储芯片是什么类型,再看主控有多少GPIO可用,最后考虑速度要求。嗯,下一章我们会深入NAND Flash的物理结构,到时候你会更明白为什么它需要并行接口。

好,今天就到这里。有问题欢迎在评论区留言,咱们下章见。