本文介绍如何将 gpio 端口连接到 spi 外设。它定义了spi协议的基础知识,信号和sck信号的四种传输变体。包括一个软件程序,用于使用max7651实现spi接口,max12是一种闪存可编程的位集成数据采集系统。
介绍
the spi™总线是许多微处理器外设芯片使用的4线串行通信接口。max7651微处理器不包括实现接口的专用硬件。但是,图中显示了可以向spi外设发送和接收数据的简单软件例程。
spi接口的4个引脚如下:
sck(串行数据时钟):数据在sck的上升沿或下降沿上移动/锁定(请参阅下一节)。
mosi(主输出/从输入):如果芯片是主设备,则数据从此引脚传输出去,如果芯片是从设备,则数据传输到此引脚。
miso(主输入/从输出):如果芯片是主设备,则数据接收到此引脚,如果芯片是从设备,则从该引脚传输出去。
/cs(芯片选择,低电平有效):告知外围设备传输即将开始。
spi协议定义了sck相位和极性的四种数据组合。如果芯片具有设置这四种状态的控制位,则它们通常称为cpol(时钟极性)和cpha(时钟相位)。spi 始终以 8 位块传输数据。您可以根据需要传输任意数量的 8 位块。例如,16 位写入从前 8 位开始到第 位结束断言/cs。
cpol cpha transfer
0 0 sck上升沿转移。
sck 在位定时中间进行转换。
1 0 sck 落边转移。
sck 在位定时中间进行转换。
0 1 sck 落边转移。
sck 在位时序开始时转换。
1 1 sck上升沿转移。
sck 在位时序开始时转换。
在读取spi外设的数据手册时,通常会看到对spi模式的引用为cpol = 0、cpha = 0等,即使芯片本身在物理上不包含这些位定义。相反,spi接口是“硬连线”的,以发送/接收数据,就好像cpol和cpha位已设置为0一样。例如,max5154 12位dac采用spi接口,具有上升沿中位数据传输功能。这对应于cpol = 0,cpha = 0协议。因为这是迄今为止最常见的spi传输,所以这就是我们将要讨论的示例代码。下图来自max5154数据资料。信号/cs是spi信号active-low ss,sclk是sck,din将连接到modi,因为外设是从机,只有一个输入(没有回读)。这部分在传输中使用 16 位。
图1.串行接口时序图。
代码示例:8 位数据传输
以下示例是最常见的 spi 传输类型,cpo = 0,cpha = 0。该例程不假设max7651的时钟速度,因为i/o端口位只是尽可能快地“位敲击”。数据传输时间显示在本节末尾。
图2所示为max7651/max7652与spi外设之间的典型连接。
图2.通用 spi 连接。
注释字段中的数字 {n} 是执行指令的时钟周期数。
;用于 8 位外设的 spi 数据传输。max7651为主站;外围是奴隶。
;
;使用以下spi定义的引脚。(某些外围设备是写入的 仅,因此只需要 3 根电线。
;sck:数据传输时钟
;miso:主输入数据(来自外设),并不总是使用
;mosi:主输出数据(到外设);
ss:从选择(低电平有效))
;
sck equ p1.0
miso equ p1.1
mosi equ p1.2
cs equ 小1.3 ;使用端口 1,但这是 100% 任意的。使用任何可用的 引 脚。
;
;现在我们需要使用max7651中的一些内部ram作为数据存储。
;为了执行速度,其中两个变量必须位于 ram 区域
;这允许在字节内进行位寻址。在max7651中,ram空间对应于
;到地址 20h 到 2fh。低于 20h 或高于 2fh 的地址不能被位寻址!
spi_in equ 20+ ;从从属设备读取 8 位的结果。
spi_out equ 21+ ;我们希望发送给奴隶的数据。
;
;最后,我们需要一个循环计数器来跟踪发送 8 位。
;这可以是“r”寄存器 (r0-r7) 或
;任何 ram 寄存器(不必是位可寻址的)。让我们使用
内存 ;注册。
loop equ 30+ ;可以在地图中的任何位置;这只是一个例子。
;
;假设调用时,已经设置了片选位ss 到 1.
spi_io: clr sck ; sck starts off low. {1}
clr cs ; clearing cs begins the data transfer. {1}
setb miso ; to be used as input, must be set internally. {1}
mov loop,#8 ; eight bits to transfer. {3}
xfer: mov c,spi_out.7 ; move bit 7 into carry (spi is msb first). {2}
mov mosi,c ; i/o port reflects the carry bit, which is the data bit. {2}
setb sck ; generate sck rising edge, after data is stable. {1}
mov c,miso ; read data from slave into carry (optional). {2}
mov spi_in.7,c ; copy into the received data byte, bit-7 position. {2}
clr sck ; generate sck falling edge, after data read in. {1}
mov a,spi_out ; accumulator is temp holder for shift operation. {2}
rl a ; rotate left (but not through carry!). {1}
mov spi_out, a ; prepare bit 7 for next transfer to slave. {2}
mov a,spi_in ; get previous slave read data. {2}
rl a ; rotate left to get next bit position into proper spot. {1}
mov spi_in,a ; save result. {2}
djnz loop,xfer ; decrement loop. jump if not zero to xfer. {3}
; transfer done.
setb cs ; de-assert chip select. {1}
.end ; tell assembler code completed.
传输 8 位(读取和写入从属)的 cpu 周期总数为 6 + 8 × 23 + 1 = 191。仅供读取或写入,总数为 6 + 8 × 18 + 1 = 151 个 cpu 周期。下表给出了使用max7651常用时钟速度的各种传输速率。
max7651时钟速度 位传输时间 总读/写
传输时间
12兆赫 7.95us (~125khz) 63.6秒
11.0592兆赫 8.63us (~116khz) 69.08秒
4兆赫 23.88us (~41.9khz) 191us
从此表中,我们可以看到最快的spi字节传输约为15.7khz,而最慢的速率为5.2khz。这比专用的1mhz spi硬件端口慢得多!因此,如果max7651用作从机,则必须将spi主机设置为最慢的位传输速度(125khz),max7651必须工作在12mhz时钟速度。
电机选型的详细步骤有哪些
人工智能将会让我们的生活变得更加美好
红外热成像非接触测温在线诊断系统具备的主要功能以及在铁水罐、鱼雷罐和钢包中的应用
老笔记本升级“易筋经”
PCB线路板板面为什么会起泡
SPI外设与MAX7651处理器的接口
Vishay新款12V芯片级MOSFET可有效降低超便携产品功耗
苹果发布iOS12.2第四个开发者测试版 加入全新动话表情并新增5GE图标
华硕将在国内首次展出一系列X570主板新品
国产芯片系列开发板-RK3399 A40i T3性能大PK-飞凌嵌入式
新型温湿度自动控制系统的设计与应用?
新型光电探测器,有出色的传感和成像能力
电源设计中最常见的四种滤波电路原理及特点解析
Power-One推出No-总线数字POL转换器
LT3970 具2.5μA 静态电流和集成二极管的40V、3
带宽性能要求与噪声性能要求冲突时,应该如何取舍呢?
深度学习背景下的图像三维重建技术进展综述
IQS572-B000投射电容式触摸和接近触控板/触摸屏控制器IC系列
如何使用比特币冷库来为比特币提供最大的安全保障
过电压是怎么形成的?过电压产生的原因解析