GD 32 IIC通信协议

前言:


...


通信方式

通信方式分为串行通信和并行通信。常见的串口就是串行通信的方式

常用的串行通信接口

常用的串行通信方式有USART,IIC,USB,CAN总线


同步与异步

同步通信:IIC是同步通信,有两个线一个是时钟信号线,一个数数据信号线,不需要约定特定的通信频率。

异步通信:约定一个特定的频率,根据这个频率接收和解析数据,对时序的要求比较严格。


单工和双工

IIC总线设计成开漏输出,可以解决电路短路问题


与运算

通0与结果是0,同1与结果是1

为什么使用开漏输出,以下是使用开漏输出的原理,开漏输出配合上拉电阻,解决短路问题


线与的概念


IIC 数据格式

主机向从机写数据

起始位和停止位:主机发送的,来控制数据什么时候开始什么时候结束

接下来是从机地址和写控制位,前7位置是地址后面一位控制是写数据还是读数据 写如数据将控制位设置为 ‘0’表示写数据

发送数据之后就是从机应答位,需要从机给一个反馈信号,主机发送数据需要从机给一个应答,从机返回数据需要主机给一个应答

主机向从机读数据

 首先是起始位:然后是从机的地址和 + 读控制位(设置为 “1” 表示主机向从机读数据)

从机接收到信号之后给主机一个应答,然后是从机返回的实际数据,主机接收到一个数据之后给一个
主机的应答,在主机接收完最后一个数据之后会跟着一个非应答位,然后是停止位

 主机先发送再接收


从机地址


高7位表示从机的地址,低一位表示从机的方向为,是用于控制方向的,1表示主机向从机读数据

0 表示主机向从机写数据。

数据的地址高7位中的前面4位是固定在芯片的内部的是没法改变的,低3位是可以改变的(可以通过硬件电路去配置)。

3 个地址线支持在一个总线上挂载8个设备也就是2的三次方


IIC 总线的实现

IIC 通信协议中SCL线是主机控制输出的,SDA信号线是主机和从机都可以控制输出,IIC总线空闲时SDA 和 SCL 都是处于高电平的状态,数据是按照字节的方式进行传输的


IIC 电器协议

IIC起始信号

IIC 停止信号

IIC 主机发送数据格式

 SCL 在高电平的时候数据不能有变化,这和时候从机读取数据

IIC 主机读取返回的数据

 从机在SCL低电平的时候将数据放到SDA线上,在主机把SCL线变为高电平的时候,从机不能改变SDA上的数据,这个时候主机获取SDA上的数据。

注:在主机接收数据之前要在主机这一侧器释放SDA也就是将IO口释放为高电平

IIC 接收应答

 IIC 发送应答 0 表示应答,1表示接收应答


存储器协议

存储器的分类

 存储器的分类一种是易失性存储器RAM这是一种掉电丢失存储器,一种是非易失性存储器ROM

EEPROM 电可擦除可编程存储器

FLASH 存储器

FLASH,相比较EEPROM,擦除时不再以字节为单位,而是以块为单位,一次简化了电路,数据密度更高,降低了成本。上M的ROM一般都是Flash,如GD25Q16,有2M个字节;


FLASH分为NOR FLASH 和 NAND FLASH:


NOR FLASH,芯片内部的数据线和地址线分开,可以实现 RAM一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块来擦。如GD25Q16;


NAND FLASH,同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。读取只能按页来读取。(NANDFLASH 按块来擦除,按页来读,NOR FLASH 没有页)。如W29N01HVSINA;NAND FLASH 引脚上复用,因此读取速度比NOR FLASH慢一点,但是擦除和写入速度比NOR FLASH快很多;


NAND FLASH内部电路更简单,因此数据密度大,体积小,成本也低。因此大容量的FLASH都是 NAND型 的。小容量的2~12M 的 FLASH多是NOR型的;

使用寿命上,NAND FLASH的擦除次数是NOR的数倍。而且NANDFLASH可以标记坏块,从而使软件跳过坏块。

NORFLASH一旦损坏便无法再用:在使用中:因为 NOR FLASH可以进行字节寻址,所以程序可以在NOR FLASH中运行。


24C02 写数据

单个字节写

1:先发送一个起始信号

2:发送24C02的地址和写控制位

3:24C02 返回应答信号

4:主机发送数据的地址(24C02)有256个字节的空间可以写入数据,每个字节有对应地址的空间,地址的范围是0-256个,需要告诉24C02我们需要向那个地址写入数据

5:24C02 返回一个应答

6:写入数据

7:应答

8:结束


连续写

24C02 这款芯片有32页,每一页可以写8个字节256 / 8 = 32,0 - 255

0 是第一页的起始地址,8是第二页的起始地址,16是第三页的起始地址

如果从0开始只能写8个字节,如果从1开始只能写7个字节

