【GD32】08 - IIC(以SHT20为例)

GD32中的IIC

今天来了解一下GD32中的硬件IIC,其实我个人是觉得软件IIC比较方便的,不过之前文章里用的都是软件IIC,今天就算是走出自己的舒适圈,我们来了解了解GD32中的硬件IIC。

我这里用的型号是GD32F407,不同型号的只需要看准自己板子的资源引脚即可。

关于IIC以及本文中演示的SHT20,在之前的文章里都有,并且也不是本文的重点,因此这里就不介绍了,不了解且感兴趣的小伙伴可以去看看之前的文章。

【STM32F103】I2C通信协议&SHT20温湿度传感器_sht20通信方式-CSDN博客文章浏览阅读2.3k次,点赞29次,收藏33次。I2C是Inter IC BUS=IIC=I²C=I2C,一般我们读作“挨方C”。简述一下I2C,是只需要两根通信线就能实现多主多从半双工的串行通信协议。传输速度会偏慢一点点,一般是100Kbps,是属于标准模式。另外还有快速模式,400Kbps;高速模式3.4Mbps;超快速模式5Mbps(后两种没接触过)。分别是SCL和SDA。SCL是Serial Clock,也就是统一时间的。SDA是Serial Data,也就是传输数据的。_sht20通信方式https://blog.csdn.net/m0_63235356/article/details/135734887?spm=1001.2014.3001.5501

接下来我们来看看GD32的IIC。

GD32F407一共有三个IIC资源,挂载在了APB1上面。

硬件IIC0的数据线在GPIOB的8和9号引脚上。因此我们首先就是要打开GPIOB的外设时钟,以及初始化一下这俩引脚,因为我们用的是硬件资源,因此要设置为复用模式。

    rcu_periph_clock_enable(RCU_GPIOB);gpio_af_set(GPIOB, GPIO_AF_4,GPIO_PIN_8|GPIO_PIN_9);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_8|GPIO_PIN_9);gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ,GPIO_PIN_8|GPIO_PIN_9);

引脚复用我们选择4号复用。

不同型号需要查阅自己型号的固件库手册,比如说GD32E230的I2C就是0号复用。

上一篇文章写串口的在这方面是直接跳过了,现在在这边补充一下。

包括输出模式设置成什么上一篇好像也是跳过的,其实这一点我们可以查阅手册。

甚至我们可以直接参考STM32的手册,因为STM32里在GPIO章节里直接有个表格方便我们查阅,而GD32里可能也有但是我没有找到。

关于GPIO的设置我们就说到这边,其实我们使用到硬件资源的时候初始化GPIO都是这一套流程,具体细节在文档中都能找到。

接下来就是关于IIC的固件库函数了。

i2c_deinit(I2C0);

首先一样是复位函数,在设置IIC之前我们最好都调用一遍。

i2c_clock_config(I2C0, 100000, I2C_DTCY_2);

设置IIC的时钟,参数二理论上我们可以随便填入一个32bit大小的值,但是我们最好还是按照IIC常见的速率来设置,例如100k,400k这样。

i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0X80);

接下来是设置IIC通信的模式与地址,模式我们自然是选择I2C模式的,而地址可以选择7位或者是10位的(10位的参数截图没截上,因为卡在手册的下一页了),这个根据我们通信的模块的从机地址而定。

我们今天示范的SHT20是7位从机地址,是100 000,对应到十六进制就是0x80。

i2c_ack_config(I2C0, I2C_ACK_ENABLE);

设置发送应答,我们一般都设置为发送,当发送我们结束IIC通信的上一个时序的时候我们再关闭应答。

i2c_master_addressing(I2C0,0x80,I2C_TRANSMITTER);

发送从机地址,在IIC中我们开始时序发送之后第一个要发送的数据就是从机地址。我们知道从机地址是7位,剩下一位就是读写位了,0为写,1为读,我们不用手动去修改,直接调用这个函数就可以达到设置收发状态的从机地址并发送了。

不嫌麻烦的话,调用发送时序的函数再手动修改从机地址也是一样的效果。

i2c_enable(I2C0);

使能IIC,设置完IIC后使能,我们就可以使用IIC了。

