本文介绍如何将 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 | 30H | ;从从属设备读取 8 位的结果。 |
SPI_Out | EQU | 21小时 | ;我们希望发送给奴隶的数据。 |
;
;最后,我们需要一个循环计数器来跟踪发送 8 位。
;这可以是“R”寄存器 (R0-R7) 或
;任何 RAM 寄存器(不必是位可寻址的)。让我们使用
内存 ;注册。
LOOP | EQU | 30H | ;可以在地图中的任何位置;这只是一个例子。 |
;
;假设调用时,已经设置了片选位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时钟速度。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !