SPI外设与MAX7651处理器的接口

描述

本文介绍如何将 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时钟速度。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分