IIC时序其实不多,就是开始,结束,发送,接收。应答的话硬件IIC会自动帮我们发送接收可以不用管。接下来我们就来看看这些时序对应的固件库函数是哪一些。

i2c_start_on_bus(I2C0);

这个就是起始时序了。起始时序就是在SCL高电平的时候,SDA从高电平切换到低电平。

i2c_stop_on_bus(I2C0);

发送结束时序。结束时序就是在SCL高电平的时候,SDA从低电平切换到高电平。

i2c_data_transmit(I2C0,data);

发送时序,在SCL低电平的时候,主机将数据放置到SDA(1为高电平,0为低电平) 主机拉高SCL的时候,在SCL高电平时,从机读取SDA的数据。可以一次发送8位数据。

i2c_data_receive(I2C0)

接收时序,一次收8bit。

至此我们就集齐了IIC的时序了,可以开始IIC了……吗?

硬件IIC麻烦的地方来了。那就是每个时序我们都需要等待标志位以及清除标志位。

获取标志位的函数在上面,我们讲过的时序用到的标志位参数我用红框框出来了。

获取完之后还得清除,传入的参数和上面获取的函数基本一样,我就不贴出来了。不过有些标志位是不用我们手动清除的,这个具体要查看手册,手册中没有对应的标志位参数就代表我们不用手动清除。

那么接下来我们就可以进行IIC通信了,时序都凑齐了,我们每发完一个时序都需要等待标志位置位(获取标志位)并且清除。

接下来我直接贴出代码(GD32F407),我会尽量写出注释,关于SHT20的看不懂的部分可以回顾一下开头链接的文章。

串口部分可以参考上一篇文章。

#include "board.h"
#include <stdio.h>
#include "Z_UART.h"float SHT20_GetData(uint8_t command){uint16_t res = 0;i2c_start_on_bus(I2C0);                             //起始时序while(!i2c_flag_get(I2C0,I2C_FLAG_SBSEND) );        //等待起始位发送完. 这个不用手动清除标志位i2c_master_addressing(I2C0, 0x80, I2C_TRANSMITTER); //发送从机地址(0x80)+写命令(0)while(!i2c_flag_get(I2C0,I2C_FLAG_ADDSEND) );       //等待从机发送完毕之后得到回应(即从机地址正确)i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);              //清除标志位while(!i2c_flag_get(I2C0,I2C_FLAG_TBE));            //等待发送缓冲区空if(command == 'w')  i2c_data_transmit(I2C0,0xF3);   //发送数据,发送SHT20的指令,F3为获取温度,F5为获取湿度else    i2c_data_transmit(I2C0,0xF5);while(!i2c_flag_get(I2C0,I2C_FLAG_BTC) );           //等待字节传输完毕i2c_stop_on_bus(I2C0);                              //发送结束时序uint8_t count = 0;                                  //计数,因为SHT20采集数据需要时间,我们设置个超时时间do{i2c_start_on_bus(I2C0);                         //起始时序while(!i2c_flag_get(I2C0,I2C_FLAG_SBSEND));     //等待起始位发送完毕i2c_master_addressing(I2C0, 0x80, I2C_RECEIVER);//发送从机地址(0x80)+读命令(1)delay_ms(10);                                   //延时10msif(++count >= 10) return 0;                     //超过100ms我们就算读取失败}while(!i2c_flag_get(I2C0,I2C_FLAG_ADDSEND));       //等待回应i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);              //清除标志位i2c_ack_config(I2C0, I2C_ACK_ENABLE);               //开启应答while(!i2c_flag_get(I2C0,I2C_FLAG_RBNE) );          //等待接收缓冲区不为空res = i2c_data_receive (I2C0);                      //读取SHT传来的数据的高8位res <<= 8;i2c_ack_config(I2C0, I2C_ACK_DISABLE);              //关闭应答,因为我们就获取俩8bit数据while(!i2c_flag_get(I2C0,I2C_FLAG_RBNE) );          //等待接收缓冲区不为空res |= i2c_data_receive (I2C0);                     //读取SHT传来的数据的低8位i2c_stop_on_bus(I2C0);                              //结束时序res &= 0xFFFC;                                      //清除最后两位,这是SHT20要求的//根据指令的不同(获取温度/湿度)来计算数据if(command == 'w') return ((res / 65536.0) * 175.72 - 46.85);return (( res / 65536.0) * 125 - 6);
}int main(void){board_init();//初始化串口,为了将结果打印到串口助手上,不懂怎么操作的小伙伴可以看看上一篇文章Z_UART_Init();//开启时钟rcu_periph_clock_enable(RCU_I2C0);rcu_periph_clock_enable(RCU_GPIOB);//初始化硬件IIC的引脚gpio_af_set(GPIOB, GPIO_AF_4,GPIO_PIN_8|GPIO_PIN_9);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_8|GPIO_PIN_9);gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ,GPIO_PIN_8|GPIO_PIN_9);i2c_deinit(I2C0);                                           //复位IIC0i2c_clock_config(I2C0, 100000, I2C_DTCY_2);                 //设置IIC速率为100ki2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0X80);  //设置SHT20的七位地址i2c_ack_config(I2C0, I2C_ACK_ENABLE);                       //使能应答i2c_enable(I2C0);                                           //使能IICprintf("hello world!\r\n");while (1){printf("%f\t%f\r\n",SHT20_GetData('w'),SHT20_GetData('s'));delay_ms(1000);}
}

 可以正常接收数据。

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

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

