串行外设接口(Serial Peripheral Interface)是一种同步外设接口,它可以使单片机与各种外围设备以串行方式进行通信以交换信息。SPI最早是Motorola公司提出的全双工三线同步串行外围接口,采用主从模式(Master—Slave)架构,支持一个或多个Slave设备,由于其简单实用、性能优异,因此许多厂家的设备都支持该接口,广泛应用于单片机和外设模块之间的连接。

SPI接口只需4条线:串行时钟线(SCK)、主机输入/从机输出数据线(MISO)、主机输出/从机输人数据线(MOSI)和低电平有效的从机选择线(SS)。
(1)MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
(2)MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
(3)SCK:串口时钟,作为主设备的输出,从设备的输入。
(4)SS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为片选引脚,让主设备可以单独地与特定从设备通信,避免数据线上的冲突。

SPI是一个环形总线结构,MOSI引脚相互连接,MISO引脚相互连接,数据在主和从之间串行地传输(MSB位在前),具体如下图所示。

SPI有主从两种工作模式,在主模式下,SPI为其他节点的CLK引脚提供串行时钟,数据从MOSI引脚输出,从MISO引脚输入。在从模式下,数据从MISO引脚移出并由MOSI引脚移入,CLK引脚作为串行移位时钟的输入。

LPC824片内设计有SPI接口,具体的引脚取决于开关矩阵SWM的配置。
LPC824的SPI接口具有以下特点:
•直接支持1至16位的数据发送。软件支持更大的帧。
•主机和从机操作。
•无需读取输入数据即可将数据发送至从机,这在设置SPI存储器的时候很有用。
•控制信息还可与数据一同写入,这样便实现了极为丰富的操作,包括任意长度的帧。
•最多4个从机选择输入/输出,极性可选且使用灵活。
•支持DMA传输,SPIn发送与接收功能可配合系统DMA控制器使用。

下图是SPI接口的功能框图。

在LPC824中,一共有两组SPI接口,分别为SIP0和SPI1。其中SPI0组接口有7根引脚(SCK、MOSI、MISO及SSEL0~3),SPI1组接口有5根引脚(SCK、MOSI、MISO及SSEL0~1)。在默认状态下,这些引脚并没有被分配到芯片的物理引脚上,所以在使用SPI功能之前,需要先配置SWM矩阵,以把这些引脚部分或全部连接到物理引脚上。下面给出了这些引脚各自的SWM配置寄存器。

从上表中可以看出,两个SPI接口的共12个引脚可以被分配到任意一个物理引脚上,涉及的配置寄存器为PINASSIGN3~PINASSIGN6共4个,接下来就分别给出这4个寄存的具体结构。

下表给出的是引脚分配寄存器PINASSIGN3的全部位结构,其字节地址为0x4000C00C。

(1)第0到7位为串口USART2中的请求发送端RTS分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(2)第8到15位为串口USART2中的清除发送端CTS分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(3)第16到23位为串口USART2中的同步时钟端SCLK分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(4)第24到31位为SPI0接口中的时钟端SCK分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。

下表给出的是引脚分配寄存器PINASSIGN4的全部位结构,其字节地址为0x4000C010。

(1)第0到7位为SPI0接口中的主出从入端MOSI分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(2)第8到15位为SPI0接口中的主入从出端MISO分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(3)第16到23位为SPI0接口中的片选端SSEL0分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(4)第24到31位为SPI0接口中的片选端SSEL1分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。

下表给出的是引脚分配寄存器PINASSIGN5的全部位结构,其字节地址为0x4000C014。

(1)第0到7位为SPI0接口中的片选端SSEL2分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(2)第8到15位为SPI0接口中的片选端SSEL3分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(3)第16到23位为SPI1接口中的时钟端SCK分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(4)第24到31位为SPI1接口中的主出从入端MOSI分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。

下表给出的是引脚分配寄存器PINASSIGN6的全部位结构,其字节地址为0x4000C018。

(1)第0到7位为SPI1接口中的主入从出端MISO分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(2)第8到15位为SPI1接口中的片选端SSEL0分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(3)第16到23位为SPI1接口中的片选端SSEL1分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。
(4)第24到31位为多功能定时/计数器SCT的计数输入端PIN0分配引脚,可选范围从PIO0_0到PIO0_28一共29根引脚,默认为未分配状态。

下表给出了SPI接口用到的全部寄存器描述。

由于LPC824的SPI接口功能很完善,所以涉及到的寄存器较多,它一共使用了11个寄存器来进行控制,应用上有些复杂。下面给出了上述寄存器对应的结构体定义。

typedef struct {
__IO uint32_t CFG;
__IO uint32_t DLY;
__IO uint32_t STAT;
__IO uint32_t INTENSET;
__O uint32_t INTENCLR;
__I uint32_t RXDAT;
__IO uint32_t TXDATCTL;
__IO uint32_t TXDAT;
__IO uint32_t TXCTL;
__IO uint32_t DIV;
__I uint32_t INTSTAT;
} LPC_SPI0_Type;

为了将2个SPI的基址指针强制转换为上述结构体,还要加上下面的定义。

