当前位置: 首页 > news >正文

ARM32开发--IIC软实现

知不足而奋进 望远山而前行


目录

文章目录

前言

开发流程

GD32F4软件I2C初始化

GD32F4软件I2C引脚功能

写操作

读操作

总结


前言

在嵌入式系统开发中,软件实现的I2C通信协议扮演着至关重要的角色。本文将深入探讨如何在GD32F4系列微控制器上实现软件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;
}

总结

本文详细介绍了如何在GD32F4系列微控制器上实现软件I2C功能。首先,通过引脚初始化和功能定义确保了I2C通信的正常进行。随后,展示了如何实现基本的读写操作,包括开始和停止条件的生成、地址和数据的发送与接收,以及对应的应答信号处理。这些步骤不仅仅是硬件控制的反映,更是软件层面对I2C通信协议的实现与管理,为嵌入式系统开发提供了一个可靠的解决方案。

http://www.lryc.cn/news/372051.html

相关文章:

  • 在有向无环图(DAG)中实现拓扑排序与最短路径和最长路径算法
  • SQLServer按照年龄段进行分组查询数据
  • 开放式耳机哪个品牌质量比较好?2024高性价比机型推荐!
  • Blender骨骼创建
  • DevExpress WPF中文教程:Grid - 如何完成列和编辑器配置(设计时)?
  • 高考完的三个月想自学点编程,有没有什么建议
  • 运维开发(DevOps):加速软件交付的关键方法
  • Vue前端环境搭建:从四个方面、五个方面、六个方面和七个方面深度解析
  • 农业领域科技查新点提炼方法附案例!
  • 【Bazel入门与精通】 rules之属性
  • Elementor无需第三方插件实现高级下拉菜单/巨型菜单
  • 【数学】什么是傅里叶变换?什么是离散傅里叶变换?什么是拉普拉斯变换?
  • opencv安装笔记 各种平台
  • 前端开发中的热更新原理
  • unix环境高级编程第2版:深入探索UNIX编程的奥秘
  • 力扣42 接雨水
  • 【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列
  • Talk|新加坡国立大学贾鑫宇:适用于高自由度机器人的运动控制器
  • 【npm】console工具(含胶囊,表格,gif图片)
  • OpenCV读取图片
  • HBase中的CRUD
  • C/C++学习笔记 C语言中的\0以及查找字符串中字符出现的频率
  • 在C#中,有多种方式可以实现每天在指定的时间清空数据库数据。下面列出几种常用的方法,并提供简要的实现思路:
  • 深入理解java设计模式之单例模式
  • 程序员自由创业周记#36:Gap Year
  • Java 类与对象 -- Java 语言的类与对象、构造器、static、final、包和 JAR
  • MTK平台纯色背景抑制
  • Linux iptables使用详解
  • 算法02 递归算法及其相关问题
  • 三个pdf工具和浏览软件(pdftk,muppdf,epdfview)