ARM-I2C软实现

开发流程

  1. 引脚初始化
  2. 引脚功能定义
  3. 实现读操作
  4. 实现写操作

GD32F4软件I2C初始化

void SoftI2C_init() {// 时钟配置rcu_periph_clock_enable(SCL_RCU);// 设置输出模式gpio_mode_set(SCL_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SCL_PIN);gpio_output_options_set(SCL_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, SCL_PIN);// 时钟配置rcu_periph_clock_enable(SDA_RCU);// 设置输出模式gpio_mode_set(SDA_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SDA_PIN);gpio_output_options_set(SDA_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, SDA_PIN);
}
  • I2C引脚高低电平

GD32F4软件I2C引脚功能

#define SCL_RCU		RCU_GPIOB
#define SCL_PORT	GPIOB
#define SCL_PIN		GPIO_PIN_6
#define SCL_AF		GPIO_AF_4#define SDA_RCU		RCU_GPIOB
#define SDA_PORT	GPIOB
#define SDA_PIN		GPIO_PIN_7
#define SDA_AF		GPIO_AF_4/************** io ***************/
#define SCL(BIT) 		gpio_bit_write(SCL_PORT, SCL_PIN, BIT?SET:RESET)
#define SDA(BIT) 		gpio_bit_write(SDA_PORT, SDA_PIN, BIT?SET:RESET)
#define SDA_STATE() 	gpio_input_bit_get(SDA_PORT, SDA_PIN)#define SDA_IN()  	gpio_mode_set(SDA_PORT, GPIO_MODE_INPUT,  GPIO_PUPD_NONE, SDA_PIN)
#define SDA_OUT() 	gpio_mode_set(SDA_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SDA_PIN)
  • IO引脚定义
  • 引脚输出模式高低电平输出:SCL高和低,SDA高和低
  • SDA模式配置:SDA输出模式,SDA输入模式
  • SDA输入模式状态读取。

写操作

uint8_t SoftI2C_write(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t len) {start();send(addr << 1);			//发送设备写地址if(wait_ack()) return 1;	//等待响应send(reg);					//发送寄存器地址if(wait_ack()) return 2;	//等待响应do {send(*data++);if(wait_ack()) return 3;} while(--len);stop();return 0;
}

读操作

 

uint8_t SoftI2C_read(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t len) {start();send(addr << 1);				//发送设备写地址if(wait_ack()) return 1;		//等待响应send(reg);						//发送寄存器地址if(wait_ack()) return 2;		//等待响应start();send((addr << 1) | 0x01);		//发送设备读地址if(wait_ack()) return 3;		//等待响应do {*data = recv();data++;if(len != 1) send_ack();	// 发送 ACK} while(--len);send_nack();					// 发送 NACKstop();return 0;
}

 

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

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

相关文章

防水医用无人机市场报告:现状、趋势与洞察

市场规模与增长趋势在全球医疗科技快速发展的当下&#xff0c;防水医用无人机市场正崭露头角&#xff0c;展现出强劲的发展势头。据 QYR统计&#xff0c;2023 年全球医用无人机市场销售额达到 1.9 亿美元&#xff0c;预计到 2030 年将飙升至 8.5 亿美元&#xff0c;年复合增长率…

haproxy代理

一.负载均衡 1.1.什么是负载均衡 负载均衡&#xff1a;Load Balance&#xff0c;简称LB&#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均 衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备&#xff0c;…

【面试】软件测试面试题

1. 测试用例如何编写 2. bug的生命周期 项目有多少人&#xff1f;多少条测试用例&#xff1f;多少bug&#xff1f;自己发现的第一条&#xff1f;&#xff08;是不是bug&#xff09; 3. 缺陷管理工具 包括Jira, PingCode, 禅道&#xff0c;BugZilla&#xff0c;Redmine, TAPD&am…

HbuilderX开发小程序

1.打卡HbuilderX&#xff0c;选择文件—新建—项目2.创建项目3.在HbuilderX中运行前要确定微信开发这工具的服务端口号是打开的4.HbuilderX中点击预览可以实时预览5.在微信开发者中进行本地测试点击后自动跳转到微信开发者工具中运行项目

Netty中FastThreadLocal解读

io.netty.util.concurrent.FastThreadLocal 是 Netty 中提供的高性能线程局部存储&#xff08;Thread-Local Storage&#xff09;实现&#xff0c;位于 io.netty.util.concurrent 包。它是 Java 标准库 ThreadLocal 的替代品&#xff0c;旨在优化性能&#xff0c;减少内存分配和…

上海迪士尼游玩攻略 小铁寄存柜让你轻松畅玩

去上海迪士尼玩最烦带一堆行李&#xff0c;其实有小铁寄存柜帮忙就能轻装上阵&#xff0c;各个关键位置都有分布&#xff0c;玩起来特别省心。​刚到迪士尼的时候&#xff0c;要是坐地铁到上海国际旅游度假区站&#xff0c;1/2 号口安检区就有小铁柜&#xff0c;行李箱、大背包…

飞算科技重磅出品:飞算 JavaAI 重构 Java 开发效率新标杆

