- 如何学习单片机
- 学习什么单片机
- 如何学习单片机
- 单片机学习的准备工作
- 单片机开发环境搭建 - Keil uVision4 安装教程
- Keil uVision4 简单使用教程
- 第一章问题汇总
- 点亮你的 LED 灯
- 单片机内部资源(内部结构)
- 单片机最小系统 [配图] [超详细]
- 单片机上的发光二极管(LED 灯)
- 51 单片机特殊功能寄存器和位定义
- 使用 Keil uVision 新建一个工程
- 第一个单片机程序(C 语言编写)
- 将程序下载到单片机
- 单片机硬件基础知识学习
- 电磁干扰 EMI
- 单片机中去耦电容的应用
- 三极管的的概念及其工作原理
- 单片机中三极管的应用
- 单片机中 74HC138 三八译码器的应用
- 单片机 LED 灯闪烁程序
- C 语言基础及流水灯的实现
- 二进制、十进制和十六进制
- C 语言变量类型和范围
- C 语言基本运算符
- C 语言 for 循环语句
- C 语言 while 循环语句
- C 语言函数的简单介绍
- 单片机延时方法(Keil 软件延时)
- 单片机 LED 流水灯程序[详细]
- 单片机定时器与数码管基础
- 单片机逻辑电路与逻辑运算
- 单片机定时器介绍
- 单片机定时器的寄存器
- 单片机中定时器的应用
- 单片机中 LED 数码管的介绍
- 单片机数码管的真值表
- 单片机数码管的静态显示
- 单片机的中断与数码管动态显示
- C 语言数组
- C 语言 if 语句
- C 语言 switch 语句
- 单片机数码管动态显示程序[带解释]
- 单片机数码管显示消隐
- 单片机中断系统
- 单片机中断的优先级
- 变量进阶与点阵 LED
- C 语言变量的作用域
- C 语言变量的存储类别
- 单片机 LED 点阵的介绍
- 单片机 LED 点阵的图形显示
- 单片机 LED 点阵的纵向移动(动态显示)
- 单片机 LED 点阵的横向移动(动态显示)
- C 语言函数进阶与单片机按键
- 单片机最小系统解析(电源、晶振和复位电路)
- C 语言函数的调用
- C 语言函数的形参和实参
- 单片机按键(独立按键和矩阵按键)
- 单片机独立按键扫描程序
- 单片机按键消抖程序
- 单片机矩阵按键的扫描
- 单片机简易加法计算器程序
- 单片机中的步进电机与蜂鸣器
- 单片机 IO 口的结构
- 单片机上下拉电阻
- 电机的分类
- 28BYJ-48 步进电机原理
- 让 28BYJ-48 步进电机转起来
- 28BYJ-48 步进电机转动精度与深入分析
- 28BYJ-48 步进电机控制程序基础
- 实用的 28BYJ-48 步进电机控制程序
- 单片机蜂鸣器控制程序和驱动电路
- 单片机实例练习与经验积累
- 单片机数字秒表程序
- 单片机中 PWM 的原理与控制程序
- 单片机交通灯控制程序和设计原理
- 51 单片机 RAM 区域的划分
- 单片机长短按键的应用
- UART 串口通信
- 单片机串行通信介绍
- RS232 通信接口
- USB 转串口通信
- 单片机 IO 口模拟 UART 串口通信
- UART 串口通信的基本应用
- 单片机通信实例与 ASCII 码
- C 语言指针基础与 1602 液晶的初步认识
- C 语言变量的地址
- C 语言指针变量的声明
- C 语言指针的简单示例
- C 语言指向数组元素的指针
- C 语言字符数组和字符指针
- 1602 液晶介绍(电路和引脚图)
- 1602 液晶的读写时序介绍
- 1602 液晶指令介绍
- 1602 液晶简单显示程序
- 单片机 1602 液晶与串口的应用实例
- 单片机通信时序解析
- 1602 液晶整屏移动程序
- 多个.c 文件的初步认识
- 单片机计算器程序设计[详细]
- 单片机串口通信原理和控制程序
- 单片机 I2C 总线与 EEPROM
- 单片机 I2C 时序介绍
- 单片机 I2C 寻址模式
- 单片机 EEPROM 简介
- 单片机 EEPROM 单字节读写操作时序
- 单片机 EEPROM 多字节读写操作时序
- 单片机 EEPROM 的页写入
- 单片机 I2C 和 EEPROM 的综合编程
- 实时时钟 DS1302
- BCD 码介绍
- 单片机 SPI 通信接口
- 实时时钟芯片 DS1302 介绍
- DS1302 的硬件信息
- DS1302 寄存器介绍
- DS1302 通信时序介绍
- DS1302 的 BURST 模式
- C 语言复合数据类型(结构体,共用体,枚举类型)
- 单片机电子时钟程序设计
- 红外通信与 DS18B20 温度传感器
- 红外光的基本原理
- 红外遥控通信原理
- NEC 协议红外遥控器
- 温度传感器 DS18B20
- 模数转换 A/D 与数模转换 D/A
- A/D 和 D/A 的基本概念
- A/D(模数转换) 的主要指标
- PCF8591 硬件接口(电路图引脚图)
- PCF8591 应用程序
- A/D 差分输入信号
- D/A 输出
- 单片机信号发生器程序
- RS485 通信与 Modbus 协议
- 单片机 RS485 通信接口、控制线、原理图及程序实例
- Modbus 通信协议介绍
- 单片机 Modbus 多机通信程序设计
单片机 SPI 通信接口
UART、I2C 和 SPI 是单片机系统中最常用的三种通信协议。前边我们已经学了 UART 和 I2C 通信协议,这节课我们来学习剩下的 SPI 通信协议。
SPI 是英语 Serial Peripheral Interface 的缩写,顾名思义就是串行外围设备接口。SPI 是一种高速的、全双工、同步通信总线,标准的 SPI 也仅仅使用 4 个引脚,常用于单片机和 EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。SPI 通信原理比 I2C 要简单,它主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的 SPI 是 4 根线,分别是 SSEL(片选,也写作 SCS)、SCLK(时钟,也写作 SCK)、MOSI(主机输出从机输入 Master Output/Slave Input)和 MISO(主机输入从机输出 Master Input/Slave Output)。
SSEL:从设备片选使能信号。如果从设备是低电平使能的话,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通信。
SCLK:时钟信号,由主机产生,和 I2C 通信的 SCL 有点类似。
MOSI:主机给从机发送指令或者数据的通道。
MISO:主机读取从机的状态或者数据的通道。
在某些情况下,我们也可以用 3 根线的 SPI 或者 2 根线的 SPI 进行通信。比如主机只给从机发送命令,从机不需要回复数据的时候,那么 MISO 就可以不要;而在主机只读取从机的数据,不需要给从机发送指令的时候,那 MOSI 就可以不要;当一个主机一个从机的时候,从机的片选有时可以固定为有效电平而一直处于使能状态,那么 SSEL 就可以不要;此时如果再加上主机只给从机发送数据,那么 SSEL 和 MISO 都可以不要;如果主机只读取从机送来的数据,SSEL 和 MOSI 都可以不要。
3 线和 2 线的 SPI 大家要知道怎么回事,实际使用也是有应用的,但是当我们提及 SPI 的时候,一般都是指标准 SPI,都是指 4 根线的这种形式。
SPI 通信的主机也是我们的单片机,在读写数据时序的过程中,有四种模式,要了解这四种模式,首先我们得学习以下两个名词。
CPOL:Clock Polarity,就是时钟的极性。时钟的极性是什么概念呢?通信的整个过程分为空闲时刻和通信时刻,如果 SCLK 在数据发送之前和之后的空闲状态是高电平,那么就是 CPOL=1,如果空闲状态 SCLK 是低电平,那么就是 CPOL=0。
CPHA:Clock Phase,就是时钟的相位。
主机和从机要交换数据,就牵涉到一个问题,即主机在什么时刻输出数据到 MOSI 上而从机在什么时刻采样这个数据,或者从机在什么时刻输出数据到 MISO 上而主机什么时刻采样这个数据。同步通信的一个特点就是所有数据的变化和采样都是伴随着时钟沿进行的,也就是说数据总是在时钟的边沿附近变化或被采样。而一个时钟周期必定包含了一个上升沿和一个下降沿,这是周期的定义所决定的,只是这两个沿的先后并无规定。又因为数据从产生的时刻到它的稳定是需要一定时间的,那么,如果主机在上升沿输出数据到 MOSI 上,从机就只能在下降沿去采样这个数据了。反之如果一方在下降沿输出数据,那么另一方就必须在上升沿采样这个数据。
CPHA=1,就表示数据的输出是在一个时钟周期的第一个沿上,至于这个沿是上升沿还是下降沿,这要视 CPOL 的值而定,CPOL=1 那就是下降沿,反之就是上升沿。那么数据的采样自然就是在第二个沿上了。
CPHA=0,就表示数据的采样是在一个时钟周期的第一个沿上,同样它是什么沿由 CPOL 决定。那么数据的输出自然就在第二个沿上了。仔细想一下,这里会有一个问题:就是当一帧数据开始传输第一个 bit 时,在第一个时钟沿上就采样该数据了,那么它是在什么时候输出来的呢?有两种情况:一是 SSEL 使能的边沿,二是上一帧数据的最后一个时钟沿,有时两种情况还会同时生效。
我们以 CPOL=1/CPHA=1 为例,把时序图画出来给大家看一下,如图 15-1 所示。
图 15-1 SPI 通信时序图(一)
大家看图 15-1 所示,当数据未发送时以及发送完毕后,SCK 都是高电平,因此 CPOL=1。可以看出,在 SCK 第一个沿的时候,MOSI 和 MISO 会发生变化,同时 SCK 第二个沿的时候,数据是稳定的,此刻采样数据是合适的,也就是上升沿即一个时钟周期的后沿锁存读取数据,即 CPHA=1。注意最后最隐蔽的 SSEL 片选,这个引脚通常用来决定是哪个从机和主机进行通信。剩余的三种模式,我们把图画出来,简化起见把 MOSI 和 MISO 合在一起了,大家仔细对照看看研究一下,把所有的理论过程都弄清楚,有利于你对 SPI 通信的深刻理解,如图 15-2 所示。
图 15-2 SPI 通信时序图(二)
在时序上,SPI 是不是比 I2C 要简单的多?没有了起始、停止和应答,UART 和 SPI 在通信的时候,只负责通信,不管是否通信成功,而 I2C 却要通过应答信息来获取通信成功失败的信息,所以相对来说,UART 和 SPI 的时序都要比 I2C 简单一些。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论