STM32 寄存器配置笔记——I2C 读写AT24C02 EEPROM

一、简介

        本文主要介绍STM32F10xx系列如何使用软件模拟I2C总线读写AT24C02的EEPROM数据。

二、概述

        I2C协议是一种用于同步、半双工、串行总线(由单片机时钟线、单数据交换器数据线组成)上的协议。规定了总线空闲状态、起始条件、停止条件、数据有效性、字节格式、响应确认信号、从设备地址选择、数据方向。有主从机之分,主机主控就是掌控单片机时钟信号的一方,并且起始信号和停止信号也由主机发送。现在很多的硬件、传感器等都是用到i2c协议与MCU(stm32)进行通信的。因此i2c还是必不可少的一个重要知识点。

三、I2C协议

        I2C基本读写过程如下:

        

包括:起始信号、停止信号、应答、发送数据等。

        1)起始信号

        在SCL为高定平的基础上,SDA由高电平跳变为低电平为起始信号。为一次传输的开始。

      2)停止信号

      在SCL为高定平的基础上,SDA由低电平跳变为高电平为停止信号。为一次传输的结束。

        3)数据有效性

       在起始信号接收到之后,需将SCL信号拉低准备数据传输。SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL 为低电平时,SDA的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。注意每次数据传输都以字节为单位。

        4)应答

       I2C 的数据和地址传输都带响应。响应包括“应答 (ACK)”和“非应答 (NACK)”两种信号。作为数据接收端时,当设备 (无论主从机) 接收到 I2C 传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答 (ACK)”信号,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答 (NACK)”信号,发送方接收到该信号后会产生一个
停止信号,结束信号传输。传输时主机产生时钟,在第9个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制SDA,若 SDA 为高电平,表示非应答信号 (NACK),低电平表示应答信号 (ACK)。
 

四、驱动代码

        1)IIC驱动

#include "iic_drv.h"
#include "delay.h"#define IIC_SCL  PCout(12)
#define IIC_SDA  PCout(11)#define SDA_OUT() {GPIOC->CRH &= 0xFFFF0FFF;\GPIOC->CRH |= 0x00003000;\};#define SDA_IN() {GPIOC->CRH &= 0xFFFF0FFF;\GPIOC->CRH |= 0x00008000;\};void IIC_Init(void)
{RCC->APB2ENR |= 1 << 4;           //enable I/O port C clockGPIOC->CRH &= 0xFFF00FFF;          //cfg sda scl as output PP speed 50MHZGPIOC->CRH |= 0x00033000;GPIOC->ODR |= 0x3 << 11;           //cfg sda scl output '1'
}//start signal SCL=1 SDA change from high to low
void IIC_Start(void)
{SDA_OUT();IIC_SDA = 1;IIC_SCL = 1;delay_us(4);IIC_SDA = 0;delay_us(4);//IIC_SCL = 0;     //SCL change to low for ready to send data after start signal(SCL = 1,data line stable,data valid)
}//stop signal SCL=1 SDA change from low to high
void IIC_Stop(void)
{SDA_OUT();IIC_SDA = 0;IIC_SCL = 1;delay_us(4);IIC_SDA = 1;delay_us(4);
}//wait ack
//return       0:ACK
//             1:NACK
void IIC_WaitAck(void)
{u8 ack = 0;u16 timeout = 0;SDA_IN();IIC_SCL = 1;delay_us(4);do{ack = IIC_SDA;timeout++;if (timeout > 250){IIC_Stop();return;}} while (ack);
}//send Ack
void IIC_Ack(void)
{SDA_OUT();IIC_SDA = 0;IIC_SCL = 1;delay_us(4);IIC_SCL = 0;    //release scldelay_us(4);
}//send NAck
void IIC_NAck(void)
{SDA_OUT();IIC_SDA = 1;IIC_SCL = 1;delay_us(4);IIC_SCL = 0;    //release scldelay_us(4);
}void IIC_Send_Byte(u8 dat)
{u8 i;SDA_OUT();for (i = 0; i < 8; i++){IIC_SCL = 1;IIC_SDA = (dat >> 7) & 0x01;delay_us(2);IIC_SCL = 0;delay_us(2);}
}u8 IIC_Read_Byte(u8 ack)
{u8 i, receive = 0;SDA_IN();for (i = 0; i < 8; i++){IIC_SCL = 1;receive |= IIC_SDA << (7 - i);delay_us(4);IIC_SCL = 0;delay_us(4);}(ack == 0) ? IIC_Ack() : IIC_NAck();return receive;
}

        2)AT24C02驱动