在 Java 开发领域&#xff0c;一款由国家级高新技术企业自主研发的智能工具正引发行业关注 —— 飞算 JavaAI 不仅承载着中国原创技术的创新基因&#xff0c;更以贴合实际开发场景的功能设计&#xff0c;成为众多企业提升 Java 开发效率的核心助力。​作为飞算数智科技&#xf…

python案例:基于python 神经网络cnn和LDA主题分析的旅游景点满意度分析

1&#xff0e;绪论1.1研究背景与意义1.1.1研究背景随着旅游业的快速发展&#xff0c;满意度分析成为评估旅游景点质量和提升游客体验的重要手段。作为中国的旅游城市之一&#xff0c;其旅游景点吸引了大量游客。然而&#xff0c;如何科学评估和提升旅游景点的满意度&#xff0c…

Git快速入门,完整的git项目管理工具教程,git入门到精通!

Git的下载与安装&#xff1a; 直接去官网下载即可&#xff1b; 或者查看这个博客学会下载:Git 详细安装教程&#xff08;详解 Git 安装过程的每一个步骤&#xff09;_git安装-CSDN博客 注意&#xff1a;一个文件夹下只能有一个本地仓库(就是一个.git) 细节操作

C++day07(三种取整方法)

学习目标 认识流程图 多种方式解决问题 取整方式和取整函数 1.解决编程问题的过程 1.理解题意,找出关键信息。 2.整理思路,用图或者文字写出算法。 3.将算法步骤翻译为C++代码。 4.编译运行,修改语法或逻辑错误。 不符合则需要回到上一步进行修改。 5 .输入测试用例与…

Go语言实战案例-LRU缓存机制模拟

在高性能服务开发中&#xff0c;缓存是提升访问速度和减少后端负载的重要手段。常见的缓存淘汰策略中&#xff0c;**LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;**是应用最广的一种。本篇我们用Go语言手写一个LRU缓存机制的模拟实现。一、LRU缓存…

vue2中实现leader-line-vue连线文章对应字符

效果展示 通过点击右边的tag,触发连接操作 第一步:获取右边tag展示 1.右边的tag列表展示,我这边是分为两个list嵌套的数据结构; {"人员": [{

SPEA2(Strength Pareto Evolutionary Algorithm 2)优化算法简介

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

IDEA 手动下载安装数据库驱动,IDEA无法下载数据库驱动问题解决方案,IDEA无法连接数据库解决方案(通用,Oracle为例)

一、查询要下载的数据库驱动 在IDEA侧边栏找到数据库&#xff08;databases&#xff09;&#xff0c;新增一个数据连接 右键&#xff0c;属性 点击下载&#xff0c;查看要下载的驱动版本 二、下载数据库驱动&#xff08;Oracle为例&#xff09; 下载对应MySQL/Oracle数据库的…

专业Python爬虫实战教程:逆向加密接口与验证码突破完整案例

案例背景假设我们需要爬取一家内部测试系统的动态数据API接口。该系统前端页面使用了复杂的JavaScript混淆技术来防止接口被直接调用&#xff0c;同时对请求参数进行了加密签名。另外&#xff0c;登录环节带有图形验证码用于防护。我们的目标是&#xff1a;分析JavaScript代码&…

【SQL】Windows MySQL 服务查询启动停止自启动(保姆级)

MySQL是一种开放源代码的轻量级关系型数据库管理系统&#xff0c;使用最常用的结构化查询语言&#xff08;SQL&#xff09;对数据库进行管理。由于MySQL具有体积小、速度快、成本低、开放源码等优点&#xff0c;现已被广泛应用于互联网上的中小型网站中&#xff0c;并且大型网站…

算法提升之数论(矩阵+快速幂)

通过矩阵和快速幂的方法来解决算法题目可以很好地降低时间复杂度&#xff0c;帮助大家更好地解决题目。下面这道题目有一定难度&#xff0c;希望大家可以好好地理解&#xff0c;相信对大家会有很大的帮助。问题描述有 n(2≤n≤10) 个玩家玩游戏&#xff0c;他们按 1 到 n 编号。…

数学建模算法-day[14]

6.2 传染病预测问题 问题提出 世界上存在很多传染病&#xff0c;如何根据其传播机理预测疾病得传染范围及染病人数等&#xff0c;对传染病的控制意义十分重大。 1.指数传播模型 基本假设 (1) 所研究的区域是一封闭区域&#xff0c;在一个时期内人口总量相对稳定&#xff0c;不考…

Linux救援模式之简介篇

什么是救援模式&#xff1f;救援模式提供了一个最小的Linux环境&#xff0c;通常只加载最基本的系统组件&#xff0c;允许管理员&#xff1a;修复损坏的系统恢复丢失的文件修改配置文件重置密码检查磁盘错误重新安装引导加载程序如何进入救援模式&#xff1f;1. 通过GRUB菜单进…

C++20实战FlamingoIM开发

C++20 与 Flamingo IM 实例 C++20 引入了许多新特性,如概念(Concepts)、协程(Coroutines)、范围(Ranges)等。Flamingo IM 是一个即时通讯项目,结合 C++20 的特性可以提升代码的可读性和性能。以下是基于 C++20 和 Flamingo IM 的实例。 协程实现异步网络通信 使用 C…