I2C和SPI作为两种非常常用的低速外部总线,已经不是什么新新技术了。 
有些知识点,明白了,一段时间不用了,又忘记了。所以决定乘最近正好碰过这两个东西,还是写下来以备后患。

I2C

I2C是以前的飞利浦半导体制定的标准,也就是如今的NXP。

I2C总线由一条数据线(SDA)和一条时钟线(SCL)组成。设备分主从,主设备提供时钟,并发起操作。 

看一下这张I2C协议必须和可选的功能表。最简单的模式的话,只需要实现4个功能,start、stop、ack、7bit address。 

当scl为高时,sda下拉表示start。当scl为低时,sda上拉表示stop。 

根据下面这个图,我们来讨论这4个基本功能。

  • master控制sda、scl:发起一个start标记
  • master控制sda、scl:start之后的1-7位表示的是slave设备的7bit address
  • master控制sda、scl:第8位表示是读(1)还是写(0)操作,所以我们其实可以把7bit address和这1bit读写位结合起来当成一个byte。
  • master控制scl,slave控制sda:slave强制拉低sda来表示第9位为ack

分析好了这第一个byte的内容,就可以继续后面更复杂的了。这个时序一共进行了2个byte的写操作。 
- master控制sda、scl:start 
- master控制sda、scl:7位地址 
- master控制sda、scl:1位写 
- master控制scl,slave控制sda:slave ack 
- master控制sda、scl:1字节数据 
- master控制scl,slave控制sda:slave ack 
- master控制sda、scl:1字节数据 
- master控制scl,slave控制sda:slave ack 
- master控制sda、scl:stop 

再看个读操作的 
- master控制sda、scl:start 
- master控制sda、scl:7位地址 
- master控制sda、scl:1位读 
- master控制scl,slave控制sda:slave ack 
- master控制scl,slave控制sda:1字节数据 
- master控制sda、scl:master ack 
- master控制scl,slave控制sda:1字节数据 
- master控制sda、scl:master ack 
- master控制sda、scl:stop 

纯粹的读和纯粹的写我们都会了,下面就要读写混合了。最常见的场景就是通过I2C从设备那读取某个寄存器的值。 
- master控制sda、scl:start 
- master控制sda、scl:7位地址 
- master控制sda、scl:1位写 
- master控制scl,slave控制sda:slave ack 
- master控制sda、scl:1字节数据 
- master控制scl,slave控制sda:slave ack 
- master控制sda、scl:start 
- master控制sda、scl:7位地址 
- master控制sda、scl:1位读 
- master控制scl,slave控制sda:slave ack 
- master控制scl,slave控制sda:1字节数据 
- master控制sda、scl:master ack 
- master控制sda、scl:stop 

基本功能的I2C介绍就这些了,但是刚才说到I2C还有许多的可选功能,譬如clock stretching功能,这次就遇到一个bug和这个功能有关。

我们再来看看刚才看过的这个图,在第一个byte传输完之后的一段时间内,scl为低。为什么会出现这种情况那?其实不一定是在第一个字节之后,也可能是master要从slave那读取某个寄存器的值,第一个字节的slave address发过去了,然后第二个字节的寄存器地址又发过去了,后面就该slave来返回一个byte的数据了。但是可能这个数据并不是那么简单的得到的,slave可能会先进入中断,然后做一些计算才能得到要返回的值,而这个计算又比较耗时。那slave可以强制拉低scl来表示现在我在忙,要等我做完事情了才可以继续返回数据。假如slave有这种功能,而master又不支持,那就完蛋了,数据全乱了。幸好,我们的master是CPLD的,通过修改支持了这个功能,操作就正常了。 

SMBUS

SMBUS是一种基于I2C而扩展出来的协议。有一些更为复杂的操作,但是原理都还是基于I2C的。 

PMBUS

PMBUS是基于SMBUS,定义了很多和电源管理相关的命令。在物理传输上,和SMBUS是完全一致的。

SPI

SPI有四根线,一根时钟,一根收数据,一根发数据,一根片选。当有多个设备时,他就需要多根片选,所以相比I2C而言,布线更为复杂。 

SPI只规定了如何收发数据,但是数据的具体格式含义并没有定义。譬如在I2C中跟在7位地址后面的1位表示读写,所有设备都需要遵循。但是SPI不是这样,每个slave都有自己定义的数据格式,各不相同。我们先看看下面这个例子。master发送的第一个字节里01表示写,而05表示读。根据第一个字节的不同,slave会做出不一样的响应。 
 
 
而我还见过一种是slave规定,master发给slave的前两个字节代表寄存器的地址,但是0-15位的第15位不当地址来用,而当读写位来用,但是我找不到这个例子的时序图了。我举这个例子是想说明SPI传输数据必须要根据slave设备的timing来,不可想当然。