#include "AT24C02.h"
#include "iic_drv.h"
#include "delay.h"void AT24C02_Init(void)
{IIC_Init();
}u8 AT24C02_ReadOneByte(u16 ReadAddr)
{u8 temp = 0;IIC_Start();IIC_Send_Byte(0xA0);IIC_WaitAck();IIC_Send_Byte(ReadAddr%256);IIC_WaitAck();IIC_Start();IIC_Send_Byte(0xA1);IIC_WaitAck();temp = IIC_Read_Byte(1);IIC_Stop();
}void AT24C02_WriteOneByte(u16 WriteAddr, u8 dat)
{IIC_Start();IIC_Send_Byte(0xA0);IIC_WaitAck();IIC_Send_Byte(WriteAddr%256);IIC_WaitAck();IIC_Send_Byte(dat);IIC_WaitAck();IIC_Stop();delay_ms(10);
}u8 AT24C02_Check(void)
{u8 temp;temp = AT24C02_ReadOneByte(0xFF);if (temp == 0x55)return 0;AT24C02_WriteOneByte(0xFF, 0x55);temp = AT24C02_ReadOneByte(0xFF);if (temp == 0x55)return 0;return 1;
}void AT24C02_Read(u16 ReadAddr, u8 *pBuf, u16 NumToRead)
{while (NumToRead--){*pBuf++ = AT24C02_ReadOneByte(ReadAddr);ReadAddr++;}
}void AT24C02_Write(u16 WriteAddr, u8 *pBuf, u16 NumToWrite)
{while (NumToWrite--){AT24C02_WriteOneByte(WriteAddr, *pBuf);WriteAddr++;pBuf++;}
}

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

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

相关文章

MES系统物料计划协同:全面解析与应用

一、MES系统物料计划协同概述 MES系统物料计划协同是指通过MES系统对物料计划进行统一管理和协调&#xff0c;确保生产计划的顺利进行。通过将物料需求、采购、库存、生产和配送等环节进行有效集成&#xff0c;实现供应链的优化。这种协同方式有助于提高供应链的透明度和协同性…

焊盘:十字连接VS全覆盖 铺铜

在铺铜规则中&#xff0c;焊盘连接方式有两种&#xff1a; 十字连接 优点&#xff1a;较好焊接&#xff1a;因铺铜面积减少&#xff0c;温度下降速度降低&#xff0c;较好焊接&#xff0c;不易虚焊。 缺点&#xff1a;载流能力较弱&#xff1a;铺铜面积↓ → 载流能力↓全连接…

Leetcode—118.杨辉三角【简单】

2023每日刷题&#xff08;六十&#xff09; Leetcode—118.杨辉三角 实现代码 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> ans(numRows);for(int i 0; i < numRows; i) {ans[i].resize(i 1);ans…

算法训练营Day14

#Java #二叉树层次遍历 #反转二叉树 开源学习资料 二叉树的层次遍历&#xff1a;力扣题目链接 二叉树的层次遍历很好理解&#xff1a; 就是从根结点一层一层地往下遍历&#xff08;同一层&#xff0c;从左到右&#xff09;&#xff1a; 迭代的方式很好理解&#xff1a;就是…

用实例域代替序数

在Java中&#xff0c;枚举类型的ordinal()方法返回枚举常量的序数&#xff08;即其在枚举声明中的位置&#xff09;。在某些情况下&#xff0c;使用实例域&#xff08;instance field&#xff09;代替序数可能更加安全和易读。以下是一个示例&#xff0c;演示如何使用实例域代替…

mysql CREATE DATABASE

DROP DATABASE IF EXISTS zengwenfeng;CREATE DATABASE zengwenfeng DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;USE zengwenfeng; 脚本天天少这些&#xff0c;天天找这段&#xff01;

