1.前言

本来想用他自身的硬件I2C实现的,但是不知道为啥跑demo一点波形都没有,改成推挽也没有波形,只有初始化的电平变化,而且I2C的驱动库好像有点复杂,起始信号结束信号都得单独发的,没有一个全部封装好的库直接往里填数据的就能发的那种,希望后续看看有没有更新啥的,或者大佬分享下经验。
所以本次项目用的软件模拟I2C实现啦,移植性也比较强。直接搬

2.硬件准备

GD32VW553-IOT开发板1个
CH340串口1个
0.96OLED屏幕一个
杜邦线若干

3.代码移植

本次项目是在官方驱动库的硬件I2C库改的,要字库驱动啥的可以评论区留言

main.c

oled屏幕从机的地址上0x78

#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32vw553h_eval.h"
#include "oled.h"
#include "OLED_Data.h"#define I2C_SLAVE_ADDRESS7   0x78void rcu_config(void)
{/* enable GPIOA clock */rcu_periph_clock_enable(RCU_GPIOA);
}void i2c_gpio_config(void)
{gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_2);gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3);gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_3);}int main(void)
{/* configure systick */systick_config();eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);gd_eval_com_init(EVAL_COM0);        //初始化串口,上一篇有讲/* 启用外设时钟 */rcu_config();/* 配置I2C GPIO端口 */i2c_gpio_config();/* 初始化OLED */OLED_Init();/*在(0, 0)位置显示字符'A',字体大小为8*16点阵*/OLED_ShowChar(0, 0, 'A', OLED_8X16);/*在(16, 0)位置显示字符串"Hello World!",字体大小为8*16点阵*/OLED_ShowString(16, 0, "Hello World!", OLED_8X16);/*在(0, 18)位置显示字符'A',字体大小为6*8点阵*/OLED_ShowChar(0, 18, 'A', OLED_6X8);/*在(16, 18)位置显示字符串"Hello World!",字体大小为6*8点阵*/OLED_ShowString(16, 18, "Hello World!", OLED_6X8);/*在(0, 28)位置显示数字12345,长度为5,字体大小为6*8点阵*/OLED_ShowNum(0, 28, 12345, 5, OLED_6X8);/*在(40, 28)位置显示有符号数字-66,长度为2,字体大小为6*8点阵*/OLED_ShowSignedNum(40, 28, -66, 2, OLED_6X8);/*在(70, 28)位置显示十六进制数字0xA5A5,长度为4,字体大小为6*8点阵*/OLED_ShowHexNum(70, 28, 0xA5A5, 4, OLED_6X8);/*在(0, 38)位置显示二进制数字0xA5,长度为8,字体大小为6*8点阵*/OLED_ShowBinNum(0, 38, 0xA5, 8, OLED_6X8);/*在(60, 38)位置显示浮点数字123.45,整数部分长度为3,小数部分长度为2,字体大小为6*8点阵*/OLED_ShowFloatNum(60, 38, 123.45, 3, 2, OLED_6X8);/*在(0, 48)位置显示英文和汉字串"Hello,世界。",支持中英文混写*/OLED_ShowString(0, 48, "Hello,世界。", OLED_8X16);/*在(96, 48)位置显示图像,宽16像素,高16像素,图像数据为Diode数组*/OLED_ShowImage(96, 48, 16, 16, Diode);/*在(96, 18)位置打印格式化字符串,字体大小为6*8点阵,格式化字符串为"[%02d]"*/OLED_Printf(96, 18, OLED_6X8, "[%02d]", 6);/*调用OLED_Update函数,将OLED显存数组的内容更新到OLED硬件进行显示*/OLED_Update();printf("booting\r\n");while(1) {printf("ing\r\n");}
}

oled.c

需要改的地方不多,就是IO口这里,其他照搬代码太多不写了,可以下载江协的代码修改下
这里用的PA2-SCL PA3-SDA硬件I2C也是对的上的