如果数据超过一页,不做特殊处理,到达页边界的地址时后面的数据会到页首的地址
页面的首部数据会被覆盖。


24C02 读数据

单字节读

主机发送一个起始信号给从机,然后发送一个从机的地址和写控制位,“相当于是告诉从机我要找谁”这个时候从机发送一个ACK相应位,告诉主机“我收到了”,然后主机在发送一个字节的地址,和从机说我要写的是哪一部分的内存,从机ACK回应主机收到,然后再来一个起始为,地址和控制位设置读,从机ACK回应,然后主机读内存地址中的数据,不回应ACK,停止位 = 读数据结束。

多字节连续读

在24C02内部有一个地址计数器,对于这种数据格式,只要给一个起始地址24C02就会将这个地址后面的数据一页一页的返回回来。


IIC 信号实现

IIC起始信号实现

IIC 的起始信号,刚开始SCL和SDA都是高电平,表示初始的状态,信号开始时:先将SDA(数据线)电平设置为低电平,然后将SCL(时钟线设置为低电平)。注:两者的先后顺序要严格按照时序图的要求,否则后面会导致程序出现错误,然后延时5ms左右,然后在每一个环节的最后都将SCL设置为低电平(停止信号除外),这样做的目的是为了兼顾后面的信号(然后面的发送和接收能够同步起来)。

信号之间间隔协议的时间顺序,具体查考24C02的数据手册,手册上的建议是0.4us时间是非常快的,我们在此处采用的是4us已经足够


IIC 停止信号实现

首先将SDA设置为低电平然后延时4us,然后将SCL设置为高电平延时4us,然后将SDA设置为高 电平。


主机给从机发送字节

发送字节:SCL低电平期间,主机将数据位依次放到SDA线上,然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。

主机读取从机字节

读取字节:SCL低电平期间,从机将数据位依次放到SDA线上,然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)。

注:主机在接收数据之前需要将SDA数据线上的数据释放,不然接收到数据就是 0


按位左移和按位右移

注意:左移就是左边移出去多少位,右边就补充
几个0,

右移就是右边移出去多少位,左边就补充几个0

左移演示:1110 0101 << 1

= 11 00 1010


接收应答

做一个程序反馈,防止程序出现错误卡在这个位置,这是保证程序的健壮性和可靠性,加上异常的处理。


主机发送应答

SCL在前面的时序当中已经是低电平的状态,这个时候SDA应答的话设置为0,然后延时4us,然后将SCL设置为高电平,延时4us,这个时候再将SDA设置为高电平释放SDA(一定要设置)。


IIC 驱动代码


 


.............


后记:

.............

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/395271.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工具类】JAVA (Android Studio )+ JS 加密解密 AES + Base 64

JAVA &#xff08;Android Studio &#xff09; JS 加密解密 AES Base 64 前言JAVA 代码&#xff08;解密&#xff09;JS代码&#xff08;加密&#xff09; 前言 整个过程&#xff1a; JS 接口先用AES加密&#xff0c;然后加密内容转Base64 编码&#xff1b;JAVA进行Base64解…

三十二、【人工智能】【机器学习】【监督学习】- XGBoost算法模型

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

将PPT中的元素保存为高清图片

PPT制作流程图&#xff0c;思维导图或者演示图片非常方便&#xff0c;本文主要记录如何将一个在PPT中画好的图片导出为高清图片。 1.在ppt中设计图片 以我在PPT中画的图片为例&#xff0c;将所有元素选中&#xff0c;右键组合&#xff0c;成为一个整体 2.另存为增强型元文件 …

vscode 快速生成vue 格式

1.用快捷Ctrl Shift P唤出控制台 输入“Snippets”并选择 Snippets: Configure User Snippets 2.输入vue&#xff0c;选中vue.json vs code自动生成vue.json文件 3.在 vue.json 中添加模板 {"Print to console": {"prefix": "vue2","b…

AI大语言模型对消防工程知多少?

在过去2年的时间里&#xff0c;大语言模型受到前所未有的关注。ChatGPT的出现更是让人工智能对话风靡一时。我们不再把搜索引擎当作求解问题的唯一途径&#xff0c;AI聊天成为了当前最受欢迎的问题求助工具。 让ChatGPT用通俗的语言解释什么是ChatGPT 什么是大语言模型&#x…

如何看待“低代码”开发平台的兴起

目录 1.概述 1.1.机遇 1.2.挑战 1.3.对开发者工作方式的影响 2.技术概览 2.1.主要特点 2.2.市场现状 2.3.主流低代码平台 2.4.分析 3.效率与质量的权衡 3.1.提高开发效率 3.2.质量与安全隐患 3.3.企业应用开发的利弊分析 4.挑战与机遇 4.1.机遇 4.2.挑战 4.3.…

PHP相关漏洞

