当前位置: 首页 > news >正文

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.1,2 SPI驱动实验-SPI协议介绍

前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

SPI学习参考资料:

简述SPI通信协议-01_cpha选择为第一个边沿-CSDN博客

SPI中的CPHA,CPOL详解-CSDN博客

正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第24讲 SPI驱动。本节将参考正点原子的视频教程第24讲和配套的正点原子开发指南文档进行学习。

0. 概述

通I2C一样,SPI是很常用的通信接口,也可以通过SPI来连接众多的传感器。相比I2C接口,SPI接口的通信速度很快,I2C最多400KHz,但是SPI可以到达即使MHz。I.MX6U 也有4个SPI接口,可以通过这4个SPI接口来连接一些SPI外设。I.MX6U-ALHPA使用SPI3接口连接了一个6周传感器 ICM-20608,本章我们就来学习如何使用I.MX6U的SPI接口来驱动ICM-20608,读取ICM-20608的六轴数据。

1. SPI简介

上一章我们讲解了I2C,I2C是串行通信的一种,只需要两根线就可以完成主机和从机之间的通信,但是I2C的速度最高只能到400KHz,如果对于访问速度要求比较高的话I2C就不适合了。本章我们就来学习另外一个和I2C一样广泛使用的串行协议:SPI,SPI的全称是 Serial Peripheral Interface,也就是串行外围设备接口。SPI是Motorola公司推出的一种同步串行接口技术,是一种高速,全双工的同步通信协议,SPI时钟频率相比I2C要高很多,最高可以工作到上百Mhz。SPI以主从方式工作,通常是有一个主设备和一个或多个从设备,一般SPI需要4根线,但是也可以使用三根线(单向传输),本章我们讲解标准的4线SPI,这4根线如下:

  1. CS/SS, Chip Select/Slave Select,这个是片选信号线,用于选择需要进行通信的从设备。I2C主机是通过发送从机设备地址来选择需要进行通信的从设备的,SPI主机不需要发送从机设备地址,而是直接将相应的从机设备片选信号拉低。
  2. SCK,Serial Clock,串行时钟,和I2C的SCL一样,为SPI通信提供时钟。
  3. MOSI/SDO,Master Out Slave In/Serial Data Output,简称主出从入线,这根数据线只能用户主机向从机发送数据,也就是主机输出,从机输入。
  4. MISO/SDI,Master In Slave Out/Serial Data Input,简称主入从出线,这根数据线只能用于从机向主机发送数据,也就是主机输入,从机输出。

SPI 通信都是由主机发起的,主机需要提供通信的时钟信号。主机通过SPI线连接多个从设备的结构如下图所示:

 

1.1 SPI工作模式

SPI由四种工作模式,通过串行时钟极性(CPOL: Clock Polity)和相位(CPHA:Clock Phase)的搭配来得到四种工作模式:

描述
CPOL=0串行时钟空闲状态为低电平
CPOL=1

串行时钟空闲状态为高电平

此时可以通过配置时钟相位CPHA(Clock Phase)来选择具体的传输协议

CPHA=0串行时钟的第一个跳变沿(上升沿或下降沿)来采集数据
CPHA=1串行时钟的第二个跳变沿(上升沿或下降沿)来采集数据

这四种工作模式如下图所示:

1.2 什么是SPI的 CPHA 第一个上升沿,第二个上升沿?

SPI协议的CPHA(Clock Phase)相位决定是在第一个跳变沿还是在第二个跳变沿采集数据,那么什么时第一个跳变沿,什么又是第二个跳变沿哪?问下"百度AI助手好了",结果输出如下:

但是,百度AI助手大模型这里总结提炼的东西大部分是正确,但是中间的CPOL(Clock Polarity)和CPHA(Clock Phase)组合之后的采集沿是在第一个跳变沿采集还是在第二个跳变沿采集,百度AI助手大模型搞错了。这就是AI大模型助手的问题,有时间会给出看似正确但是实际上细节错误的东西。

