试比较GD32E230系列与L233/235芯片在IIC上使用温度传感器SHT40的异同

不说废话,上代码,不同之处直接用宏 展开

1. 首先是i2c 时钟配置  函数有些出入

void sensirion_i2c_attribute_config(){#ifdef GD32E230/* I2C clock configure */i2c_clock_config(I2C1, 100000, I2C_DTCY_2);/* I2C address configure */i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C1_OWN_ADDRESS7);/* enable I2C1 */i2c_enable(I2C1);/* enable acknowledge */i2c_ack_config(I2C1, I2C_ACK_ENABLE);#endif#ifdef GD32L235/* configure I2C timing */i2c_timing_config(I2C0, 0, 0x3, 0);i2c_master_clock_config(I2C0, 0x13, 0x36);i2c_address_config(I2C0, I2C1_OWN_ADDRESS7, I2C_ADDFORMAT_7BITS);/* configure slave address *///i2c_master_addressing(I2C0, 0x82, I2C_MASTER_TRANSMIT);/* enable I2C0 */i2c_enable(I2C0);#endif
}

2. 然后是 i2c 的读与 写,请看

a. 读

uint8_t sensirion_i2c_ReadByte_timeout(uint8_t Addr,uint8_t *data,uint16_t count){// IMPLEMENT#ifdef GD32E230uint8_t     state = I2C_START;uint16_t    timeout = 0;uint8_t     i2c_timeout_flag = 0;i2c_ackpos_config(I2C1, I2C_ACKPOS_NEXT);while(!(i2c_timeout_flag)){switch (state){case I2C_START:while(i2c_flag_get(I2CX, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_start_on_bus(I2C1);//i2c_starttimeout = 0;state = I2C_SEND_ADDRESS;}else{timeout = 0;state = I2C_START;//PR_DEBUG("i2c bus is busy in byte read \r\n");}break;case I2C_SEND_ADDRESS:/* i2c master sends START signal successfully */while((!i2c_flag_get(I2CX, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_master_addressing(I2CX, (Addr << 1), I2C_RECEIVER);timeout = 0;state = I2C_CLEAR_ADDRESS_FLAG;}else{timeout = 0;state = I2C_START;//add //提前退出循环i2c_timeout_flag = I2C_OK;//PR_DEBUG("i2c master sends start signal timeout in BYTE READ!\n");}break;case I2C_CLEAR_ADDRESS_FLAG:/* address flag set means i2c slave sends ACK */while((!i2c_flag_get(I2CX, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_flag_clear(I2CX, I2C_FLAG_ADDSEND);timeout = 0;state = I2C_TRANSMIT_DATA;}else{timeout = 0;state = I2C_START;//add //提前退出循环i2c_timeout_flag = I2C_OK;//PR_DEBUG("i2c master clears address flag timeout in BYTE WRITE!\n");}break;case I2C_TRANSMIT_DATA:/* wait until the transmit data buffer is empty */while((!i2c_flag_get(I2CX, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)){timeout++;}while(count){if(count == 1){i2c_ackpos_config(I2C1, I2C_ACKPOS_CURRENT);i2c_ack_config(I2C1, I2C_ACK_DISABLE);}if(i2c_flag_get(I2C1, I2C_FLAG_RBNE)){*data = i2c_data_receive(I2C1);i2c_ack_config(I2C1, I2C_ACK_ENABLE);data++;count--;}else{state = I2C_START;timeout = 0;}}state = I2C_STOP;timeout = 0;break;case I2C_STOP:/* send a stop condition to I2C bus */i2c_stop_on_bus(I2CX);/* i2c master sends STOP signal successfully */while((I2C_CTL1(I2CX) & 0x0200) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_ackpos_config(I2C1, I2C_ACKPOS_CURRENT);/* enable acknowledge */i2c_ack_config(I2C1, I2C_ACK_ENABLE);timeout = 0;state = I2C_END;i2c_timeout_flag = I2C_OK;}else{timeout = 0;state = I2C_START;//PR_DEBUG("i2c master sends stop signal timeout in BYTE READ\n");}break;default:state = I2C_START;i2c_timeout_flag = I2C_OK;timeout = 0;//PR_DEBUG("i2c master sends start signal in BYTE READ!\n");break;}}#endif#ifdef GD32L235i2c_process_enum    state = I2C_START;uint32_t            timeout = 0;uint8_t             end_flag = 0;//i2c_nack_disable(I2CX);i2c_transfer_byte_number_config(I2CX, count);
#if 1i2c_reload_disable(I2CX);/* enable I2C automatic end mode in master mode */i2c_automatic_end_enable(I2CX);
#endifwhile(!(end_flag)){//printf("i2c bus is busy in read_state:%d,LINE: %d!\r\n",state,__LINE__);switch (state){case I2C_START:/* configure number of bytes to be transferred */while(i2c_flag_get(I2CX, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) {timeout++;}if(timeout < I2C_TIME_OUT) {i2c_start_on_bus(I2CX);timeout = 0;state = I2C_SEND_ADDRESS;} else {/* timeout, bus reset *///i2c_bus_reset();timeout = 0;state = I2C_START;end_flag = I2C_OK;printf("i2c bus is busy in read_%d!\r\n",__LINE__);}break;case I2C_SEND_ADDRESS:while((!i2c_flag_get(I2CX, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)) {timeout++;}if(timeout < I2C_TIME_OUT) {i2c_master_addressing(I2CX, (Addr<<1), I2C_MASTER_RECEIVE);state = I2C_TRANSMIT_DATA;}else{timeout = 0;state = I2C_START;end_flag = I2C_OK;printf("i2c bus is I2C_SEND_ADDRESS timeout:%d!\r\n",__LINE__);}break;case I2C_TRANSMIT_DATA:while(count){if(i2c_flag_get(I2CX, I2C_FLAG_RBNE)){*data = i2c_data_receive(I2CX);data++;count--;}}state = I2C_STOP;timeout = 0;//printf("i2c transmit complete %d \r\n",i2c_flag_get(I2CX, I2C_FLAG_RBNE));break;case I2C_STOP:/* wait until the stop condition is finished */while((!i2c_flag_get(I2CX, I2C_FLAG_STPDET)) && (timeout < I2C_TIME_OUT)) {timeout++;}if(timeout < I2C_TIME_OUT) {/* clear STPDET flag */i2c_flag_clear(I2CX, I2C_FLAG_STPDET);timeout = 0;state = I2C_END;end_flag = I2C_OK;} else {timeout = 0;state = I2C_START;//printf("i2c master sends stop signal timeout in read!\n");}break;default:/* default status */state = I2C_START;end_flag = 1;timeout = 0;printf("i2c master sends start signal in read!\n");break;}}#endifreturn state;
}

b. 写

uint8_t sensirion_i2c_WriteByte_timeout(uint8_t Addr,const uint8_t *data,uint16_t count){#ifdef  GD32E230uint8_t     state = I2C_START;uint16_t    timeout = 0;uint8_t     i2c_timeout_flag = 0;while(!(i2c_timeout_flag)){switch (state){case I2C_START:while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_start_on_bus(I2C1);//i2c_starttimeout = 0;state = I2C_SEND_ADDRESS;}else{timeout = 0;state = I2C_START;i2c_timeout_flag = I2C_OK;//PR_ERR("%s,i2c bus is busy in byte write \r\n",SENSIR_STR);}break;case I2C_SEND_ADDRESS:/* i2c master sends START signal successfully */while((!i2c_flag_get(I2CX, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_master_addressing(I2CX, (Addr << 1), I2C_TRANSMITTER);timeout = 0;state = I2C_CLEAR_ADDRESS_FLAG;}else{timeout = 0;state = I2C_START;i2c_timeout_flag = I2C_OK;//PR_ERR("%s,i2c master sends start signal timeout in BYTE WRITE!\r\n",SENSIR_STR);}break;case I2C_CLEAR_ADDRESS_FLAG:/* address flag set means i2c slave sends ACK */while((!i2c_flag_get(I2CX, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_flag_clear(I2CX, I2C_FLAG_ADDSEND);timeout = 0;state = I2C_TRANSMIT_DATA;}else{timeout = 0;state = I2C_START;//add 提前退出循环i2c_timeout_flag = I2C_OK;//PR_ERR("%s,i2c master clears address flag timeout in BYTE WRITE!\r\n",SENSIR_STR);}break;case I2C_TRANSMIT_DATA:/* wait until the transmit data buffer is empty */while((!i2c_flag_get(I2CX, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)){timeout++;}while(count){i2c_data_transmit(I2CX, *data);data++;count--;while((!i2c_flag_get(I2CX, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;}else{timeout = 0;state = I2C_START;i2c_timeout_flag = I2C_OK;//PR_ERR("%s,i2c master sends data timeout in PAGE WRITE!\n",SENSIR_STR);break;}}state = I2C_STOP;timeout = 0;break;case I2C_STOP:/* send a stop condition to I2C bus */i2c_stop_on_bus(I2CX);/* i2c master sends STOP signal successfully */while((I2C_CTL1(I2CX) & 0x0200) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;state = I2C_END;i2c_timeout_flag = I2C_OK;}else{timeout = 0;state = I2C_START;//PR_ERR("%s,i2c master sends stop signal timeout in BYTE WRITE\r\n",SENSIR_STR);}break;default:state = I2C_START;i2c_timeout_flag = I2C_OK;timeout = 0;//PR_DEBUG("%s,i2c master sends start signal in BYTE WRITE!\r\n",SENSIR_STR);break;}}#endif#ifdef GD32L235i2c_process_enum        state = I2C_START;uint16_t                timeout = 0;uint8_t                 end_flag = 0;i2c_transfer_byte_number_config(I2C0, 16);//printf("i2c_master_addressing:0x%x\r\n",Addr<<1);while(!(end_flag)){//printf("IIC writeByte,state: %d\r\n",state);switch(state){case I2C_START:while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){i2c_start_on_bus(I2C0);timeout = 0;state = I2C_SEND_ADDRESS;}else{timeout = 0;state = I2C_START;end_flag = I2C_OK;//printf("i2c bus is busy in  writeByte! %d\r\n",__LINE__);}break;case I2C_SEND_ADDRESS:while((!i2c_flag_get(I2C0, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;i2c_master_addressing(I2C0, Addr<<1, I2C_MASTER_TRANSMIT);state = I2C_TRANSMIT_DATA;}else{timeout = 0;state = I2C_START;//printf("i2c master sends 's internal address timeout in  writeByte!\r\n");}break;case I2C_TRANSMIT_DATA:while((!i2c_flag_get(I2C0, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;i2c_data_transmit(I2C0, *data);state = I2C_STOP;}else{timeout = 0;state = I2C_START;//printf("i2c master sends data timeout in  writeByte! \r\n");}//printf("i2c_step2 NCK:%d! \r\n",i2c_flag_get(I2C0, I2C_FLAG_NACK));break;case I2C_STOP:/* send a stop condition to I2C bus */i2c_stop_on_bus(I2C0);/* i2c master sends STOP signal successfully */while(!i2c_flag_get(I2C0, I2C_FLAG_STPDET) && (timeout < I2C_TIME_OUT)){timeout++;}if(timeout < I2C_TIME_OUT){timeout = 0;state = I2C_END;end_flag = I2C_OK;/* clear the STPDET bit */i2c_flag_clear(I2C0, I2C_FLAG_STPDET);}else{timeout = 0;state   = I2C_START;printf("i2c master sends stop signal timeout in  writeByte!\r\n");}break;default:state = I2C_START;end_flag = I2C_OK;timeout = 0;printf("i2c master sends start signal in  WRITE!\r\n");break;}}#endifreturn state;
}

因为 两套api 接口不一致,所以还是有较大出入的。希望 在用这款单片机的兄弟闷,少走弯路,我这已经调好,拿走不谢!

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

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

相关文章

《QT从基础到进阶·四十一》无法解析的外部符号及生成事件加入QT打包命令报错问题

其他无法解析的外部符号&#xff1a; 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl ML_AddinManger::metaObject(void)const "… 无法解析的外部符号 “public: virtual void * __cdecl ML_AddinManger::qt_metacast(char const *)” (?…

toefl listening_托福听力

x.1 课程介绍 x.1.1 课程介绍 考试介绍 注意事项如下&#xff0c; x.1.2 分数设定和方法论 x.2.1 细节题解法 x.2.2 对话主旨题解法 听力对话不要扣分&#xff1b; 内容主旨题&#xff0c;以what开头&#xff1b; 目的主旨题&#xff0c;以why开头&#xff1b; 目的主旨题…

SpringCloud中注册中心Nacos的下载与使用步骤

1.前言 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一款服务发现和配置管理工具。它可以帮助用户自动化地进行服务注册、发现和配置管理&#xff0c;是面向微服务架构的一个重要组成部分。 2.下载 链接&#xff1a;https://pan.b…

奶茶店、女装店、餐饮店是高危创业方向,原因如下:

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 现在的俊男靓女们&#xff0c;心中都有一个执念&#xff1a; (1)想证明自己了&#xff0c;开个奶茶去…… (2)想多赚点钱了&#xff0c;加盟餐饮店去…… (3)工作不顺心了&#xff0c;搞个女装店去…… 但凡抱着…

