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.rhkb.cn/news/220002.html

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

相关文章

OpenSergo Dubbo 微服务治理最佳实践

*作者&#xff1a;何家欢&#xff0c;阿里云 MSE 研发工程师 Why 微服务治理&#xff1f; 现代的微服务架构里&#xff0c;我们通过将系统分解成一系列的服务并通过远程过程调用联接在一起&#xff0c;在带来一些优势的同时也为我们带来了一些挑战。 如上图所示&#xff0c;可…

<VR串流线方案> PICO 4 Pro VR串流线方案 Oculus Quest2 Link串流线方案

虚拟现实技术(英文名称&#xff1a;Virtual Reality&#xff0c;缩写为VR)&#xff0c;又称虚拟实境或灵境技术&#xff0c;是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术&#xff0c;其基本实现方式是以计算机技术为主&#xff0c;利用并…

xcode 修改 target 中设备朝向崩溃

修改xcode的target中的设备朝向导致崩溃。 从日志上看好像没有什么特别的信息。 之后想了想&#xff0c;感觉这个应该还是跟xcode的配置有关系&#xff0c;不过改动的地方好像也只有plist。 就又翻腾了半天plist中的各种配置项&#xff0c;再把所有的用户权限提示相关的东西之…

工业应用新典范,飞凌嵌入式FET-D9360-C核心板发布!

来源&#xff1a;飞凌嵌入式官网 当前新一轮科技革命和产业变革突飞猛进&#xff0c;工业领域对高性能、高可靠性、高稳定性的计算需求也在日益增长。为了更好地满足这一需求&#xff0c;飞凌嵌入式与芯驰科技&#xff08;SemiDrive&#xff09;强强联合&#xff0c;基于芯驰D9…

CentOS 7 部署frp穿透内网

本文将介绍如何在CentOS 7.9上部署frp&#xff0c;并通过示例展示如何配置和测试内网穿透。 文章目录 &#xff08;1&#xff09;引言&#xff08;2&#xff09;准备工作&#xff08;4&#xff09;frps服务器端配置&#xff08;5&#xff09;frpc客户端配置&#xff08;6&#…

正点原子驱动开发BUG(一)--SPI无法正常通信

目录 一、问题描述二、讲该问题的解决方案三、imx6ull的spi适配器驱动程序控制片选分析3.1 设备icm20608的驱动程序分析3.2 imx的spi适配器的驱动程序分析 四、BUG修复测试五、其他问题 一、问题描述 使用正点的im6ull开发板进行spi通信驱动开发实验的时候&#xff0c;主机无法…

Hadoop和Spark的区别

Hadoop 表达能力有限。磁盘IO开销大&#xff0c;延迟度高。任务和任务之间的衔接涉及IO开销。前一个任务完成之前其他任务无法完成&#xff0c;难以胜任复杂、多阶段的计算任务。 Spark Spark模型是对Mapreduce模型的改进&#xff0c;可以说没有HDFS、Mapreduce就没有Spark。…

Windows使用VNC Viewer远程桌面Ubuntu【内网穿透】

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

Unity中URP下的半透明效果实现

文章目录 前言一、实现半透明的步骤1、修改Blend模式&#xff0c;使之透明2、打开深度写入&#xff0c;防止透明对象穿模3、在Tags中&#xff0c;修改渲染类型和渲染队列为半透明 Transparent 二、对透明效果实现从下到上的透明渐变1、 我们在 Varying 中&#xff0c;定义一个v…

LeedCode刷题---二分查找类问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、二分查找 题目链接&#xff1a;二分查找 题目描述 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一…

垃圾回收 (GC) 在 .NET Core 中是如何工作的?

提起GC大家肯定不陌生&#xff0c;但是让大家是说一下GC是怎么运行的&#xff0c;可能大多数人都不太清楚&#xff0c;这也很正常&#xff0c;因为GC这东西在.NET基本不用开发者关注&#xff0c;它是依靠程序自动判断来释放托管堆的&#xff0c;我们基本不需要主动调用Collect(…

安装finallshell并连接linux

下载 官网地址&#xff1a;finallshell下载地址 安装 一直下一步即可安装成功&#xff0c;然后进入软件&#xff0c;如下就是第一次进入的界面了 然后我们想要链接linux需要知道linux的ip地址&#xff0c;我们去linux下查看ip地址 ifconfig #查看ip命令运行命令之后&#xf…

【sqli靶场】第六关和第七关通关思路

目录 前言 一、sqli靶场第六关 1.1 判断注入类型 1.2 观察报错 1.3 使用extractvalue函数报错 1.4 爆出数据库中的表名 二、sqli靶场第七关 1.1 判断注入类型 1.2 判断数据表中的字段数 1.3 提示 1.4 构造poc爆库名 1.5 构造poc爆表名 1.6 构造poc爆字段名 1.7 构造poc获取账…

Note3---初阶二叉树~~

目录​​​​​​​ 前言&#x1f344; 1.树概念及结构☎️ 1.1 树的概念&#x1f384; 1.2 树的相关概念&#x1f99c; 1.2.1 部分概念的加深理解&#x1f43e; 1.2.2 树与非树&#x1fab4; 1.3 树的表示&#x1f38b; 1.4 树在实际中的运用&#xff08;表示文件系统…

slurm 23.11.0集群 debian 11.5 安装

slurm 23.11.0集群 debian 11.5 安装 用途 Slurm(Simple Linux Utility for Resource Management&#xff0c; http://slurm.schedmd.com/ )是开源的、具有容错性和高度可扩展的Linux集群超级计算系统资源管理和作业调度系统。超级计算系统可利用Slurm对资源和作业进行管理&a…

linux(centos7)离线安装mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar

1. 卸载mariadb相关rpm # 查找 rpm -qa|grep mariadb rpm -qa|grep mysql# 卸载 rpm -e --nodeps mariadb... rpm -e --nodeps mysql...2. 删除mysql相关文件 # 查找 find / -name mysql# 删除 rm -rf /var/lib/mysql...3. 查看是否有相关依赖&#xff0c;没有需安装 rpm -q…

59. 螺旋矩阵 II(java实现,史上最详细教程,想学会的进!!!)

今天来分享一下螺旋矩阵的解题思路及代码的实现。 题目描述如下&#xff1a; 首先拿到这道题&#xff0c;首先不要慌张&#xff0c;我们来仔细分析一下会发现并没有那么难。 首先看下边界的元素是1、2、3递增的&#xff0c;那么我们也许可以根据这一点先把边界的元素一个一个给…

Leetcode刷题笔记题解(C++):224. 基本计算器

思路&#xff1a; step 1&#xff1a;使用栈辅助处理优先级&#xff0c;默认符号为加号。 step 2&#xff1a;遍历字符串&#xff0c;遇到数字&#xff0c;则将连续的数字字符部分转化为int型数字。 step 3&#xff1a;遇到左括号&#xff0c;则将括号后的部分送入递归&#x…

WPF 显示PDF、PDF转成图片

1.NuGet 安装 O2S.Components.PDFView4NET.WPF 2.添加组件 工具箱中&#xff0c;空白处 右键&#xff0c;选择项 WPF组件 界面&#xff0c;选择NuGet安装库对面路径下的 O2S.Components.PDFView4NET.WPF.dll 3.引入组件命名空间&#xff0c;并使用 <Windowxmlns"htt…

【Hadoop】

Hadoop是一个开源的分布式离线数据处理框架&#xff0c;底层是用Java语言编写的&#xff0c;包含了HDFS、MapReduce、Yarn三大部分。 组件配置文件启动进程备注Hadoop HDFS需修改需启动 NameNode(NN)作为主节点 DataNode(DN)作为从节点 SecondaryNameNode(SNN)主节点辅助分…