相关文章

等保测评初级简答题试题

基本要求&#xff0c;在应用安全层面的访问控制要求中&#xff0c;三级系统较二级系统增加的措施有哪些&#xff1f; 答&#xff1a;三级比二级增加的要求项有&#xff1a; 应提供对重要信息资源设置敏感标记的功能&#xff1b; 应按照安全策略严格控制用户对有敏感标记重要…

策略模式和状态模式

策略模式 在上下文中携带策略接口作为成员变量&#xff0c;在使用上下文之前需要设置策略setStrategy&#xff08;&#xff09;&#xff0c;然后使用策略接口成员变量来进行策略的执行。 步骤1&#xff1a;定义策略接口 // 策略接口 public interface Strategy {int execut…

猎豹WiFi

猎豹WiFi&#xff0c;记得刚安装完就一堆广告弹窗&#xff0c;然后删除了一些东西&#xff0c;不影响开热点的功能。 kwifi.zip - 蓝奏云

干涉阵型成图参数记录【robust】

robust 这个玩意经常忘记&#xff0c;就是取2的时候是更加显示大尺度的结构&#xff0c;取-2更加显示小尺度结果&#xff0c;一般取0就是正常就好了

真正要战胜的,不是困难,是自己

记录一些好的文字&#xff0c;希望可以和大家共勉。 一个人真正的成长&#xff0c;是战胜自己 不知你是否有这样的经历&#xff1a;曾经觉得一道题很难&#xff0c;但解出来后&#xff0c;发现其实并没那么难&#xff1b;曾经觉得一件事是不可能完成的&#xff0c;但历经千辛万…

vitest-前端单元测试

Vitest是一个轻量级、快速且功能强大的测试框架&#xff0c;特别适用于Vite项目&#xff0c;但也可以与其他前端项目&#xff08;如使用webpack构建的项目&#xff09;集成使用。Vitest提供极速的测试体验&#xff0c;并包含一系列用于编写和组织测试用例的API&#xff0c;如de…

vue项目中,pnpm不能用-解决

方法四&#xff1a;解决 PowerShell 执行策略问题 如果你决定继续使用 PowerShell&#xff0c;并且遇到执行策略问题&#xff0c;可以尝试以下方法解决&#xff1a; 永久更改执行策略&#xff1a; 在管理员权限的 PowerShell 中运行以下命令&#xff0c;以永久更改执行策略&am…

【Hive中常见的优化手段----数据采集!Join 优化!Hive索引!数据倾斜!mapreduce本地模式!map和reduce数量调整!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下Hive中常见的优化手段----数据采集&#xff01;常见的Join 优化有哪几种&#xff01;什么是Hive索引&#xff01;数据怎么发生倾斜&#xff01;什么是mapreduce的本…

力扣每日一题 6/24 模拟 数组 单调栈

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 503.下一个更大元素II 【中等】 题目&#xff1a; 给定一个循环数组 nums…