建设一个专门的西班牙语网站是非常必要的

对于做西班牙语市场的外贸公司来说&#xff0c;建设一个专门的西班牙语网站是非常必要的。这不仅可以帮助企业更有效地接触和服务于西班牙语市场&#xff0c;还可以提高其在全球市场中的竞争力和品牌影响力。 市场需求和潜力&#xff1a;西班牙语是全球使用人数众多的语言之一…

回溯--字母迷宫

1.题目描述 字母迷宫游戏初始界面记作 m x n 二维字符串数组 grid&#xff0c;请判断玩家是否能在 grid 中找到目标单词 target。 注意&#xff1a;寻找单词时 必须 按照字母顺序&#xff0c;通过水平或垂直方向相邻的单元格内的字母构成&#xff0c;同时&#xff0c;同一个单…

Python requests模块 multipart/form-data类型文件上传

请求报文 HTTP方法 POST url url Cookie JSESSIONID87D45563C23AB48FAA67326CDAAC5D10 DATA ------WebKitFormBoundarytqaIYaLC4rpPRnpl Content-Disposition: form-data; name"isNew" 1 ------WebKitFormBoundarytqaIYaLC4rpPRnpl Content-Disposition: f…

Windows系统下DOS命令

Windows系统下DOS命令 1. 与文件操作相关1.1 mkdir&#xff0c;md命令1.2 rmdir、rd命令1.3 dir命令1.4 start命令1.5 echo命令1.6 type命令1.7 copy命令1.8 move命令1.9 copy和move的区别1.10 del命令1.11 rename命令1.12 attrib命令1.13 fsutil命令1.14 assoc命令 2. 与网络相…

与主流代码风格一致

不同的编程语言有不同的编程风格&#xff0c;软件工程师在编码时&#xff0c;要与主流代码风格保持一致&#xff0c;这样可以提高代码的可读性和可维护性&#xff0c;不同团队成员之间的协作更加顺畅。代码风格主要涉及如下内容&#xff1a; 缩进&#xff1a;使用一致的缩进风…

数据持久化第六课-ASP.NET运行机制

数据持久化第六课-ASP.NET运行机制 一.预习笔记 1.动态网页的工作机制通常分为以下几个阶段&#xff1a; 1&#xff09;使用动态Web开发技术编写Web应用程序&#xff0c;并部署到Web服务器。 2&#xff09;客户端通过在浏览器中输入地址&#xff0c;请求动态页面。 3&#…

机器学习之数学基础(六)~时间复杂度和空间复杂度

