GD32硬件IIC

article/2025/9/27 6:13:39

GD32E230硬件IIC


我们熟悉IIC都是使用软件代码的形式模拟时序图来编程
现在使用GD32E230中的HAL库中硬件IIC模式IIC。的总线机制都是一种两线接口、简单、双向二线制同步的串行总线,二线制就是时钟线(SCL)和数据线(SDA)两个信号线。IIC寻址时分为主从设备之分,一般选择MCU作为主设备,每个不同的从设备都有唯一的7位设备地址,高四位由厂家确定,低三位时器件引脚定义。

在这里插入图片描述

IIC通信时,存在几种信号。
1)起始信号:通知从机做好通信准备。
2)应答信号:有应答和无应答信号。有答应就是SDA为低电平,无应答就是SDA为高电平。
3)停止信号:告诉从机通信结束

首先编写硬件IIC时,要根据厂家提供的规格书来编写,一般都遵循IIC标准通信时序进行通信。

传输方向都是一致的
1)首先 是选择主从设备,大部分情况下都会选择单片机(MCU)作为主设备
2)主设备要发送数据给从器件,主设备首先寻址从设备,主动发送数据给从设备,最后由主机终止数据传送。
3)如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据传送。

IIC的写数据
在这里插入图片描述
看到规格书里面的表达时,先从左边开始编写
S(起始信号)通信的开始

    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));/* send a start condition to I2C bus */i2c_start_on_bus(I2C0);/* wait until SBSEND bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));

Slave Addr 7 Bit(设备寻址)

  /* send slave address to I2C bus */i2c_master_addressing(I2C0, 0x70, I2C_TRANSMITTER);//我这边的设备地址是0c70/* wait until ADDSEND bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));/* clear the ADDSEND bit */i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);

W(等待应答信号)
A(应答信号)

    /* wait until the transmit data buffer is empty */while( SET != i2c_flag_get(I2C0, I2C_FLAG_TBE));

Reg Addr 8 Bit(寄存器的8位地址)这个地址是读写数据时都要一致

    /* send the reg internal address to write to */i2c_data_transmit(I2C0, 0x1c);//这个地址是读写数据时都要一致/* wait until BTC bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));

Data 8 Bit(II2SDA数据线上的8位数据)

	writ_byte = writ_byte << 1;	i2c_data_transmit(I2C0, writ_byte);/* wait until BTC bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));

P(停止信号)

    /* send a stop condition to I2C bus */i2c_stop_on_bus(I2C0);/* wait until the stop condition is finished */while(I2C_CTL0(I2C0)&0x0200);

II2的读数据
在这里插入图片描述
S(起始信号)通信的开始

    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));/* send a start condition to I2C bus */i2c_start_on_bus(I2C0);/* wait until SBSEND bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));

Slave Addr 7 Bit(设备寻址)

  /* send slave address to I2C bus */i2c_master_addressing(I2C0, 0x70, I2C_TRANSMITTER);//我这边的设备地址是0c70/* wait until ADDSEND bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));/* clear the ADDSEND bit */i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);

W(等待应答信号)
A(应答信号)

    /* wait until the transmit data buffer is empty */while( SET != i2c_flag_get(I2C0, I2C_FLAG_TBE));/* enable I2C0*/i2c_enable(I2C0);

Reg Addr 8 Bit(寄存器的8位地址)这个地址是读写数据时都要一致

    /* send the reg internal address to write to */i2c_data_transmit(I2C0, 0x1c);//这个地址是读写数据时都要一致/* wait until BTC bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));

S(起始信号)

/* wait until BTC bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));/* send a start condition to I2C bus */i2c_start_on_bus(I2C0);/* wait until SBSEND bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));

Slave Addr 7 Bit(设备寻址)

  /* send slave address to I2C bus */i2c_master_addressing(I2C0, 0x70, I2C_RECEIVER);//我这边的设备地址是0c70/* wait until ADDSEND bit is set */while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));/* clear the ADDSEND bit */i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);

Data 8 Bit(II2SDA数据线上的8位数据)

    *p_buffer = i2c_data_receive(I2C0);/* point to the next location where the byte read will be saved */p_buffer++; 

N(无应答信号)

   /* enable acknowledge */i2c_ack_config(I2C0,I2C_ACK_ENABLE);i2c_ackpos_config(I2C0,I2C_ACKPOS_CURRENT);

