摘要: 本文解释了如何将GPIO端口连接到SPI外设。它定义了SPI协议的基础,信号和SCK信号的四种传输变化。利用MAX7651闪存可编程12位集成数据采集系统实现SPI接口的软件程序。
SPI 总线是许多微处理器外设芯片使用的4线串行通信接口。MAX7651微处理器不包括专用硬件来实现接口。然而,简单的软件例程显示可以发送和接收数据到SPI外设。
SPI接口的4个引脚如下:
SCK(串行数据时钟):数据在SCK的上升沿或下降沿上移位/锁存(见下一节)。
MOSI(主输出/从输入):如果芯片是主人,数据从这个大头针传输,如果芯片是奴隶,则进入这个大头针。
MISO(主输入/从输出):如果芯片是一个主人,数据被接收到这个大头针,如果芯片是一个奴隶,从这个大头针传送出去。
active - low CS (Chip Select, active low):告诉外围设备传输即将开始。
SPI协议根据数据定义了四种SCK相位和极性的组合。如果一个芯片有控制位来设置这四种状态,它们通常被称为CPOL(时钟极性)和CPHA(时钟相位)。SPI总是以8位块传输数据。您可以传输任意数量的8位块。例如,一个16位写断言Active-Low CS从前8位开始直到第16位结束。
CPOL | CPHA | 转移 |
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数据表。信号Active-Low CS是SPI信号Active-Low SS, SCLK是SCK, DIN将连接到MODI,因为外设是Slave,只有输入(无回读)。这部分在传输中使用16位。
图1所示 串行接口时序图。
下面的示例是最常见的SPI传输类型,CPO = 0, CPHA = 0。例程不假设MAX7651的时钟速度,因为I/O端口位只是尽可能快地“敲位”。数据传输时间显示在本节的末尾。
图2显示了MAX7651/ MAX7652与SPI外设之间的典型连接。
图2 通用SPI连接。
注释字段中的数字{N}是执行该指令所需的时钟周期数。
;用于8位外设的SPI数据传输。MAX7651是主控;外设为Slave。
;
;使用以下spi定义的引脚。(有些外设是只写的,所以只需要3根电线。)
;SCK:数据传输时钟
;MISO:主输入数据(来自外设),并不总是使用
;MOSI:主输出数据(到外围设备)
;SS:奴隶选择(激活低)
;
SCK | 装备的 | P1.0 | |
味噌 | 装备的 | P1.1 | |
莫西人 | 装备的 | P1.2 | |
CS | 装备的 | P1.3 | ;使用端口1,但这是100%任意的。使用任何可用的引脚。 |
;
;现在我们需要使用MAX7651中的一些内部RAM作为数据存储。
;为了提高执行速度,这些变量中的两个必须位于RAM区域
;这允许在字节内进行位寻址。在MAX7651中,RAM空间对应
;地址20H至2FH。低于20H或高于2FH的地址不能被位寻址!
SPI_In | 装备的 | 20 h | ;从Slave读取8位的结果。 |
SPI_Out | 装备的 | 21小时 | ;我们希望发送到Slave的数据。 |
;
;最后,我们需要一个循环计数器来跟踪发送8位。
;这可以是'R'寄存器(R0-R7)或
;任何RAM寄存器(不必是位可寻址的)。让我们使用RAM
;登记。
循环 | 装备的 | 30 h | ;可以在地图上的任何地方;这只是一个例子。 |
;
;假设调用时,芯片选择位SS已经设置为1。
SPI_IO: | CLR | SCK | ;SCK开始时很低。{1} |
CLR | CS | ;清除CS后开始数据传输。{1} | |
SETB | 味噌 | ;要用作输入,必须在内部设置。{1} | |
MOV | 循环,# 8 | ;8位要传输。{3} | |
传递: | MOV | C, SPI_Out.7 | ;将第7位移动到进位(SPI首先是MSB)。{2} |
MOV | 莫西人,C | ;I/O端口反映进位,这是数据位。{2} | |
SETB | SCK | ;数据稳定后,生成SCK上升沿。{1} | |
MOV | C,味噌 | ;从Slave读取数据到Carry(可选)。{2} | |
MOV | SPI_In.7 C | ;复制到接收到的数据字节,第7位。{2} | |
CLR | SCK | ;数据读入后产生SCK下降沿。{1} | |
MOV | , SPI_Out | ;累加器是移位操作的临时容器。{2} | |
RL | 一个 | ;向左旋转(但不是通过Carry!){1} | |
MOV | SPI_Out, | ;准备第7位,以便下一次传输到Slave。{2} | |
MOV | , SPI_In | ;获取以前的Slave读取数据。{2} | |
RL | 一个 | ;向左旋转以使下一个位位置进入适当的位置。{1} | |
MOV | SPI_In, | ;保存结果。{2} | |
DJNZ | 循环,传递 | ;递减循环。如果不是零跳到XFER。{3} | |
;传输完成。 | |||
SETB | CS | ;取消断言芯片选择。{1} | |
.END | ;告诉汇编程序代码完成。 |
将8位(包括读和写)传输到Slave的总CPU周期为6 + 8 × 23 + 1 = 191。对于只读或只读,总共是6 + 8 × 18 + 1 = 151个CPU周期。下表显示了使用常见MAX7651时钟速度的各种传输速率。
MAX7651时钟速率 | 比特传输时间 | 总读/写 传输时间 |
12 mhz | 7.95美国(~ 125 khz) | 63.6我们 |
11.0592兆赫 | 8.63美国(~ 116 khz) | 69.08我们 |
4兆赫 | 23.88美国(~ 41.9 khz) | 191年美国 |
从这个表中,我们可以看到最快的SPI字节传输大约是15.7KHz,而最慢的速率是5.2KHz。这比专用的1MHz SPI硬件端口慢得多!因此,如果MAX7651要用作Slave,那么SPI Master必须设置为最慢的比特传输速度(125KHz),并且MAX7651必须在12MHz时钟速度下工作。
社群二维码
关注“华强商城“微信公众号
Copyright 2010-2023 hqbuy.com,Inc.All right reserved. 服务热线:400-830-6691 粤ICP备05106676号 经营许可证:粤B2-20210308