目录 算法背景 background 1. 时间复杂度 Time Complexity 1.1 时间复杂度分类 1.1.1 O(1) 常数阶 1.1.2 O(n) 线性阶 1.1.3 O(n^2) 平方阶 1.1.4 O(logn) 对数阶 1.1.5 O(nlogn) 线性对数阶 1.1.6 O(2^n) 指数阶 1.1.7 O(n!) 阶乘阶 1.1.8 时间复杂度分类 1.2 时…

周报 | 24.5.27-24.6.2文章汇总

为了更好地整理文章和发表接下来的文章&#xff0c;以后每周都汇总一份周报。 周报 | 24.5.20-24.5.26文章汇总-CSDN博客 集智书童 | YOLOv10开源&#xff5c;清华用端到端YOLOv10在速度精度上都生吃YOLOv8和YOLOv9_yolov8 yolov10-CSDN博客 机器之心 | 清华接手&#xff0c…

MySql什么时候表锁or行锁?

文章目录 锁的基本概念共享锁&#xff08;读锁&#xff09;排他锁&#xff08;写锁&#xff09;锁的兼容性锁的升级和降级 全局锁、表锁、行锁全局锁表锁行锁 何时使用行锁何时使用表锁额外思考&#xff1a; 在数据库的世界里&#xff0c;性能优化是一个永恒的话题。MySQL作为广…

03-07Java自动化之JAVA基础之循环

JAVA基础之循环 一、for循环 1.1for循环的含义 for&#xff08;初始化语句;条件判断;条件控制或–&#xff09;{ ​ //代码语句 } 1、首先执行初始话语句&#xff0c;给变量一个起始的值 2、条件判断进行判断&#xff0c;为true&#xff0c;执行循环体中的代码语句 ​ …

3DGS语义分割之LangSplat

LangSplat是CVPR2024的paper. 实现3DGS的语义分割&#xff08;可文本检索语义&#xff09; github: https://github.com/minghanqin/LangSplat?tabreadme-ov-file 主要思想是在3DGS中加入了CLIP的降维语义特征&#xff0c;可用文本检索目标&#xff0c;实现分割。 配置环境&…

网线水晶头为什么要按标准线序打

网线接水晶头为什么要按照线序接&#xff1f; 减少串扰和增强信号质量&#xff1a; 双绞线的设计是为了减少信号间的串扰&#xff08; Crosstalk&#xff09;&#xff0c;每一对线芯在传输过程中通过相互扭绞抵消外部电磁干扰。按照标准线序接线能够确保每一对线芯之间的信号传…

Ubuntu server 24 (Linux) 安装部署smartdns 搭建智能DNS服务器

SmartDNS是推荐本地运行的DNS服务器&#xff0c;SmartDNS接受本地客户端的DNS查询请求&#xff0c;从多个上游DNS服务器获取DNS查询结果&#xff0c;并将访问速度最快的结果返回给客户端&#xff0c;提高网络访问速度和准确性。 支持指定域名IP地址&#xff0c;达到禁止过滤的效…

Pinia的介绍、使用及持久化

Pinia介绍 什么是Pinia&#xff1f; Pinia 是 Vue 的最新 状态管理工具&#xff0c;状态就是数据。 通俗地讲&#xff1a;Pinia 是一个插件&#xff0c;可以帮我们管理 vue 通用的数据 (多组件共享的数据)。 比如一份数据有多个组件需要使用&#xff0c;在学Pinia之前我们需…

Accelerate 笔记:保存与加载文件

保存和加载模型、优化器、随机数生成器和 GradScaler 使用 save_state() 将上述所有内容保存到一个文件夹位置使用 load_state() 加载之前通过 save_state() 保存的状态通过使用 register_for_checkpointing()&#xff0c;可以注册自定义对象以便自动从前两个函数中存储或加载 …

vue3+electron+typescript 项目安装、打包、多平台踩坑记录-mac+linux(包括国产化系统)

上一章《vue3electrontypescript 项目安装、打包、多平台踩坑记录》&#xff0c;我们讲了vue3electrontypescript的项目安装和windows 32位、64位的打包。这一节我们来看下mac和linux平台的打包和一些坑。 mac 经过上一章我们的踩坑后&#xff0c;再到mac环境&#xff0c;这里…