STM32——IIC篇

技术笔记!

一、IIC总线协议介绍(掌握)

1.1  IIC总线结构图

1.2  IIC协议时序

1.3  硬件和软件IIC对比

二、AT24C02介绍(了解)

2.1  AT24C02通讯地址

三、AT24C02读写时序(掌握)

3.1  写时序

3.2  读时序

四、AT24C02驱动步骤(掌握)

为什么IIC总线SDA建议用开漏模式?

五、编程实战(掌握)

iic.c

#include "./BSP/IIC/myiic.h"
#include "./SYSTEM/delay/delay.h"void iic_init(void)
{GPIO_InitTypeDef gpio_init_struct;IIC_SCL_GPIO_CLK_ENABLE();  /* SCL引脚时钟使能 */IIC_SDA_GPIO_CLK_ENABLE();  /* SDA引脚时钟使能 */gpio_init_struct.Pin = IIC_SCL_GPIO_PIN;gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */HAL_GPIO_Init(IIC_SCL_GPIO_PORT, &gpio_init_struct);    /* SCL */gpio_init_struct.Pin = IIC_SDA_GPIO_PIN;gpio_init_struct.Mode = GPIO_MODE_OUTPUT_OD;            /* 开漏输出 */HAL_GPIO_Init(IIC_SDA_GPIO_PORT, &gpio_init_struct);    /* SDA *//* SDA引脚模式设置,开漏输出,上拉, 这样就不用再设置IO方向了, 开漏输出的时候(=1), 也可以读取外部信号的高低电平 */
}static void iic_delay(void)
{delay_us(2);
}/* 起始信号 */
void iic_start(void)
{/* SCL为高电平期间, SDA从高电平往低电平跳变*/IIC_SDA ( 1 );IIC_SCL ( 1 );iic_delay( );IIC_SDA ( 0 );iic_delay( );IIC_SCL ( 0 );iic_delay( );  /* 钳住总线, 准备发送/接收数据 */
}/* 停止信号 */
void iic_stop(void)
{/* SCL为高电平期间, SDA从低电平往高电平跳变*/IIC_SDA ( 0 );iic_delay( );IIC_SCL ( 1 );iic_delay( );IIC_SDA ( 1 );  /* 发送总线停止信号*/iic_delay( );
}/* 等待应答信号 */
uint8_t iic_wait_ack (void) /* return 1:fail 0:succeed*/
{IIC_SDA (1);    /* 主机释放SDA线 */iic_delay( );IIC_SCL (1);    /* 从机返回ACK*/iic_delay( );if ( IIC_READ_SDA ) /* SCL高电平读取SDA状态*/ {iic_stop();     /* SDA高电平表示从机nack */ return 1;}IIC_SCL(0);         /* SCL低电平表示结束ACK检查 */ iic_delay( );return 0;
}/* 应答信号 */
void iic_ack(void)
{ IIC_SCL (0);iic_delay( );IIC_SDA (0);  /* 数据线为低电平,表示应答 */iic_delay( );IIC_SCL (1);iic_delay( );
}/* 非应答信号 */
void iic_nack(void)
{ IIC_SCL (0);iic_delay( );IIC_SDA (1);  /* 数据线为低电平,表示应答 */iic_delay( );IIC_SCL (1);iic_delay( );
}/* 发送一个字节数据 */
void iic_send_byte(uint8_t data)
{for (uint8_t t = 0; t < 8; t++){/* 高位先发 */IIC_SDA((data & 0x80) >> 7);iic_delay( );IIC_SCL ( 1 );iic_delay( );IIC_SCL ( 0 );data <<= 1;     /* 左移1位, 用于下一次发送 */}IIC_SDA ( 1 );      /* 发送完成,主机释放SDA线 */ 
}/* 读取1字节数据 */
uint8_t iic_read_byte (uint8_t ack)
{ uint8_t receive = 0 ;for (uint8_t t = 0; t < 8; t++){/* 高位先输出,先收到的数据位要左移 */ receive <<= 1;IIC_SCL ( 1 );iic_delay( );if ( IIC_READ_SDA ) receive++;IIC_SCL ( 0 );iic_delay( );}if ( !ack ) iic_nack();else iic_nack();return receive;
}

24cxx.c

