首页 > 其他分享 >【IIC】通过Arduino的SoftI2C库学习IIC通信

【IIC】通过Arduino的SoftI2C库学习IIC通信

时间:2023-12-23 12:22:21浏览次数:33  
标签:SCL 信号 高电平 Arduino SDA IIC SoftI2C 设备

【IIC】通过Arduino的SoftI2C库学习IIC通信

SoftIC库

SoftI2C库是Arduino的一个第三方库,可以通过软件模拟IIC时序与其他设备进行通信。可以实现与Wire库一样的功能。

SoftI2C库的官方链接:https://www.arduino.cc/reference/en/libraries/softi2c/

相关的API函数如下所示:

IIC基本知识

物理层

IIC通信是通过两条线进行,分别是SDASCL,为IIC总线。

在物理接连层面,IIC总线都是通过上拉电阻(一般为4.7k)上拉至高电平,所以在空闲期间,IIC总线SDA和SCL的空闲电平为高电平。IIC主从设备通过将自身的接口连接至总线上进行通信。

IIC物理连接

协议层

在协议层,IIC总线的SDA和SCL通过形成不同的时序进行数据传输。

通过一张图来介绍一下IIC的时序:

协议

1 起始信号
数据发送开始时,由主设备发送起始信号,表示通信开始。起始信号是SCL高电平期间,SDA由高变低(下降沿)。

2 数据信号
在SCL低电平期间,SDA信号允许进行翻转变化,在SCL高电平期间,SDA信号必须保持不变。因为在SCL高电平期间,会对SDA进行采样,进而传输1bit数据。
如上图所示,在传输单byte数据时,高位数据会先传输,低位数据后传输。一共传输8bit。

3 应答信号ACK
在主设备传输了一个字节数据后,主设备将SDA拉高,放弃SDA线的控制权,对应的从设备会在SDA上产生应答信号ACK,即将SDA拉低。当主设备在第九个SCL高电平期间采样到SDA低电平,表示与从设备通信成功;如果未检测到ACK信号,则表示数据传输失败。

4 非应答信号NACK
与应答信号相反的,就是非应答信号NACK,即在第九个SCL高电平期间采样到SDA为高电平,表示设备没有应答。

5 结束信号
结束信号代表通信的结束。对应的时序是在SCL高电平期间,SDA由低变高(上升沿)。

IIC的通信过程都是由上面这5中信号组成的。

记忆小技巧:
在SCL低电平期间,SDA信号可以随意发生变化,并不会影响通信过程;在SCL高电平期间,SDA信号不发生变化,则为传输数据信号;如果发生了变化,就会形成起始信号(SDA由高变低)和结束信号(SDA由低变高)。


以IIC芯片AS5600的数据手册为例,了解一下IIC的写数据读数据的通信规则:

AS5600数据手册:获取链接

AS5600具体的通信时序如下图所示:
具体时序

挂载在IIC总线上的从设备都会有一个独立的器件地址(slave address),是一个7位的二进制数,例如AS5600的器件地址固定为0x36

在通信过程中紧接着起始信号的就是器件地址和1bit的R/W读写标识位(write=0,read=1),组成了一字节的数据,表示向对应的从设备写数据或读数据。

AS5600写数据时序:
写数据

首先是起始信号S,然后紧接着是器件地址0x36和写标志位0。从设备应答后,再发送将要写的寄存器地址(Word address),从设备应答后,继续发送要写的数据data。最后发送停止信号P结束通信。

需要注意的是,AS5600支持多数据的写入,多个数据的写入会将寄存器地址递增依次写入。

AS5600读数据时序:
读数据

首先是起始信号S,然后紧接着是器件地址0x36和写标志位0。从设备应答后,再发送将要读的寄存器地址(Word address),从设备应答。
主设备重新发送起始信号S,器件地址0x36和读标志位1。从设备应答后,从设备会将指定寄存器地址中的数据返回给主设备。
这个时候主设备每接收一个字节后,会向从设备发送应答信号,直到主设备发送非应答信号NACK,表示不需要再发送数据了,然后主设备发送停止信号P结束通信。