#define LPC_SPI0_BASE 0x40058000UL
#define LPC_SPI1_BASE 0x4005C000UL
#define LPC_SPI0 ((LPC_SPI0_Type *) LPC_SPI0_BASE)
#define LPC_SPI1 ((LPC_SPI0_Type *) LPC_SPI1_BASE)

SPI接口涉及到的寄存器较多,后面会对它们进行具体分析。

--待续--

SPI接口的更多相关文章

  1. spi接口的ds1302时钟芯片控制在lcd1602上显示

    spi接口的ds1302时钟芯片控制在lcd1602上显示                                                                        ...

  2. CC3000 SPI接口编程介绍

    CC3000 SPI 操作: CC3000的SPI 是基于五根线CLCK,CSn,IRQ,MISO,MOSI:通信模式如下图: CLCK:时钟频率0-26M从主机到从机,提供SPI接口时钟 CSn:低 ...

  3. Blackfin DSP(五):BF533的SPI接口

    533SPI的特性 最高速度可达SCLK/4: 支持主模式和从模式: 可使用8个GPIO口作为从选择线: 1 slave select input pins 7 slave select output ...

  4. 高通APQ8074 spi 接口配置

    高通APQ8074 spi 接口配置 8074 平台含有两个BLSP(BAM Low-Speed Peripheral) , 每一个BLSP含有两个QUP, 每一个QUP可以被配置为I2C, SPI, ...

  5. 自定义AXI总线形式SPI接口IP核,点亮OLED

    一.前言 最近花费很多精力在算法仿真和实现上,外设接口的调试略有生疏.本文以FPGA控制OLED中的SPI接口为例,重新夯实下基础.重点内容为SPI时序的RTL设计以及AXI-Lite总线分析.当然做 ...

  6. SPI接口扫盲 SPI定义/SPI时序(CPHA CPOL)

    SPI接口扫盲   douqingl@gmail.com   为何要写这篇文档?百度上找出来的SPI接口中文描述都说的太过简略,没有一篇文档能够详尽的将SPI介绍清楚的.wikipedia英文版[注释 ...

  7. SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

    SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART( ...

  8. flash读写学习笔记与spi接口及简单测试验证(三)

    FPGA中的视频图像资源,以及想要永久存储的程序都是要存储在flash中,flash是FPGA一个不可缺少的部分,flash的种类有很多,根据winbond公司的128Mbit Qual SPI接口的 ...

  9. linux驱动基础系列--Linux下Spi接口Wifi驱动分析

    前言 本文纯粹的纸上谈兵,我并未在实际开发过程中遇到需要编写或调试这类驱动的时候,本文仅仅是根据源码分析后的记录!基于内核版本:2.6.35.6 .主要是想对spi接口的wifi驱动框架有一个整体的把 ...

  10. SPI接口的ETH芯片(ENC28J60/W5500)

    一 ENC28J60:SPI接口.中断.复位.LED指示.可参看野火相应教程.简单的在单片机中实现网页服务器是参考AVRNET项目,复杂的是用LWIP协议栈.telnet用于用PC的TELNET可以远 ...

随机推荐

  1. leetcode 31. 下一个排列 【时间击败 100%】 【内存击败 92.17%】

    对于该题,我本来兴致勃勃地想到了两个优化,但从提交结果来看根本看不出来有什么区别,但我发4我说的都是真的 -3- 1 public void nextPermutation(int[] nums) { ...

  2. VUE学习-列表渲染

    列表渲染 v-for <!-- v-for="(v,k,i) in arr/obj" --> <ul id="app"> <li ...

  3. VS 生成事件 xcopy 报错的解决方法

    出现这种情况有可能原因有2种可能: 1.目标文件夹设为只读:此时报错:MSB3073 代码4 ,输出显示:访问遭到拒绝. 解决:去掉文件夹只读属性. 2.缺少环境变量:报错为::MSB3073 代码9 ...

  4. 退役*CPCer的找实习总结

    从2月底开始到今天,我终于拿到了第一个也是唯一一个offer(字节跳动).找实习的过程告一段落,所以想记录一下这段时间的经历. 最开始找$meopass$学长内推了小马智行,很快就接到了面试通知(再次 ...

  5. python使用win32gui操作窗口

    激活指定窗口 import win32gui import win32con def match_windows(win_title): """ 查找指定窗口 :para ...

  6. USB从机主动断开连接

    目录 在一些情况下,需要USB口的引脚复用成其他功能,比如说PB10.PB11要复用成定时器输出引脚:或者需要USB从机主动断开,类似某些杀毒软件带的"安全弹出",不过杀毒软件操作 ...

  7. 原生js创建节点,添加节点,删除节点

    1.操作 var tab=document.querySelector('#app .bpm-container'); var abcbox=document.querySelector('.abcb ...

  8. nodejs查询

    const tagModel = require("../mongodb"); 1 const mongoose = require("mongoose"); ...

  9. Linux 第七节(LVM,网卡配置)

    LVM 逻辑卷管理器: 解决分区灵活调整大小问题 PV 物理卷 VG 卷组 LV 逻辑卷 pvcreate /dev/sdc vgcreate xiaochong  /dev/sdb /dev/sdc ...

  10. springboot整合mybatis以及mybatis源码分析

    1.@ComponentScan basePackages与value: 用于指定包的路径,进行扫描 basePackageClasses: 用于指定某个类的包的路径进行扫描 nameGenerato ...