#include "./BSP/IIC/myiic.h"
#include "./BSP/24CXX/24cxx.h"
#include "./SYSTEM/delay/delay.h"void at24c02_init(void)
{iic_init();
}void at24c02_write_one_byte(uint8_t addr, uint8_t data)
{/* 1、发送起始信号 */iic_start();/* 2、发送通讯地址(写操作地址) */iic_send_byte(0xA0);/* 3、等待应答信号 */iic_wait_ack();/* 4、发送内存地址 */iic_send_byte(addr);/* 5、等待应答信号 */iic_wait_ack();/* 6、发送写入数据 */iic_send_byte(data);/* 7、等待应答信号 */iic_wait_ack();/* 8、发送停止信号 */iic_stop();/* 等待EEPROM写入完成 */delay_ms(10);
}uint8_t at24c02_read_one_byte(uint8_t addr)
{uint8_t rec = 0;/* 1、发送起始信号 */iic_start();/* 2、发送通讯地址(写操作地址) */iic_send_byte(0xA0);/* 3、等待应答信号 */iic_wait_ack();/* 4、发送内存地址 */iic_send_byte(addr);/* 5、等待应答信号 */iic_wait_ack();/* 6、发送起始信号 */iic_start();/* 7、发送通讯地址(读操作地址) */iic_send_byte(0xA1);/* 8、等待应答信号 */iic_wait_ack();/* 9、等待接收数据 */rec = iic_read_byte(0);/* 10、发送非应答(获取该地址即可) *//* 11、发送停止信号 */iic_stop();return rec;
}

main.c

int main(void)
{uint8_t key;uint8_t i = 0;uint8_t data = 0;HAL_Init();                                 /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9);         /* 设置时钟, 72Mhz */delay_init(72);                             /* 延时初始化 */usart_init(115200);                         /* 串口初始化为115200 */led_init();                                 /* 初始化LED */key_init();                                 /* 初始化按键 */at24c02_init();while (1){key = key_scan(0);if (key == KEY1_PRES){at24c02_write_one_byte(100, 66);printf("write data \r\n");}if (key == KEY0_PRES){data = at24c02_read_one_byte(100);printf("read data:%d \r\n", data);}i++;if (i % 20 == 0){LED0_TOGGLE();  /* 红灯闪烁 */i = 0;}delay_ms(10);}
}

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

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

相关文章

有趣的css - 移形换位加载动画

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是一个移形换位动态加载小动效&#xff0c;适用于 app 列表加载&#xff0c;页面加载或者图片懒加载等场景。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html…

Ubuntu22.04本地部署qwen模型、jupyterlab开发环境、LoRA微调全流程

前言 这段时间在自己的Win11系统上部署了chatGLM以及Qwen模型&#xff0c;进行对话、推理以及工具调用都没有问题&#xff0c;但是在尝试进行微调的时候发现好像并不能成功&#xff0c;因此花费了很大的力气&#xff0c;又分别在ubuntu桌面版、windows子系统WSL2 Ubuntu上部署…

数据可视化第9天(利用wordcloud和jieba分析蝙蝠侠评论的关键字)

数据可以在这里下载 https://github.com/harkbox/DataAnalyseStudy WordCloud wordcloud可以很方便的生成词云图&#xff0c;方便的提供可视化可以直接使用pip install wordcloud进行安装如果使用的是Anaconda,可以使用conda install进行安装 下面看一个简单的例子 txt &qu…

JVM学习-堆空间(三)

JVM在进行GC时&#xff0c;并非每次都对新生代、老年代、方法区(元空间)三个区域一起回收&#xff0c;大部分时间回收的都是新生代 针对Hotspot VM的实现&#xff0c;它里面的GC按照回收区域分两大类型&#xff1a;一种是部分收集(Partial GC)&#xff0c;一种是整堆收集(Full …

amtlib.dll打不开怎么办?一键修复丢失amtlib.dll方法

电脑丢失amtlib.dll文件是什么情况&#xff1f;出现amtlib.dll打不开怎么办&#xff1f;这样的情况有什么解决方法呢&#xff1f;今天就和大家聊聊amtlib.dll文件同时教大家一键修复丢失amtlib.dll方法&#xff1f;一起来看看amtlib.dll文件丢失会有哪些方法修复&#xff1f; a…

Docker配置国内镜像源

添加Docker国内镜像源 在/etc/docker/daemon.json文件中添加以下内容&#xff1a; {"registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"] }重启docker s…

【Python】—— lambda表达式

目录 &#xff08;一&#xff09;应用场景 &#xff08;二&#xff09;lambda 语法 &#xff08;三&#xff09;示例分析 &#xff08;四&#xff09;lambda参数形式 4.1 无参数 4.2 一个参数 4.3 默认参数 4.4 可变参数 &#xff1a;*args 4.5 可变参数 &#xff1a;…

第四十一天 | 62.不同路径 63.不同路径|| 343.整数拆分 96.不同的二叉搜索树

