GD32 - IIC程序编写
一、初始化
理论知识链接:
IIC理论知识
二、代码实现
1、SDA和SCL设置成开漏输出模式
开漏输出的作用:
- 因为IIC总线是一种双向的通信协议,需要使用开漏输出实现共享总线。
- 开漏输出类似于一种线与的方式,即无论总线上哪个设备下拉了,所有设备都能知道。
- IIC总线通常需要使用上拉电阻来保证总线上的高电平。
以GD32为例,使用普通GPIO模拟IIC,初始化如下:
//PA1 -- SDA
//PA2 -- SCL#define iic_addr 0x30 //根据从机地址进行修改
#define GPIO_PORT_I2C GPIOA //根据引脚进行修改
#define GPIO_RCC_I2C RCU_GPIOA//根据引脚进行修改
#define GPIO_SCL_I2C GPIO_PIN_2//根据引脚进行修改
#define GPIO_SDA_I2C GPIO_PIN_1//根据引脚进行修改
#define delay_time 2 //2us//将引脚设置成开漏输出
void iic_init()
{rcu_periph_clock_enable(GPIO_RCC_I2C);//启动时钟gpio_mode_set(GPIO_PORT_I2C, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_SCL_I2C | GPIO_SDA_I2C);//默认上拉gpio_output_options_set(GPIOA, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_SCL_I2C | GPIO_SDA_I2C);//设置开漏输出i2c_stop();//复位一下
}
2、写启动信号
启动信号表现形式为:
- 静默状态:SCL、SDA为高电平。
- 启动信号:SCL为高电平时,SDA由高电平变成低电平
#define I2C_SCL_H gpio_bit_set(GPIO_PORT_I2C,GPIO_SCL_I2C)//拉高
#define I2C_SCL_L gpio_bit_reset(GPIO_PORT_I2C,GPIO_SCL_I2C)//拉低
#define I2C_SDA_H gpio_bit_set(GPIO_PORT_I2C,GPIO_SDA_I2C)//拉高
#define I2C_SDA_L gpio_bit_reset(GPIO_PORT_I2C,GPIO_SDA_I2C)//拉低//启动信号
/*
SCL ————————————————————\\___________SDA ——————————\\____________________
*/
void i2c_start()
{I2C_SDA_H;I2C_SCL_H;delay_us(delay_time);I2C_SDA_L;delay_us(delay_time);I2C_SCL_L;delay_us(delay_time);
}
3、写终止信号
终止信号表现形式为:
- 静默状态:SCL高电平、SDA为低电平。
- 终止信号:SCL为高电平时,SDA由低电平变成高电平
/*
SCL ————————————————————————————————————————SDA /——————————————————_________________/
*/
void i2c_stop()
{I2C_SDA_L;I2C_SCL_H;delay_us(delay_time);I2C_SDA_H;
}
4、发送一个字节数据
void i2c_sendbyte(unsigned char data)
{unsigned char i;for(i = 0; i < 8; i++)//8bit = 1byte{if(data & 0x80)//取出最高位{I2C_SDA_H;}else{I2C_SDA_L;}delay_us(delay_time);I2C_SCL_H;delay_us(delay_time);I2C_SCL_L;if(i == 7){I2C_SDA_H;//释放总线}data <<= 1;delay_us(delay_time);}
}
5、接收一个字节数据
#define I2C_SDA_READ gpio_input_bit_get(GPIO_PORT_I2C,GPIO_SDA_I2C)unsigned char i2c_readbyte()
{unsigned char i;unsigned char data = 0x00;for(i = 0; i < 8; i++){data <<= 1;I2C_SCL_H;delay_us(delay_time);if(I2C_SDA_READ){data |= 0x01;//存入数据}I2C_SCL_L;delay_us(delay_time);}return data;
}
6、产生一个ACK信号
- SCL为低电平时,SDA写入低电平
- SCL为高电平时,SDA读取低电平
- 读取完成后将SDA拉高
/*
SCL /————————\_______/ \________________SDA /————————————————————————————————————__________________________/
*/
void i2c_ack()
{I2C_SDA_L;delay_us(delay_time);I2C_SCL_H;delay_us(delay_time);I2C_SCL_L;delay_us(delay_time);I2C_SDA_H;
}
7、产生一个NACK信号
void i2c_nack()
{I2C_SDA_H;delay_us(delay_time);I2C_SCL_H;delay_us(delay_time);I2C_SCL_L;delay_us(delay_time);
}
8、检测是否从机是否返回ACK
//0:表示ACK 1:表示NACK
unsigned char i2c_read_ack()
{unsigned char re;I2C_SDA_H;delay_us(delay_time);I2C_SCL_H;delay_us(delay_time);if(I2C_SDA_READ) re = 1;else re = 0;I2C_SCL_L;delay_us(delay_time);return re;
}
9、发送地址和读操作,并读回一个字节数据
unsigned char read_data()
{i2c_start();//启动信号i2c_sendbyte(iic_addr | 0x01);//发送地址和读位if(i2c_read_ack()) return 0;//如果没有读到ACK,终止执行。unsigned char data = i2c_readbyte();//读取数据i2c_stop();//发送终止信号return data;//返回接收的数据
}
相关文章:
GD32 - IIC程序编写
一、初始化 理论知识链接: IIC理论知识 二、代码实现 1、SDA和SCL设置成开漏输出模式 开漏输出的作用: 因为IIC总线是一种双向的通信协议,需要使用开漏输出实现共享总线。开漏输出类似于一种线与的方式,即无论总线上哪个设备…...
将项目部署到docker容器上
通过docker部署前后端项目 前置条件 需要在docker中拉去jdk镜像、nginx镜像 docker pull openjdk:17 #拉取openjdk17镜像 docker pull nginx #拉取nginx镜像部署后端 1.打包后端项目 点击maven插件下面的Lifecycle的package 对后端项目进行打包 等待打包完成即可 2.将打…...
免费【2024】springboot宠物美容机构CRM系统设计与实现
博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…...
搞懂数据结构与Java实现
文章链接:搞懂数据结构与Java实现 (qq.com) 代码链接: Java实现数组模拟循环队列代码 (qq.com) Java实现数组模拟栈代码 (qq.com) Java实现链表代码 (qq.com) Java实现哈希表代码 (qq.com) Java实现二叉树代码 (qq.com) Java实现图代码 (qq.com)...
Stable Diffusion 图生图
区别于文生图,所谓的图生图,俗称的垫图,就是比文生图多了一张参考图,由参考一张图来生成图片,影响这个图片的要素不仅只靠提示词了,还有这个垫图的因素,这个区域就上上传垫图的地方,…...
语言转文字
因为工作原因需要将语音转化为文字,经常搜索终于找到一个免费的好用工具,记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…...
ref函数
Vue2 中的ref 首先我们回顾一下 Vue2 中的 ref。 ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例࿱…...
7/30 bom和dom
文档对象mox 浏览器对象模型...
【Golang 面试 - 进阶题】每日 3 题(五)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
MySQL,GROUP BY子句的作用是什么?having和where的区别在哪里说一下jdbc的流程
GROUP BY 子句的作用是什么 GROUP BY 字段名 将数据按字段值相同的划为一组,经常配合聚合函数一起使用。 having和where的区别在哪里 where是第一次检索数据时候添加过滤条件,确定结果集。而having是在分组之后添加结果集,用于分组之后的过…...
1._专题1_双指针_C++
双指针 常见的双指针有两种形式,一种是对撞指针,一种是左右指针。对撞指针:一般用于顺序结构中,也称左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐往中间逼近…...
Spring集成ES
RestAPI ES官方提供的java语言客户端用以组装DSL语句,再通过http请求发送给ES RestClient初始化 引入依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </d…...
力扣高频SQL 50题(基础版)第二十六题
文章目录 力扣高频SQL 50题(基础版)第二十六题1667.修复表中的名字题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题(基础版)第二十六题 1667.修复表中的名字 题目说明 表: Users ----------------…...
WIFI 接收机和发射机同步问题+CFO/SFO频率偏移问题
Synchronization Between Sender and Receiver & CFO Correction 解决同步问题和频率偏移问题是下面论文的关键,接下来结合论文进行详细解读 解读论文:Verification and Redesign of OFDM Backscatter 论文pdf:https://www.usenix.org/s…...
ubuntu安装并配置flameshot截图软件
参考:flameshot key-bindins 安装 sudo apt install flameshot自定义快捷键 Settings->Keyboard->View and Customize Shortcuts->Custom Shortcuts,输入该快捷键名称(自定义),然后输入command(…...
【Linux】CentOS更换国内阿里云yum源(超详细)
目录 1. 前言2. 打开终端3. 确保虚拟机已经联网4. 备份现有yum配置文件5. 下载阿里云yum源6. 清理缓存7. 重新生成缓存8. 测试安装gcc 1. 前言 有些同学在安装完CentOS操作系统后,在系统内安装比如:gcc等软件的时候出现这种情况:(…...
Leetcode49. 字母异位词分组(java实现)
今天我来给大家分享的是leetcode49的解题思路,题目描述如下 如果没有做过leetcode242题目的同学,可以先把它做了,会更好理解异位词的概念。 本道题的大题思路是: 首先遍历strs,然后统计每一个数组元素出现的次数&#…...
OpenJudge | 字符串中最长的连续出现的字符
总时间限制: 1000ms 内存限制: 65536kB 描述 求一个字符串中最长的连续出现的字符,输出该字符及其出现次数,字符串中无空白字符(空格、回车和tab),如果这样的字符不止一个,则输出第一个 输入 首先输入N…...
11day-C++list容器使用
这里写目录标题 1. list的介绍及使用1.1 list的介绍1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list的迭代器失效 2. list的模拟实现2.1 list的反向迭代器 1. list的介绍及使用 1.1 list的介绍 list的…...
docker 常用管理命令及数据备份
docker 常用管理命令及数据备份 常用管理命令 重启 cd share docker compose restart 停止 cd share docker compose stop 启动 cd share ./deploy.sh 升级 cd share ./deploy.sh 查看日志 cd share docker compose logs -f 数据备份 以下备份相关命令均要求在doc…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