P(停止信号)

    /* send a stop condition to I2C bus */i2c_stop_on_bus(I2C0);/* wait until the stop condition is finished */while(I2C_CTL0(I2C0)&0x0200);

最后需要注意的是
1、读写的时候一定的寄存器一定要填写一致并且,还有规格书上的设备地址需要左移一位,因为IIC的设备地址是高八位开始。
2、read byte时,当发送完slave addr时要再次启动i2c总线时,一定要给出无应答信号,不然数据数据读取不到。
在这里插入图片描述
最后还有问题不懂或者文章有错的评论区告诉我。谢谢!需要GD32E230标准HAL库私聊。


http://chatgpt.dhexx.cn/article/LSOytVjD.shtml

相关文章

GD32学习

1.简介 关于兆易创新GD32的产品&#xff0c;目前在单片机MCU的业务上&#xff0c;GD全部是32bit的单片机&#xff0c;目前GD32的单片机从内核上区分有Cortex-M3、Cortex-M4、Cortex-M23三个系列&#xff0c;其中红色框框为主推系列&#xff1a; 开发调试环境&#xff1a; 支持主…

了解GD2函数库

PHP目前在Web开发领域已经被广泛应用&#xff0c;PHP不仅可以生成HTML页面&#xff0c;而且可以创建和操作二进制形式的数据&#xff0c;如图像&#xff0c;文件等。其中使用PHP操作图形可以通过GD2函数库来实现。利用GD2函数库可以在页面中绘制各种图像&#xff0c;统计图&…

GDKOI2023 D2T1

前言 相比于D1T1&#xff0c;这题才是真正的签到题&#xff0c;然而&#xff0c;我却爆0了。为了纪念这悲壮的0分&#xff0c;写下了这篇题解。 题目大意 给出 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le 10^5) n(1≤n≤105) 个字符串及其出现时间&#xff08;以几点几分给出&…

一文看懂 GD2库

文章目录 一、 GD2简介1、 验证码&#xff08;实际上是一个img&#xff09; 二、 GD2库使用步骤2.1添加扩展2.2修改php配置文件2.3重启服务 三、 GD2里面的常用方法3.1 imagecreate3.2 imagecolorallocate3.3 imagefill3.4 输出图像资源3.5创建真彩画布3.6在图像中写文字3.6.1i…

MySQL的主从复制

MySQL的主从复制 目录 为什么需要主从复制&#xff1f;MySQL 主从复制概念MySQL 主从复制主要用途MySQL主从形式 一主一从一主多从&#xff0c;提高系统的读性能多主一从 &#xff08;从5.7开始支持&#xff09;双主复制级联复制 MySQL 主从复制原理MySQL主从复制的过程MySQL…

redis主从结构 (一主一从,一主多从,主从从)

关闭防火墙和selinux systemctl disable firewalld.service systemctl stop firewalld vim /etc/selinux/config sed -n 7p /etc/selinux/config SELINUXdisabled setenforce 0 从服务器首次做的是全量同步&#xff0c;且同步的数据会覆盖本机的数据 master 192.168.…

Mysql主从模式

文章目录 &#x1f449;&#x1f3fb;前言❤️主从模式说明&#x1f90d;logbin日志&#x1f90d;Mysql主从复制的流程&#x1f90d;主从复制中遇到的问题 ❤️主从模式配置&#x1f90d;Master配置&#x1f90d;Slave配置 ❤️其他设置&#x1f90d;半同步复制&#x1f90d;并…

mysql主从同步

目录 1.创建主从同步用户 2.授予主从同步权限 3.刷新权限 4.修改master配置文件 5.重启MySQL 6.查看master的状态 7.修改slave配置文件 8.重启mysql 9.构建主从连接信息 10.开始同步 11.查看同步信息 12.同步失败 13.同步报错 13.1 server_id冲突 13.2 initiali…

mysql主从原理

目录 一、主从复制原理 1.原理 2.也就是说 3.注意 随着访问量的不断增多&#xff0c;mysql数据库的压力不断增加&#xff0c;需要对mysql进行优化和架构改造&#xff0c;可以使用高可用、主从复制、读写分离、拆分库、拆分表进行优化。下面我们来学习mysql主从复制高可用如…

MySQL主从复制