/*** 函    数:OLED写SCL高低电平* 参    数:要写入SCL的电平值,范围:0/1* 返 回 值:无* 说    明:当上层函数需要写SCL时,此函数会被调用*           用户需要根据参数传入的值,将SCL置为高电平或者低电平*           当参数传入0时,置SCL为低电平,当参数传入1时,置SCL为高电平*/
void OLED_W_SCL(uint8_t BitValue)
{/*根据BitValue的值,将SCL置高电平或者低电平*/gpio_bit_write(GPIOA, GPIO_PIN_2, BitValue);/*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*///...
}/*** 函    数:OLED写SDA高低电平* 参    数:要写入SDA的电平值,范围:0/1* 返 回 值:无* 说    明:当上层函数需要写SDA时,此函数会被调用*           用户需要根据参数传入的值,将SDA置为高电平或者低电平*           当参数传入0时,置SDA为低电平,当参数传入1时,置SDA为高电平*/
void OLED_W_SDA(uint8_t BitValue)
{/*根据BitValue的值,将SDA置高电平或者低电平*/gpio_bit_write(GPIOA, GPIO_PIN_3, BitValue);/*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*///...
}

4.实验现象

在这里插入图片描述

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

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

相关文章

刀客doc:Instagram会成为Meta广告业务的第二曲线吗?

文/刀客doc(头条深一度精选作者)一如果现在还用“Facebook的小弟”来定义Instagram&#xff0c;多少显得有些过时了。在和一些出海品牌负责人聊天时&#xff0c;我有个很明显的感受&#xff1a;他们已经不会再把Instagram当成“附属资源”去看待。到2025年第二季度&#xff0c;…

Python日期计算完全指南:从上周五到任意日期的高效计算

引言&#xff1a;日期计算的核心价值在业务系统开发中&#xff0c;日期计算是高频且关键的需求。根据2024年企业系统调查报告&#xff1a;85%的财务系统需要计算上周五&#xff08;工资结算日&#xff09;78%的报表系统依赖周数据统计92%的供应链系统使用工作日计算65%的BI工具…

达梦数据库-重做日志文件(一)

达梦数据库-重做日志文件(redo)(一) 1.查看redo文件 SQL> select * from v$rlogfile;行号 GROUP_ID FILE_ID PATH CLIENT_PATH CREATE_TIME RLOG_SIZE MIN_EXEC_VER MIN_DCT_VER ---------- ----------…

STM32CubeMX 6.15.0 + CLion

-DCMAKE_TOOLCHAIN_FILE./cmake/gcc-arm-none-eabi.cmake 参考 Clion进行嵌入式开发生成.hex文件教程_clion hex-CSDN博客

redis添加超时设置

redis添加参数的超时设置, 并且需要加锁,一开始是用redisTemplate.opsForValue().setIfAbsent("key","value",1,TimeUnit.SECONDS);结果发现这种方式直接会返回空指针错误所以只能对方法加锁来解决加锁和超时的问题import lombok.extern.slf4j.Slf4j; impo…

七牛云实践:我们如何用 AIGC 将产品开发从“人想图”变为“图选图”

在火热进行中的2025深圳国际文创展上&#xff0c;AI玩具、数字艺术等新兴品类无疑成为了焦点。表面的喧嚣之下&#xff0c;一个更深层次的变革正在悄然发生&#xff1a;驱动这些创新产品诞生的底层工作流&#xff0c;正在被AIGC技术深刻影响。 对于身处其中的产品经理、设计师和…

医疗器械企业如何做好多系统权限管理?解析PLM、ERP、MES权限角色

在医疗器械这个高度专业化、强监管的行业&#xff0c;数字化转型不仅意味着效率提升&#xff0c;更关乎合规与安全。当企业将业务流程从研发、生产、销售到售后&#xff0c;逐步迁移到ERP、PLM、MES、CRM等各类数字系统中时&#xff0c;一个关键而又常常被忽视的问题浮出水面&a…

蓝凌研究院《2025上市公司AI数智化转型白皮书》发布

上市公司是国民经济基本盘。目前中国境内上市公司达5420家&#xff0c;加上海外上市公司总数会更多。上市公司群体是国民经济的基本盘&#xff0c;其发展态势深刻映照着经济转型的脉搏与韧性。目前&#xff0c;中国在境内上市的公司总数达5420家&#xff0c;加上海外上市的公司…

OpenFOAM并行区域分解生成的polymesh文件解释

文章目录OpenFOAM里区域分解后polymesh文件解释&#x1f539; 1. What is polyMesh?&#x1f539; 2. Domain Decomposition Overview&#x1f539; 3. How decomposePar Works with polyMeshKey Output Files in processorX/polyMesh/:&#x1f539; 4. Types of Decompositi…

前端-npm和yarn的安装以及区别