题目&#xff1a;62.不同路径 1.二维dp数组dp[i][j]含义&#xff1a;到达&#xff08;i&#xff0c;j&#xff09;位置有dp[i][j]种方法。 2.动态转移方程&#xff1a;dp[i][j] dp[i - 1][j] dp[i][j - 1] 3.初始化&#xff1a;dp[0][j] 1, dp[i][0] 1 &#xff08;第一…

Spring Cloud 之 Gateway

本篇主要介绍有关Gateway网关的相关内容。 目录 一、什么是网关 二、Gateway的使用 Gateway服务的搭建 Route Predicate Factories Gateway Filter Factories Filter GlobalFilter Filter的执行顺序 一、什么是网关 经常面试的人肯定知道&#xff0c;在去公司面试时…

CAN笔记第二篇,车载测试继续学起来!

在CAN协议中&#xff0c;“帧”是一个包含完整信息的独立单元&#xff0c;它具有特定的格式和结构&#xff0c;以确保数据在CAN总线上的可靠传输。这里的“帧”字可以理解为&#xff1a; 完整性&#xff1a;一个帧包含了所有必要的信息&#xff0c;从起始到结束&#xff0c;都遵…

【LeetCode】【1】两数之和(1141字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现哈希表 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给定一个整数数组nums和一个整数目标值target&#xff0c;请在该数组中找出…

视觉检测实战项目——九点标定

本文介绍九点标定方法 已知 9 个点的图像坐标和对应的机械坐标,直接计算转换矩阵,核心原理即最小二乘拟合 {𝑥′=𝑎𝑥+𝑏𝑦+𝑐𝑦′=𝑎′𝑥+𝑏′𝑦+𝑐′ [𝑥1𝑦11𝑥2𝑦21⋮⋮⋮𝑥9𝑦91][𝑎𝑎′𝑏𝑏′𝑐𝑐′]=[𝑥1′𝑦…

AI爆文写作:根据别人的爆款标题,如何通过名词替换改成自己的爆款标题?

在日常刷到爆文的时候&#xff0c;就可以培养自己的网感&#xff0c;为啥这篇文章会爆&#xff1f; 这篇爆文的标题有啥诀窍呢&#xff1f; 比如下面这一篇&#xff1a;《极简生活&#xff1a;变富就是每天循环5个动作》 我们可以发现&#xff0c;每天循环5个动作 这几个词语…

C#基础一

使用Visual Studio 2022&#xff08;VS2022&#xff09;编写C#控制台程序 1. 安装Visual Studio 2022 确保已安装Visual Studio 2022。如果未安装&#xff0c;请从Visual Studio官网下载并安装。 另一篇文章中已经有详细描述&#xff0c;这里就不在细说了。 VisualStudio2022…

【JavaEE 初阶(十)】JVM

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多进阶知识 目录 1.前言2.JVM内存区域划分3.类加载3.1双亲委派模型 4.垃圾回收&#xff08;GC&#xff0…

1098: 堆的判断

解法&#xff1a; 堆是完全二叉树 用数组来存储 然后用定义判定 #include<iostream> #include<vector> using namespace std; int main() {int n;cin >> n;vector<int> vec(n);for (int i 0; i < n; i) cin >> vec[i];for (int i 0; i &…

LabVIEW超高温高压流变仪测试系统

LabVIEW超高温高压流变仪测试系统 超高温高压流变仪广泛应用于石油、天然气、化工等行业&#xff0c;用于测量材料在极端条件下的流变特性。随着计算机技术、测试技术和电子仪器技术的快速发展&#xff0c;传统的流变仪测试方式已无法满足现代工业的需求。因此&#xff0c;开发…

【全开源】沃德商协会管理系统源码(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的商协会系统&#xff0c;新一代数字化商协会运营管理系统&#xff0c;以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点&#xff0c;实施功能全场景覆盖&#xff0c;一站式解决商协会需求壁垒&#xff0c;有效快速建立…

就业班 第三阶段(CICD) 2401--5.15 day2 自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布 **什么叫平滑&#xff1a;**在发布的过程中不影响用户的使用&#xff0c;系统不会因发布而暂停对外服务&#xff0c;不会造成用户短暂性无法访问&#xff1b; **什么叫灰度&#xff1a;**发布后让部分用户使用新版本&#xff0c;其它用户使用旧版本&am…

vector的底层实现与模拟

嗨喽大家好&#xff0c;时隔许久阿鑫又给大家带来了新的博客&#xff0c;关于vector的模拟实现&#xff0c;下面让我们开始今天的学习吧&#xff01; vector的底层实现与模拟 1.关于vector中的插入和删除 2. vector中的拷贝构造和赋值 3.vector的构造函数 4.关于vector中浅…