I2C(smbus、pmbus)和SPI协议分析相关推荐

  1. USB 之三 常用抓包/协议分析工具(Bus Hound、USBlyzer、USBTrace、USB Monitor Pro等)

    简介 在学习 USB 时,尝试了许多工具.有些是纯软件工具,有些是需要硬件配合.以下仅仅做个记录. Bus Hound   一个比较轻量级纯软件工具,软件界面看着就像上一个世纪的风格.官网为http: ...

  2. 【嵌入式基础】基于IIC和SPI协议的温湿度采集与OLED显示

    本文主要介绍IIC总线通信协议和SPI协议,并使用STM32系列芯片基于IIC协议实现AHT20温湿度传感器上位机数据采集,基于SPI协议实现OLED显示. 目录 一.IIC总线通信协议 1.IIC协 ...

  3. 基于SPI协议OLED屏显实例

    目录 一.SPI协议 1.1 SPI简介 1.2 SPI四线 1.3 SPI四种工作模式 1.4 SPI时序图 二.项目实现 2.1 实验准备 2.2 字模提取 2.3 程序代码 2.4 硬件连接 2 ...

  4. STM32常用协议之SPI协议详解

    SPI协议详解 SPI协议简介 一.SPI物理层 二.SPI协议层 2.1 SPI基本通信过程 2.2 通信的起始和终止信号 2.3 数据有效性 2.4 CPOL/CPHA及通信模式 三.编程实现 四 ...

  5. Linux·SPI驱动分析和实例

    目录 1.I2C 驱动框架回顾 2.SPI 框架简单介绍 3.master 驱动框架 3.1 驱动侧 3.2 设备侧 4.SPI 设备驱动框架 4.1 设备层 4.2 驱动侧 5.设备驱动程序实例 1 ...

  6. spi协议时序图和四种模式实际应用详解

    大家好,我是无际. 上个章节我们讲解了spi接口定义,今天我们更加深入讲解下spi协议时序图和spi四种模式的用法. 刚开始接触单片机开发时,最怕就是看时序图,对于我来说就是奇怪的知识. 特别是SPI ...

  7. 几种常用通信协议:IIC协议、SPI协议、UART协议

    通信可以形象的比喻成两个人讲话:1.你说的别人得能听懂:双方约定信号的协议.2.你的语速别人得能接受:双方满足时序要求. 一.IIC协议: 2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一 ...

  8. 串行总线 —— I2C、UART、SPI

    I2C,也叫 IIC,是一种常见的串行总线,它只需要两根线即可在连接于总线上的器件之间传送信息. 0. 电气知识 开漏输出:Open drain output,不输出电压,低电平时接地,高电平时不接地 ...

  9. 04【Verilog实战】SPI协议底层硬件接口设计(附源码RTL/TB)

    脚  本:makefile 工  具:vcs 和 verdi 写在前面 这个专栏的内容记录的是个人学习过程,博文中贴出来的代码是调试前的代码,方便bug重现. 调试后的程序提供下载,[下载地址] 发现 ...

  10. 【FPGA】SPI协议

    1.SPI简介 SPI(Serial Perripheral Interface, 串行外围设备接口)是 Motorola 公司推出的一种同步串行接口技术.SPI 总线在物理上是通过接在外围设备微控制 ...

最新文章

  1. 开发日记-20190523 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  2. Django框架(18.Django中的自定义错误500页面和不存在404页面)
  3. mysql从zip包安装小记
  4. Task02:SQL基础查询与排序-天池龙珠计划SQL训练营
  5. 前端每日实战:62# 视频演示如何用纯 CSS 创作一只蒸锅
  6. python深度学习库tensorflow——实现FC卷积神经网络识别mnist手写体
  7. 使用纯生js实现图片轮换
  8. caffe的protocol buffer使用例子
  9. Rancher快速入门
  10. python常用的一些东西——sys、os等(转)
  11. oracle和plsqldev的安装,win7x64下成功安装ORACLE客户端和PLSQLDEV!
  12. 微信小程序如何上传图片
  13. 行式 Excel 文件去重
  14. java 微信网页授权_java微信网页授权获取openid(第十四课)
  15. 概率学习总结笔记(扑克概率)
  16. 关于xxl-job终止任务但程序没有停止的问题
  17. Maxima解方程的一点收获
  18. java单根结构_java“单根继承结构”
  19. 链路聚合,链路聚合是什么意思
  20. ​宝尊电商年亏2亿:阿里又成大股东 软银大幅减持

热门文章

  1. U盘的基础知识介绍量产
  2. ActivityGroup简介
  3. MSDN下载的win7 32位原版镜像无法安装vmtools和提示安装程序无法自动安装Virtual Machine Communication Interface(VMCI)驱动程序
  4. 【实验报告】LFM信号产生与频谱分析(记录一次实验:《电类综合实验》)
  5. 后台扫描工具 - 御剑(珍藏版)附下载
  6. html格式转换wps表格,用WPS Office轻松实现教案格式转换
  7. 十年磨一剑!腾讯QQ Linux版 2.0.0 Beta重磅发布!
  8. 模式识别实验报告--贝叶斯分类器设计
  9. matlab 半方差分析,地统计学半方差分析几个名词含义说明
  10. Java+spring+springmvc 基于ssm的银行排队叫号系统#毕业设计