computed 和 watch 的奇妙世界:让数据驱动你的 Vue 应用(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

TestSSLServer4.exe工具使用方法简单介绍(查SSL的加密版本SSL3或是TLS1.2)

一、工具使用方法介绍 工具使用方法参照&#xff1a;http://www.bolet.org/TestSSLServer/ 全篇英文看不懂&#xff0c;翻译了下&#xff0c;能用到的简单介绍如下&#xff1a; 将下载的TestSSLServer4.exe工具放到桌面上&#xff0c;CMD命令行进入到桌面目录&#xff0c;执…

从 0 开始创建 SpringBoot 项目

从 0 开始创建 SpringBoot 项目 从 0 开始创建 SpringBoot 项目环境准备创建项目项目目录结构及说明编写代码参考 从 0 开始创建 SpringBoot 项目 环境准备 操作系统&#xff1a;Windows 10IDE&#xff1a;IntelliJ IDEA 2023.3.1Java 版本&#xff1a;jdk1.8 工具网盘链接&…

俄罗斯军方计划用 Astra Linux 取代 Windows!

网络安全正在改变全球化的面貌&#xff0c;各国政府为了防范外国的间谍和破坏活动&#xff0c;正积极发展自己的技术。在这一趋势下&#xff0c;俄罗斯军方已经开始用 Linux 发行版 Astra Linux 替换 Windows 系统。 如何提高Linux系统安全性&#xff1f;提升Linux安全的关键策…

垃圾收集器及内存分配

目录 垃圾收集器种类 HotSpot虚拟机所包含的收集器 垃圾收集器部分源码 垃圾收集器后台日志参数说明与配对关系 1、串行垃圾收集器 串行垃圾收集器运行示意图 1&#xff09;、编写测试代码 2&#xff09;、设置垃圾回收为串行收集器 3&#xff09;、启动程序&#xff…

Flink 数据集类型

现实世界中&#xff0c;所有的数据都是以流式的形态产生的&#xff0c;不管是哪里产生的数据&#xff0c;在产生的过程中都是一条条地生成&#xff0c;最后经过了存储和转换处理&#xff0c;形成了各种类型的数据集。如下图所示&#xff0c;根据现实的数据产生方式和数据产生是…

基于JavaWeb+SSM+Vue微信小程序的移动学习平台系统的设计和实现

基于JavaWebSSMVue微信小程序的移动学习平台系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 2 第2章 开发环…

【基础篇】1.1 认识STM32(二)

3.3 VREF/VREF-引脚 VREF和VREF-是STM32中用于提供参考电压的引脚。如下图&#xff1a; VREF引脚可以连接一个单独的外部参考电压&#xff0c;范围在2.0V&#xff5e;VDDA&#xff0c;但不能超过VDDA&#xff0c;否则就超过了模拟器件的最大供电电压。在100引脚的封装中&#…

文件上传自动化测试方案(超详细)

一、概述 【测试地址】&#xff1a;https://pan.baidu.com 【测试工具】&#xff1a;selenium、requests 【脚本语言】&#xff1a;Python 【运行环境】&#xff1a;Windows 百度网盘作为文件存储及分享的平台&#xff0c;核心功能大部分是对文件的操作&#xff0c;如果要…

如何一键打开系统属性,编辑环境变量

常规方法&#xff1a; ①右键此电脑→打开属性 ②在控制面版中→系统与安全→系统 对于以上方法&#xff0c;我的电脑都不行&#xff0c;右键属性没反应&#xff1b;点击系统也没反应&#xff0c;这时打开运行窗口&#xff08;winR&#xff09;→输入sysdm.cpl →就可以直接到…

Linux--Docker容器(最新)

这里写目录标题 安装Docker安装指令配置加速器 Docker简介名词解释作用run命令解读 操作常见命令命令的别名 数据卷简介数据卷命令使用 本地目录挂载问题发现问题解决二级目录二级目录 安装Docker 安装指令 如下文档 https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcu…

【教3妹学编程-算法题】反转二叉树的奇数层

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;“你不是真正的快乐&#xff0c; 你的…

开具实习证明:在线实习项目介绍

大数据在线实习项目&#xff0c;是在线上为学生提供实习经验的项目。我们希望能够帮助想要在毕业后从事数据科学类工作的学生更加顺利地适应从教室到职场的转换&#xff1b;也帮助那些在工作中需要处理数据、实现数据价值的其他职能的从业者高效快速地掌握每天都能用起来的数据…

SuperMap iClient3D for Cesium 实现鼠标移动选中模型并显示模型对应字段

SuperMap iClient3D for cesium 实现鼠标移动选中模型并显示模型对应字段 一、实现思路二、数据制作1. 计算出模型中心点并保存到属性表中2. 计算出模型顶部高程3. 模型数据切缓存4. 发布三维服务. 三、代码编写 作者&#xff1a;xkf 一、实现思路 将模型属性数据存储到前端&a…