GD 32 IIC通信协议

news2024/9/30 9:27:57

前言:


...


通信方式

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

常用的串行通信接口

常用的串行通信方式有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.coloradmin.cn/o/1980039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rocketMq-5.2.0双主双从搭建

最近在研究rocketmq5.x的运行机制&#xff0c;研究到高可用章节&#xff0c;看到rocketMq采用了主从机制实现高可用&#xff0c;将broker分成了master和slave。为了更好的理解主从源码&#xff0c;我觉着需要先搭建一个主从的集群&#xff0c;先了解主从集群是怎么使用的。 这篇…

【practise】只出现一次的数字

现在给你一个数组&#xff0c;里面放了一些数字&#xff0c;里面都是两两成对&#xff0c;只有一个数字是单独的&#xff0c;要求找出其中只出现一次的数字。相必这道题是非常简单了&#xff0c;有很多解法比如说用暴力求解&#xff1f;比如说用位运算&#xff1f;甚至说用哈希…

使用Docker+ollama部署大模型

Docker的安装----在 Ubuntu 系统上安装 Docker 一&#xff1a;配置系统的 APT 软件包管理器 首先添加 Docker 的官方 GPG 密钥 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/ke…

使用 宝塔面板 部署 php网站

【语料库网站】宝塔面板 在线部署全过程 代码仓库&#xff1a;https://github.com/talmudmaster/RedCorpus 网站介绍 语料库提供双语文本检索和分享功能。供英语、翻译相关专业的爱好者&#xff0c;学生和老师学习使用。 该网站是对BiCorpus开源项目的二次开发。 技术栈&am…

DA14695 printf没办法打印浮点数

是因为没有打开浮点数库&#xff0c;添加了这个库也会导致堆内存的增加

基于Kahn算法|动态线程池,支持扩展点并发执行|召回|过滤

背景 在《分布式领域扩展点设计稿》一文中&#xff0c;我们提到针对业务横向扩展点和纵向扩展点的编排能力。 那有这样的一种场景&#xff1a;针对于一次会话&#xff0c;同时会调很多外部服务&#xff0c;同时这些RPC服务会有多种直接或间接的关系&#xff0c;是否有更高效的…

【Spring】Bean详细解析

1.Spring Bean的生命周期 整体上可以简单分为四步&#xff1a;实例化 —> 属性赋值 —> 初始化 —> 销毁。初始化这一步涉及到的步骤比较多&#xff0c;包含 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始…

【Vue3】组件通信之$refs

【Vue3】组件通信之$refs 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

操作系统|day4.Linux、Linux内核、Linux负载、Linux文件存储

文章目录 LinuxLinux内核定义功能态 Linux负载定义 Linux文件存储链接分类区别使用场景 拷贝 Linux Linux内核 定义 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它负责管理系统的进程、内存、设备驱动程序、文件和网络系统&#xff0c;决定着系统的性能…

【大模型系列】LanguageBind(ICLR2024.01)

Paper&#xff1a;https://arxiv.org/abs/2310.01852Github&#xff1a;https://github.com/PKU-YuanGroup/LanguageBindHuggingface&#xff1a;https://huggingface.co/spaces/LanguageBind/LanguageBindAuthor&#xff1a;Bin Zhu et al. 北大袁粒团队 文章目录 1 LanguageB…

临床试验的五大意义是什么?

临床试验是临床数据科学和现代医学研究中至关重要的环节&#xff0c;它通过严格的科学方法验证新药、新疗法以及医疗器械的安全性和有效性。临床试验不仅推动了医学科学的进步&#xff0c;也为患者提供了新的治疗选择&#xff0c;提升了公共卫生水平&#xff0c;具有重大的意义…

牛客JS题(二十二)数组过滤

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 合理封装范围判断函数 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /></head><body><select name"&q…

【C语言】C语言期末突击/考研--详解一维数组与字符数组

目录 ​一、一维数组 1.数组的定义 2.一维数组在内存中的存储 二、数组访问越界与数组的传递 1.数组的访问越界 2.数组的传递 三、字符数组与scanf读取字符串 1.字符数组的初始化及传递 2.scanf读取字符串 四、gets函数与puts函数&#xff0c;str系列字符串操作函数 …

「iOS」自定义Modal转场——抽屉视图的实现

「iOS」自定义Modal转场——抽屉视图的实现 文章目录 「iOS」自定义Modal转场——抽屉视图的实现前言错误尝试自定义Modal转场实现流程自定义动画类UIPresentationController 成果展示参考文章 前言 在仿写网易云的过程之中&#xff0c;看到学长之前仿写时实现的抽屉视图&…

Java面试题-集合类

目录 1、请简单介绍下 Java 的集合类吧。 Collection Set TreeSet和HashSet List ArrayList 和 LinkedList 数组和链表的区别 Java 的列表有哪些实现类&#xff1f; Vector Queue Map 能说下 HashMap 的实现原理吗&#xff1f; 能说下 HashMap 的扩容机制吗&#x…

达梦数据库的系统视图v$cachepln

达梦数据库的系统视图v$cachepln 达梦数据库的系统视图V$CACHEPLN的主要作用是提供缓存中SQL执行计划的信息&#xff0c;在 ini 参数 USE_PLN_POOL !0 时才统计。通过查询这个视图&#xff0c;用户可以获取到缓存中的执行计划及其相关信息&#xff0c;如SQL语句文本等。这有助…

JavaScript青少年简明教程:DOM和CSS简介

JavaScript青少年简明教程&#xff1a;DOM和CSS简介 DOM简介 DOM&#xff08;Document Object Model&#xff09;将文档表示为一个树形结构&#xff0c;其中每个节点都是一个对象&#xff0c;每个对象都有其自身的属性和方法。 通过对DOM的操作&#xff0c;开发者可以使用编…

Mojo 不安全指针 详解

该UnsafePointer类型创建对内存中某个位置的间接引用。您可以使用UnsafePointer来动态分配和释放内存,或指向由其他代码分配的内存。您可以使用这些指针编写与低级接口交互的代码,与其他编程语言交互,或构建某些类型的数据结构。但顾名思义,它们本质上是不安全的。例如,当…

各地级市能源消费总量、夜间灯光值数据(2000-2022年)

全国各地级市能源消费总量、夜间灯光值数据&#xff08;2000-2022年&#xff09; 数据年限&#xff1a;2000-2022年 数据格式&#xff1a;excel 数据内容&#xff1a;337个地级市能源消费总量、夜间灯光值数据&#xff0c;包括城市、省份、年份、夜间灯光值&#xff08;总和&am…

子比主题允梦美化插件全开源版本

在其他论坛看到的一款不错的子比美化插件&#xff0c;功能也比较全面&#xff0c;因为插件作者上学没有时间维护&#xff0c;现在开源给大家&#xff0c;插件本站未做测试&#xff0c;需要的朋友自行下载测试&#xff0c;如果有授权的话可以到允梦作者网站进行咨询。需要其他美…