一、MySQL主从复制原理 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的整体服务性能&#xff0c;一般都会采用「主从复制」。 比如&#xff1a;在复杂的业务系统中&#xff0c;有一句sql执行后导致锁表&#xff0c;并且这条sql的的执行时间有比较长&…

Mysql主从同步配置

1. mysql主从同步定义 主从同步使得数据可以从一个数据库服务器复制到其他服务器上&#xff0c;在复制数据时&#xff0c;一个服务器充当主服务器&#xff08;master&#xff09;&#xff0c;其余的服务器充当从服务器&#xff08;slave&#xff09;。因为复制是异步进行的&am…

MySQL 的主从架构

数据库主从概念、优点及用途 主从数据库中主是主库的意思&#xff0c;从是从库的意思。数据库主库对外提供读写操作&#xff0c;从库对外提供读操作。 数据库为什么需要主从架构呢&#xff1f; 高可用&#xff0c;实时灾备&#xff0c;用于故障切换。比如主库挂了&#xff0c…

MySQL主从同步(一主一从、一主多从、主从从)等结构的概述与配置

前言&#xff1a;前面我们了解了MySQL数据库的基础知识&#xff0c;今天及接下来的五天时间里我会给大家带来MySQL进阶方面的一些学习总结&#xff0c;如有不足&#xff0c;还请大家留言指出&#xff1b;下面我们就开始今天的内容。 ** 部署mysql主从同步结构 **  主从同步…

MySQL的主从

前言 金三银四面试的时候&#xff0c;面试官经常会问MySQL主从。今天就跟大家聊聊MySQL的主从。 数据库主从概念、优点、用途 数据库主从复制原理 主主、主从、主备的区别 MySQL是怎么保证主从一致的 数据库主从延迟的原因与解决方案 聊聊数据库的高可用方案 1. 数据库…

主从原理,一主多从架构

主从架构总结 主从原理 用binlog做主从&#xff0c;redolog只支持innodb 过程 ①start slave后从库启动io线程连接主库&#xff0c;请求读日志②dump线程根据请求信息读取指定位置后的日志③完成后就响应成功&#xff0c;没有确认机制④IO线程收到信息&#xff0c;将受到的日…

主从复制:主从复制的概述、一主一从架构搭建主从复制的原理、同步数据一致性问题

文章目录 1. 主从复制的概述1.1 如何提升数据库的并发能力1.2 主从复制的作用 2. 主从复制的原理2.1 原理剖析2.2 复制的最大问题2.3 复制的基本原则 3. 一主一从架构搭建3.1 准备工作3.2 主机配置文件3.3 从机配置文件3.4 建立账户并授权3.5 配置需要复制的主机3.6 测试3.7 停…

c/c++经典面试题(高频考点)

一、数据结构及算法&#xff08;快排、归并、堆排等&#xff09; 十大排序算法 数据结构(c/c版)-严蔚敏 数据结构与算法(思维导图&#xff09; E:\学习\4.数据结构(C语言版)].严蔚敏_吴伟民.扫描版.pdf 数据结构分为8类有:数组、栈、队列、链表、树、散列表、堆、图 1.快速排…

吐血整理 | 最常见的 C/C++ 面试题(含答案)

大家好&#xff0c;我是 K 哥&#xff01; 最近群里有小伙伴想跳槽&#xff0c;问我有没有常见的 C/C 面试题。这不正好&#xff0c;K 哥之前整理了一份 PDF&#xff0c;里面包含了各种经典的 C/C 题目&#xff0c;当然更重要的是还附带了非常详细的答案。 K 哥不仅面试之前会反…

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司&#xff0c;至今也许是告一段落吧&#xff0c;希望后面会有好结果&#xff0c;因此总结记录一些C/C方向常见的问题。和大家一起学习&#xff01; 参考了互联网的各种资源&#xff0c;自己尝试归类整理&#xff0c;谢谢~ 一、C和C的区…

C++面试题总结,一篇就够了

C面试题汇总 1. C基础1.1 内存模型1.1.0 内存四区1.1.1 简述C、C程序编译的内存分配情况1.1.2 分配函数与释放函数1.1.2.1 malloc / free1.1.2.2 new / delete1.1.2.3 new/delete 与 malloc/free 区别1.1.2.5 calloc 、realloc1.1.2.6 在C中&#xff0c;使用malloc申请的内存能…