目录 一.安装npm或yarn 安装Yarn &#x1f5a5;️ macOS / Linux 方式 1&#xff1a;通过 npm 安装&#xff08;最简单&#xff09; 方式 2&#xff1a;通过系统包管理器 &#x1fa9f; Windows 方法 1&#xff1a;用 npm 安装 方法 2&#xff1a;用 MSI 安装包 方法 3&#x…

通信原理实验之线性均衡器-迫零算法

通信原理实验之线性均衡器-迫零算法一、实验目的1、了解线性均衡器&#xff1b;2、了解迫零算法&#xff1b;3、熟悉眼图的使用。二、实验仪器1、序列码产生2、信号中继器3、加多径干扰4、迫零均衡5、信号分布图 6、眼图三、实验的理论基础1.线性均衡器&#xff1a;信道均衡技术…

把 AI 塞进「智能手环」——基于心率变异的零样本压力监测手环

标签&#xff1a;心率变异、压力监测、零样本、智能手环、TinyML、RISC-V、低功耗、边缘 AI ---- 1. 背景&#xff1a;为什么手环要「测压力」&#xff1f; 现代生活压力大&#xff0c;全球 30% 的人有焦虑症状&#xff0c;但传统手环&#xff1a; • 只能测心率&#xff0c;无…

fastapi项目细节和启动顺序

要搞清楚 FastAPI 项目启动的执行逻辑&#xff0c;需要先明确 “项目启动流程”“main 函数角色”“lifespan 作用”“导入语句执行时机” 这几个核心点的关系&#xff0c;下面逐一拆解&#xff1a;一、FastAPI 项目启动&#xff1a;先执行 “导入语句”&#xff0c;再执行 “m…

Fluent Bit系列:字符集转码测试(上)

#作者&#xff1a;程宏斌 文章目录gbk2utf8.lua 脚本说明在主配置中配置过滤器。如何在Linux系统中手动生成GBK日志&#xff1f;验证日志转码的准确性测试测试方案fluent-bit 3.0.2 转换测试这部分内容分为两个任务&#xff1a; 是验证 Lua 脚本是否能够将 GBK 编码的文本转换为…

ApiFox高并发测试用例

介绍 在开发中我们经常会测试高并发场景下的业务&#xff0c;下面来看看如何使用ApiFox编写一个高并发的测试用例 编写接口 第一步我们要编写测试的接口&#xff0c;并且建立一个用例 自动化测试 将上面的测试用例添加到自动化测试中&#xff0c;设置并发参数即可&#xff0c…

【MySQL数据库入门课程】开课啦!

&#x1f4e3; 【MySQL数据库入门课程】开课啦&#xff01; 课程名称&#xff1a;MySQL数据库实战入门&#xff08;零基础友好版&#xff09; 开课时间&#xff1a;2025年9月1日 授课方式&#xff1a;线上免费学习 实操练习 教师全程指导 适合人群&#xff1a;中职学校计算机…

面试中的并发编程题(下)

12、synchronized和Lock有什么区别语法层面synchronized是关键字&#xff0c;源码在jvm中&#xff0c;用c实现Lock是接口&#xff0c;源码又jdk提供&#xff0c;用Java实现使用synchronized时&#xff0c;退出同步代码块锁会自动释放&#xff0c;而使用Lock时&#xff0c;需要手…

Autosar之DCM模块

一、DCM介绍 DCM(Diagnostic Communication Manager)是AUTOSAR(汽车开放系统架构)基础软件BSW中服务层(Service Layer)的核心模块,其核心功能是为车辆电子控制单元(ECU)提供符合行业标准(如ISO 14229 UDS、ISO 15765 DoCAN、ISO 15031 OBD等)的诊断服务支持,为开发…

HFSS许可证与版本兼容性

在电磁仿真领域&#xff0c;HFSS&#xff08;High Frequency Structure Simulator&#xff09;软件因其卓越的性能和广泛的应用而备受赞誉。然而&#xff0c;为了确保用户能够充分利用HFSS的功能并获得流畅的仿真体验&#xff0c;许可证与版本兼容性成为了不可忽视的重要因素。…

Java有几种文件拷贝方式,哪一种效率最高?

文章目录一、Java文件拷贝的5种方式1. 传统IO流&#xff08;字节流/字符流&#xff09;手动拷贝2. NIO的FileChannel拷贝&#xff08;transferTo/transferFrom&#xff09;3. Java 7的Files.copy()工具类4. 缓冲流&#xff08;BufferedInputStream/BufferedOutputStream&#x…