Hempl/SPI
另一个常用的总线,用于连接同一电路板上的芯片或在同一机箱内具有多个电路板的模块化设计中连接芯片,是 SPI 总线,它代表串行外设接口,有时也称为“四线”接口。
SPI 是一种同步串行数据链路,它可以同时传输和接收数据,并且可以实现比 I2C 高得多的数据速率。它非常适合流式数据应用,例如读取/写入 SD 卡或发送/接收音频。正常频率约为数十兆赫兹,例如,连接到 SPI 总线的常见 8 引脚 32 兆位 Atmel 数据闪存可以以 66 兆赫兹的频率运行。
没有正式的 SPI 标准。该总线首次由摩托罗拉于 1985 年推出,并在 M68HC11 微控制器中首次得到充分的文档记录。此后,它已被许多其他硅制造商采用,并广泛应用于嵌入式行业中的许多不同应用。例如,所有 SD 内存卡都可以使用 SPI 接口。
SPI 总线在现实世界中的其他应用示例包括连接模拟到数字转换器、数字到模拟转换器、数字传感器、EEPROM、闪存、触摸屏控制器、数字电位器、实时时钟、开关、串行端口控制器和 USB 控制器,或者只是在同一电路板中的不同微控制器之间建立点对点通信。
SPI 是一种非常简单的通信协议,几乎没有高级协议,这意味着开销非常小,数据可以以高速度双向同时传输。
与 I2C 一样,SPI 设备也使用主从关系进行通信,但它不是通过在数据中发送从设备地址来选择从设备,而是使用一条连接到每个从设备的额外导线来选择它,这条导线称为片选信号。
与 I2C 不同的是,每个 SPI 总线上只能有一个主设备。
与 I2C 一样,主设备是发送时钟脉冲的设备,但在每个脉冲期间,从主设备到从设备发送 1 位数据,从从设备到主设备发送 1 位数据。
为了详细说明,SPI 使用 4 根导线在主设备和从设备之间进行通信
- 时钟 (SCLK)
- 主输出从输入 (MOSI)
- 主输入从输出 (MISO)
- 片选 (CS)
前三根导线对总线上所有设备都是通用的,并且总线上每个从设备都有一个单独的片选导线。
例如,具有单个从设备的主设备需要 4 根导线:3 根用于 SCLK、MOSI、MISO 和 1 根用于片选。
在独立从配置中,每个额外的从设备需要另一个 GPIO 引脚作为片选,以从主设备中选择另一个从设备。
除了以兆赫兹为单位的时钟频率(对应于比特率)之外,您还必须相对于数据定义时钟极性 (CPOL) 和时钟相位 (CPHA)。
SPI 通信有 4 种模式,所选模式必须在任何时刻进行通信的主设备和从设备之间对应。
- 模式 0,CPOL=0,CPHA=0
- 模式 1,CPOL=0,CPHA=1
- 模式 2,CPOL=1,CPHA=0
- 模式 3,CPOL=1,CPHA=1
通信由主设备启动。它将自己的时钟频率配置为等于或小于它要与之通信的从设备支持的最大频率。然后,通过将片选线拉低到低电平来选择所需的从设备,然后主设备开始发出时钟脉冲。
在每个时钟周期内,两个移位寄存器上都会进行全双工数据传输。这意味着主设备在 MOSI 线上发送一位;从设备从该同一线路读取它,并且从设备在 MISO 线上发送一位,主设备从该同一线路读取它。
如果需要交换更多数据,则移位寄存器将加载新数据,并重复该过程。然后,当不再需要传输数据时,主设备停止时钟。
这基本上是 SPI 协议中定义的所有内容。SPI 未定义任何最大数据速率,也未定义任何特定的寻址方案;它没有确认机制来确认数据的接收,并且不提供任何流量控制。
主板上的 AT32UC3A 片上系统包含两个 SPI 接口,SPI0 和 SPI1,其中 SPI0 在左侧总线上,SPI1 在右侧总线上。每个接口都有四个片选线,最多允许使用八个 SPI 设备;其中一个 (SPI1 CS0) 用于与 SD/MMC 卡通信,其中三个 (SPI0 CS0 和 SPI1 CS1 和 CS2) 可在总线连接器上使用。
信号 | GPIO | 总线引脚 | PicoLisp |
---|---|---|---|
SPI0_CS0 | PA10 | BUS1&3 引脚 12 | 'PA_10
|
SPI0_MISO | PA11 | BUS1&3 引脚 13 | 'PA_11
|
SPI0_MOSI | PA12 | BUS1&3 引脚 14 | 'PA_12
|
SPI0_SCK | PA13 | BUS1&3 引脚 15 | 'PA_13
|
SPI1_CS1 | PA18 | BUS3 引脚 11 | 'PA_18
|
SPI1_CS2 | PA19 | BUS4 引脚 12 | 'PA_19
|
SPI1_MISO | PA17 | BUS4 引脚 11 | 'PA_17
|
SPI1_MOSI | PA16 | BUS4 引脚 10 | 'PA_16
|
SPI1_SCK | PA15 | BUS4 引脚 9 | 'PA_15
|
Hempl 通过 SPI 读取和写入 SD 卡,并提供对卡上文件的访问。在 PicoLisp 中,load
函数可用于从 SD 卡加载 Lisp 代码并在读取-评估循环中执行它。请注意,文件名以 "/mmc/
" 开头。例如:(load "/mmc/lib.l" "/mmc/pilog.l")
Alcor6L 中包含一个 SPI
模块,用于进行低级 SPI 协议通信,并假定它可以工作,但尚未经过测试。
可用函数列表
函数 | 返回值 | 描述 |
---|---|---|
(spi-setup id type clock cpol cpha databits) |
时钟 |
设置 SPI 接口 |
(spi-sson id) |
Nil |
选择 SPI 接口的 SS 线(从设备选择) |
(spi-ssoff id) |
Nil |
取消选择 SPI 接口的 SS 线(从设备选择) |
(spi-write id 'any) |
最后一个写入的值 | 向 SPI 接口写入一个或多个字符串/数字 |
(spi-readwrite id 'any) |
不适用 | 尚未实现:请参见 问题 #13 |
- 串行外设接口简介,David Kalinsky 和 Roee Kalinsky,发表在 Embedded 的电子博客中,2002 年 2 月 1 日。
- EEHerald 的嵌入式系统在线课程,模块 12:SPI 总线接口
- Atmel AT32UC3A 数据手册,第 23 节:“串行外设接口”
- 维基百科 - 串行外设接口