不过这些百度AI助手提取出来的信息对于我来讲还是有效的,第一它给出了一些SPI CPOL(Clock Polarity)和CPHA(Clock Phase)的组合概念提炼,第二它给出了引用链接来源,我去读一下它的引用链接不就能得到有用信息了么,赞。

把百度AI助手提供的有用信息总结一下就是:

SPI协议中的CPHA(Clock Phase)决定了数据传输采样和移位方式,具体涉及到时钟信号的跳变沿。在一个时钟周期内,会有两次跳变沿:上升沿(从低电平到高电平的变化)和下降沿(从高电平到低电平的变化)。

  • 当CPHA=0时,表示数据在使用信号的第一个跳变沿(即上升沿或下降沿,具体取决于CPOL的设置)进行采样。
  • 当CPHA=1时,表示数据在时钟信号的第二个跳变边沿进行采样。

结合CPOL(Clock Polarity)的设置,可以形成SPI的四种工作模式:

  1. Mode0 (CPOL=0, CPHA=0):数据在时钟的第一个跳变沿采样,因为CPOL=0 低电平表示空闲Idle,所以第一个跳变沿是上升沿(由低到高)采样。
  2. Mode1 (CPOL=0, CPHA=1):数据在时钟的第二个跳变沿采样,因为CPOL=0 低电平表示空闲Idle,所以第二个跳变沿是下降沿(由高到低)采样。
  3. Mode2 (CPOL=1, CPHA=0):数据在时钟的第一个跳变沿采样,因为CPOL=1 高电平表示空闲Idle,所以第一个跳变沿是下降沿(由高到低)采样。
  4. Mode3(CPOL=1, CPHA=1):数据在时钟的第二个跳变沿采样,因为CPOL=1 高电平表示空闲Idle,所以第二个跳变沿是上升沿(由低到高)采样。

参考如下链接里的博文,给出了总结的图片,图片总结的很完备了

SPI中的CPHA,CPOL详解-CSDN博客

相关文章:

  • 【软件测试】bug篇|软件测试的生命周期|描述bug的要素|bug的级别|bug的生命周期|高频面试题:与开发产⽣争执怎么处理
  • SSL VPN
  • C++系列-定位new表达式(placement-new)
  • 一个程序员的牢狱生涯(40)好事
  • 谈谈BlueStore的BitmapAllocator
  • D - New Friends(AtCoder Beginner Contest 350)
  • 海外仓快递系统哪个好?教你快速选到适合自己的管理系统
  • # linux 中使用 visudo 命令,怎么保存退出?
  • 【网络】高级IO(select||poll||epoll)
  • 中断处理过程介绍
  • 9. C++通过epoll+fork的方式实现高性能网络服务器
  • 前端面试题日常练-day37 【面试题】
  • 合并featurecount产生的多个表达矩阵文件
  • busco,checkM2:基因组或MAG完整度分析
  • Web开发——HTMLCSS
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 2019.2.20 c++ 知识梳理
  • Android开源项目规范总结
  • C++类中的特殊成员函数
  • JS学习笔记——闭包
  • LeetCode18.四数之和 JavaScript
  • MySQL-事务管理(基础)
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • OSS Web直传 (文件图片)
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • vue--为什么data属性必须是一个函数
  • 安卓应用性能调试和优化经验分享
  • 初识MongoDB分片
  • 初探 Vue 生命周期和钩子函数
  • 服务器从安装到部署全过程(二)
  • 悄悄地说一个bug
  • 云大使推广中的常见热门问题
  • 再次简单明了总结flex布局,一看就懂...
  • 正则学习笔记
  • 自动记录MySQL慢查询快照脚本
  • 国内开源镜像站点
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #includecmath
  • #Java第九次作业--输入输出流和文件操作
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (11)MSP430F5529 定时器B
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)c52学习之旅-简单了解单片机
  • (附源码)php新闻发布平台 毕业设计 141646
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十)T检验-第一部分
  • (十一)图像的罗伯特梯度锐化
  • (四)linux文件内容查看
  • (一)基于IDEA的JAVA基础10
  • (已解决)什么是vue导航守卫
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。