标签:SCL,信号,高电平,Arduino,SDA,IIC,SoftI2C,设备
From: https://www.cnblogs.com/haostudio/p/17922914.html

相关文章

  • 如果我想把一款芯片做成 arduino开发,应该怎样的步骤
    导入Arduino开发编译器编织指令集需要以下步骤:下载并安装ArduinoIDE。你可以从Arduino官方网站上下载最新版本的ArduinoIDE。打开ArduinoIDE,选择“文件”菜单下的“首选项”。在弹出的窗口中,找到“附加开发板管理器网址”一栏,输入以下网址:https://adafruit.github.io/arduino-bo......
  • ESP32在Arduino环境下使用QUEUE接收串口数据帧
    ESP32在Arduino环境下的串口数据帧接收测试平台ESP32-WROOM测试语言Arduino@PlatformIO注意事项需要添加Queue的库函数作者:SMFSWPlatformIO环境配置文件-platformio.ini[env:esp32doit-devkit-v1]platform=espressif32board=esp32doit-devkit-v1framewo......
  • Mac Arduino ESP8266 ESP32 搭建开发环境
    目录1、安装Arduino2、搭建开发板管理器3、可能出现的错误 1、安装ArduinoArduino下载. 官方下载地址:Arduino官方网站Arduino中文社区:下载地址安装方式:解压后无需安装,拖到应用程序(AppLication)里面就行了2、搭建开发板管理器 打开Ardu......
  • Guide to Arduino & Secure Digital (SD) Storage.
    原文:https://docs.arduino.cc/learn/programming/sd-guideHardware&SoftwareRequiredArduinoBoardwithSDCardSlot*ArduinoIDE(online or offline).FormattedSDCard*Theboards/shieldsthathaveanSDcardslotarelistedbelow:MKRZeroMKRIoT......
  • 在Arduino环境下对ESP32进行寄存器操作和区别比较
    在Arduino环境下对ESP32进行寄存器操作和区别比较前言这篇文章主要是对在Arduino环境下如何对ESP32进行寄存器操作进行了相关的说明。并且比较了在不同编程方式下GPIO口的电平翻转速度,这可以更加直观的不同编程方式下的代码运行效率。(平台是VScode,使用Platformio下的Arduino固......
  • iic
    主机主动释放I2C_SDA,为读ack做准备。为什么主机要释放SDA线呢?因为主机和从机将的SDA线连接是通过&,所以从机在操作总线时,主机要释放总线。(从机在什么时候需要操作总线?1.从机应答2.主机读数据(从机写))如主机不释放总线的话,那么SDA线上可能是0,也可能是1,假设现在SDA线上是0,那么不......
  • 如何在vscode环境下使用arduino?
    如何在vscode环境下使用arduino?下载Arduino软件在Arduino官网下载最新的Arduino软件(2.0版本以上)。在下载Arduino之后,电脑中会出现两个非常重要的文件夹:C:\Users\用户名\Documents\Arduino这个文件夹中会存放你安装的一些第三方库的文件等。C:\Users\用户名\AppData\Loca......
  • 实用!Arduino平台最强大的“显卡”驱动:Adafruit GFX 图形库8000字详细使用指南
    实用!Arduino平台最强大的“显卡”驱动:AdafruitGFX图形库8000字详细使用指南光锥之外​昆明尚禾农业科技有限公司副总经理​关注他  概述Arduino的Adafruit_GFX库为我们所有的LCD和OLED显示屏提供了通用语法和图形功能集。这使得Arduino示例程序可......
  • 0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百三十六:0.91寸OLED液晶屏显示模块IIC12832液晶屏兼容3.3v-5V项目二十三:黄色屏声音可视化器实验接线:max9814接A0oled模块ArdunioUnoGND---------GND接地线VCC---------5V接电源......
  • arduino基础语法
     ***通信***上位机与下位机通信管道Serial.begin(57600)设置波特率(通信速率)下位机-------->上位机Serial.print();//打印函数Serial.println();//换行打印函数上位机-------->下位机Serial.available();//获取传输的字节数 Serial.read();//一次读取一个字节**......