GD32硬件IIC

news/2024/11/28 22:34:46/

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://www.ppmy.cn/news/181350.html

相关文章

Intel SGX Explained

文章目录 SGX新增第二章 Intel体系架构背景知识Overview计算模型软件权限级别地址空间地址转换 第五章 SGX Programming Medol5.1 SGX物理内存组织5.1.1 The Enclave Page Cache&#xff08;EPC&#xff09;5.1.2 The Enclave Page Cache Map&#xff08;EPCM&#xff09;5.1.3…

读改变未来的九大算法笔记02_数据库

1. 基础思想 1.1. 预写日志记录 1.2. 两阶段提交 1.3. 关系数据库 2. 两个事实 2.1. 计算机程序会崩溃 2.1.1. 当一个程序崩溃时&#xff0c;它会丢掉所有正在处理的东西 2.1.2. 只有安放在计算机文件系统中的信息会得到保存 2.1.3. 崩溃相当宽泛&#xff1a;包括任何可…

【车间调度】基于matlab GUI遗传算法求解车间调度问题【含Matlab源码 049期】

⛄一、车间调度简介 作业车间调度问题&#xff08;Job Shop Scheduling, JSP&#xff09;是最经典的几个NP-hard问题之一。其应用领域极其广泛&#xff0c;涉及航母调度&#xff0c;机场飞机调度&#xff0c;港口码头货船调度&#xff0c;汽车加工流水线等。 JSP问题描述&…

雅特力单片机开发笔记

目录 1.开发资源获取 2.硬件资源 2.1 硬件原理图pcb资源 2.2 数据手册 3.SDK软件资源 3.1 keil开发环境配置 3.2 软件开发包说明 3.3 jlink配置 3.4 jlink编程与仿真 3.5 程序相关例程说明 4. 单片机开发工具 5.雅特力单片机论坛 1.开发资源获取 雅特力单片机所有资…

GD GD32F103RCT6 微控制器

GD32F103RCT6是全新的通用型32位高性能、低功耗微控制器系列产品&#xff0c;采用ARMR CortexR-M3内核&#xff0c;适用于广泛的应用场景。GD32F103RCT6系列产品集成丰富的特性&#xff0c;可简化系统设计&#xff0c;并通过久经验证的技术和卓越创新为客户提供广范、超优性价比…

linux安装docker并设置国内镜像仓库

前置条件 该方案为centos上安装docker&#xff0c;其他版本linux请参照官方文档&#xff1a;https://docs.docker.com/engine/install/centos/该linux系统没有安装过docker&#xff0c;或者已卸载docker #卸载docker yum remove docker \docker-client \docker-client-latest…

Flume

Flume 概述 一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。基于流式架构&#xff0c;灵活简单。 可以实时读取服务器本地磁盘的数据&#xff0c;将数据写入到HDFS。 组件 source 收集数据 以event为单元进行封装发送给channel 常…

python 算子map

map&#xff1a; 输入一个元素同时输出一个元素。下面是将输入流中元素数值加倍的 map function&#xff1a; [rootmaster pyflink]# cat flik_3.py # -*- coding: utf-8 -*- from pyflink.datastream import StreamExecutionEnvironment from pyflink.datastream.functions…