数据分析师怎么去快速读一本书

背景&#xff1a;优秀的数据分析师怎么去快速读一本书 一本好书的判断依据 1.有没有再次印刷&#xff0c;三次印刷一般是好书 2.作者 快读选书顺序 1.目录->定位这是一本什么书 2.看内容的呈现形式&#xff0c;内容的各部分占比大概是什么类型的信息。 3.去看自己擅长的知…

使用原子子表创建可重用的子组件

原子子表是一个图形对象&#xff0c;可帮助您在Stateflow图表中创建独立的子部件。原子子表允许&#xff1a; 对具有多个状态或层次结构的图表进行微小更改后&#xff0c;模拟速度更快。 在多个图表和模型中重复使用相同的状态或子表。 易于团队开发&#xff0c;适用于在同一图…

在现代多核和多线程环境中,如何优化 C 语言程序以充分利用硬件并行性?

在现代多核和多线程环境中&#xff0c;要优化C语言程序以充分利用硬件并行性&#xff0c;可以考虑以下几点&#xff1a; 并行算法设计&#xff1a;将任务分解为多个独立的子任务&#xff0c;并使用多线程或多进程同时执行这些子任务。这可以通过将问题分解为多个部分&#xff0…

小阿轩yx-MySQL备份与恢复

小阿轩yx-MySQL备份与恢复 企业对信息系统依赖性越来预高&#xff0c;数据库担任着重要角色如果发生意外宕机或数据丢失&#xff0c;损失是非常严重的数据库管理员必须针对具体的业务要求制定详细的数据库备份与灾难恢复策略 对数据库要求高的行业 银行证券电信等 MySQL 数…

PHP的SHA256WithRSA签名和Curl POST请求函数

getCustomerEncryptionKey - 获取加密秘钥 /** * 获取加密秘钥 * param array $params * return string */ public function getCustomerEncryptionKey(array $params): string { //1.ASCII码&#xff08;字典序-升序&#xff09;排序…

Python网络爬虫实战6—下一页,模拟用户点击,切换窗口

【前期提要】感兴趣的可以看看往期文章哈~ Python网络爬虫5-实战网页爬取 Python网络爬虫4-实战爬取pdf Pyhon网络爬虫3-模拟用户点击 Python网络爬虫实战2-下载url下的pdf Python网络爬虫基础1 1.需求背景 针对长虹美菱电器说明书网页形式&#xff0c;编写爬虫代码&#xff…

IO模型简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言简介正文实现总结 前言 简介 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程 序的时候,会面临一些巨大的挑战和困难,主要问题如下…

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.11 HAL_PCD_SOFCallback1.12 HAL_PCD_ResetCallback1.13 HAL_PCD_SuspendCallback1.14 HAL_PCD_ResumeCallback1.15 HAL_PCD_ISOOUTIncompleteCallback1.16 HAL_PCD_ISOINIncompleteCallbac…

【财务数字化转型之底座】集团企业财务数据中台系统建设方案

引言&#xff1a;随着企业规模的不断扩大和业务的复杂化&#xff0c;传统的财务管理模式已难以满足集团企业的数据整合、分析和决策需求。因此&#xff0c;建设一个高效、稳定、安全的财务数据中台系统&#xff0c;成为集团企业数字化转型的重要一环。本方案旨在构建一个集数据…

Android SurfaceFlinger——无效化和同步信号回调(十)

上一篇文章分析了屏幕热插拔回调回调,同时通过前面文章的介绍,我们知道一共有三个比较重要的回调,这里我们看一看另外两个回调函数无效化和垂直同步的相关调用。 一、回调介绍 这两个回调从表面看都是通知屏幕刷新的,但本质上还是有区别的。 无效化回调(Invalidate Hook…

算力服务先锋!和鲸科技入选《2024中国智算产业生态图谱》

2024 年 6 月 18 日&#xff0c;由科智咨询发起的《2024中国智算产业生态图谱》正式发布&#xff0c;依托 ModelWhale 构建的智算算力资源服务&#xff0c;以及深耕多年的 ModelWhale 数据科学协同平台优势&#xff0c;和鲸科技成功入选。 “智算时代”技术不断进步&#xff0c…