一、PHP漏洞原理 1.PHP命令执行漏洞 PHP应用程序有时需要调用一些执行系统命令的函数&#xff0c;如php中的system&#xff0c;exec&#xff0c;shell exec&#xff0c;passthru&#xff0c;popen等&#xff0c;当用户可以控制这些函数的参数时&#xff0c;就可以将恶意系统命…

xlua使用

1. 安装 到 github 移动三个文件夹过去即可 Assets -》Plugins Assets -》Xlua Tools 移动到 unity里面的Assets目录即可 会在工具栏出现Xlua即安装成功 2. 引入基础类 ABMgr.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using Un…

【数据结构之带头双向循环链表的实现】

1.链表的分类 链表的结构有多种多样&#xff0c;以下情况组合起来就有8种&#xff08;2x2x2&#xff09;链表结构&#xff1a; 虽然有这么多的链表结构&#xff0c;但是我们实际中最常用的还是两种结构&#xff1a;单链表和双向带头循环链表。 无头单向非循环链表&#xff1a;结…

C#TreeView控件应用

1、代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace TestApp…

IoTDB 入门教程 基础篇②——IoTDB 企业版比开源版本值在哪?

文章目录 一、前文二、功能对比三、可视化控制台四、白名单五、审计日志六、数据备份七、机器学习八、总结 一、前文 IoTDB入门教程——导读 二、功能对比 由天谋科技官网得知&#xff0c;IoTDB&#xff08;开源版&#xff09;与TimechoDB&#xff08;企业版&#xff09;的功能…

10+ Midjourney V6.1 提示:生成精美的角色海报

前言 近期图像生成界最大的更新是MidjourneyV6.1&#xff01;我迫不及待地想要开始创作和分享&#xff0c;这次分享的重点是V6.1在角色创作方面的增强。 以下是半天测试的结果&#xff0c;包括提示&#xff0c;专注于角色摄影照片和角色插图。 网上关于这方面的教程虽然很多&…

如何实现Redis和Mysql中数据双写一致性

在我们的实际开发中&#xff0c;我们用到了redis缓存一些常用的数据&#xff08;如热点数据&#xff09;用来提高系统的吞吐量。 但是不可以避免的出现了数据的修改场景&#xff0c;这就导致了数据库中的数据和Redis中出现不一致性的情况。如何保证数据一致性就显得非常重要了&…

C语言 | Leetcode C语言题解之第332题重新安排行程

题目&#xff1a; 题解&#xff1a; char* id2str[26 * 26 * 26];int str2id(char* a) {int ret 0;for (int i 0; i < 3; i) {ret ret * 26 a[i] - A;}return ret; }int cmp(const void* _a, const void* _b) {int **a (int**)_a, **b (int**)_b;return (*b)[0] - (*…

MyBatis 如何通过拦截器修改 SQL

目录 1. 实现Interceptor接口2. 注册配置文件 假如我们想实现多租户&#xff0c;或者在某些 SQL 后面自动拼接查询条件。在开发过程中大部分场景可能都是一个查询写一个 SQL 去处理&#xff0c;我们如果想修改最终 SQL 可以通过修改各个 mapper.xml 中的 SQL 来处理。 但实际过…

IDEA 生成类的注释信息

新建任意类&#xff0c;自动生成注释信息&#xff08;选其一&#xff0c;否则会多出一份注释信息&#xff09; 打开File -> Settings -> Editor -> File and Code Templates -> Includes&#xff0c;在File Header中添加如下信息&#xff0c;然后点击OK即可 /** *…

如何在不丢失数据的情况下绕过IPhone密码?

不幸的是&#xff0c;不可能在不丢失数据的情况下绕过 iPhone 密码。通过密码的唯一方法是使用iTunes或iCloud恢复设备。这将清除您设备的内容&#xff0c;因此请务必在恢复之前备份所有重要数据。如果您忘记了密码&#xff0c;请按照以下步骤操作&#xff1a; 1. 将您的 iPhon…

2024年8月8日(python基础)

一、检查并配置python环境&#xff08;python2内置&#xff09; 1、检测是否安装 [rootlocalhost ~]# yum list installed| grep python [rootlocalhost ~]# yum -y install epel-release 2、安装python3 [rootlocalhost ~]# yum -y install python3 最新版3.12可以使用源码安…

视频大怎么压缩小?分享3种视频压缩方法

视频大怎么压缩小&#xff1f;视频文件过大时&#xff0c;压缩视频不仅能帮助我们节省宝贵的存储空间&#xff0c;使其更容易在有限容量的设备中保存&#xff0c;还能显著提升传输效率&#xff0c;特别是在网络条件有限或需要快速分享视频内容的场合。通过专业的压缩工具&#…

Selenium + Python 自动化测试08(截图)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了滑块的操作方法&#xff0c;本篇文章我们讲述一下截图的操作方法。希望能够帮到爱学的小伙伴。 在实际的测试项目组中我们经常要截屏保存报错信息&#xff0c…