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

news2024/12/22 16:26:00

一、简介

        本文主要介绍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 clock
    GPIOC->CRH &= 0xFFF00FFF;          //cfg sda scl as output PP speed 50MHZ
	  GPIOC->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 scl
	  delay_us(4);
}

//send NAck
void IIC_NAck(void)
{
    SDA_OUT();
	  IIC_SDA = 1;
    IIC_SCL = 1;
	  delay_us(4);
	  IIC_SCL = 0;    //release scl
	  delay_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.coloradmin.cn/o/1313713.html

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

相关文章

设计模式之建造者模式(二)

目录 概述概念角色类图适用场景 详述画小人业务类的介绍代码解析 建造者基本代码类介绍代码解析 总结设计原则其他 概述 概念 建造者模式是一种创建型设计模式&#xff0c;它可以将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 角色 …

Win11 TensorRT环境部署

一、CUDA和CUDNN安装 cuda和cudnn网上有很多安装教程&#xff0c;这里列举了一些&#xff0c;就不详细说了&#xff0c;具体链接如下&#xff1a; csdn.net - CUDA安装教程&#xff08;超详细&#xff09; 原创 zhihu.com - 深度学习之CUDACUDNN详细安装教程 tencent.com - C…

《地理信息系统原理》笔记/期末复习资料(13. 地理信息系统的发展趋势)

目录 13. 地理信息系统的发展趋势 13.1. 互操作GIS 13.1.1. 传统GIS在数据标准化上的缺陷和面临的新课题 13.1.2. GIS互操作的概念 13.1.3. 开放式地理信息系统&#xff08;OGIS&#xff09;及其特点 13.1.4. OGIS的组成部分 13.1.5. OGIS的实现技术 13.2. GIS的集成化…

【C语言】C的面向对象

一、BREW接口实现 高通的BREW&#xff08;Binary Runtime Environment for Wireless&#xff09;是一个早期为手机设备开发的应用程序平台&#xff0c;用于开发在CDMA手机上运行的软件。尽管这个平台目前已经不太流行&#xff0c;但是在其使用高峰时期&#xff0c;开发者需要使…

2024年甘肃省职业院校技能大赛信息安全管理与评估赛项二三阶段样题一

2024年甘肃省职业院校技能大赛高职学生组电子与信息大类信息安全管理与评估赛项样题一 第二阶段 任务书 任务描述 随着网络和信息化水平的不断发展&#xff0c;网络安全事件也层出不穷&#xff0c;网络恶意代码传播、信息窃取、信息篡改、远程控制等各种网络攻击 行为已严重…

LVS负载均衡器(nat模式)+nginx(七层反向代理)+tomcat(多实例),实现负载均衡和动静分离

目录 前言 一、配置nfs共享存储 二、配置2个nginx节点服务的网页页面 节点1:192.168.20.10 步骤一&#xff1a;修改网关指向调度器的内网ip地址 步骤二&#xff1a;将nfs共享的目录进行挂载&#xff0c;并修改nginx的配置文件中location的root指向挂载点 步骤三&#xff…

GPT 魔力涌现

GPT 二、Prompt 的典型构成 角色&#xff1a;给 AI 定义一个最匹配任务的角色&#xff0c;比如&#xff1a;「你是一位软件工程师」「你是一位小学老师」指示&#xff1a;对任务进行描述上下文&#xff1a;给出与任务相关的其它背景信息&#xff08;尤其在多轮交互中&#xff…

“一键调整尺寸,轻松完成视频批量剪辑:批量放大视频尺寸“

你是否曾经遇到过需要批量调整视频尺寸的情况&#xff1f;无论是为了适应不同的播放平台&#xff0c;还是为了满足客户的特定需求&#xff0c;批量调整视频尺寸都是一项繁琐而耗时的工作。但是&#xff0c;现在有一种方法可以让你轻松完成这项任务&#xff0c;那就是使用我们的…

豪腾四海×实在RPA丨最懂财务的数字员工,为企业节省人天2000+

企业数字化转型&#xff0c;财务是一个重要的切入点。随着豪腾四海数字化业务不断展开&#xff0c;新的系统、流程和数据源被不断引入&#xff0c;财务部门面临的是不断暴增的对账、数电票处理、审计等日常工作。 “如此大的工作量&#xff0c;即使是经验丰富的资深财务&#…

设计模式——桥接模式(结构型)

引言 桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用。 问题 抽象&#xff1f; 实现&#xff1f; 听上去挺吓人&#xff1f; 让我们慢慢来&#xff0c; 先考虑一个简单的…

【Oracle】创建表

目录 方法一&#xff1a;CREATE TABLE 语法 创建表示例1&#xff1a;创建stuinfo(学生信息表) 创建表示例2&#xff1a;添加stuinfo(学生信息表)约束 方法二&#xff1a;CREATE TABLE AS 语法 创建表示例3&#xff1a; 创建表示例4&#xff1a;实现对select查询的结果进行…

利用有限制通配符来提升API的灵活性

在Java中&#xff0c;有限制通配符&#xff08;bounded wildcard&#xff09;允许你在泛型中指定一个范围&#xff0c;从而提升API的灵活性。通配符使得你能够编写更通用、适用于多种类型的代码。以下是一个利用有限制通配符提升API灵活性的例子&#xff1a; 假设有一个简单的…

PR模板,复古怀旧电影效果视频制作PR项目工程文件

Premiere复古怀旧电影效果视频制作pr模板项目工程文件下载 这个PR模板以复古城市印象电影质感为特色&#xff0c;结合了电影和数字故障效果。包含6个场景。可以编辑文本、添加媒体和自定义颜色。包含视频教程。4K版本。不需要任何插件。 软件支持&#xff1a;PR2022 | 分辨率&a…

大数据Doris(三十六):Duplicate 模型(冗余模型)介绍

文章目录 Duplicate 模型(冗余模型)介绍 一、创建doris表 二、插入数据

RocketMQ Streams详解

一、RocketMQ Streams 概览 RocketMQ Streams是基于RocketMQ的轻量级流计算引擎。能以SDK方式被应用依赖&#xff0c;无须部署复杂的流计算服务端即可获得流计算能力。 因此具有资源消耗少、扩展性好、支持流计算算子丰富的特点。 1、整体架构​ 数据从RocketMQ中被RocketMQ-…

「X」Embedding in NLP|神经网络和语言模型 Embedding 向量入门

在「X」Embedding in NLP 进阶系列中&#xff0c;我们介绍了自然语言处理的基础知识——自然语言中的 Token、N-gram 和词袋语言模型。今天&#xff0c;我们将继续和大家一起“修炼”&#xff0c;深入探讨神经网络语言模型&#xff0c;特别是循环神经网络&#xff0c;并简要了解…

【postgresql】ERROR: INSERT has more expressions than target columns

执行下面sql insert into apply_account_cancellation3 select * from pply_account_cancellation; 返回下面错误信息 insert into apply_account_cancellation3 select * from apply_account_cancellation > ERROR: INSERT has more expressions than target colu…

ShardingSphereJDBC简单入门

ShardingSphere 介绍ShardingSphere-JDBCSharding-Sphere-ProxyShardingSphere-Sidecar混合架构运行模式DistSQL可拔插架构ShardingSphere的发展路线 主从复制ShardingSphere-JDBC功能SQL解析SQL支持程度SQL稳定支持SQL实验性支持 MySQL不支持SQL清单分页 数据分片垂直分片水平…

世界5G大会

会议名称:世界 5G 大会 时间:2023 年 12 月 5 日-12 月 8 日 地点:河南郑州 一、会议简介 世界 5G 大会,是由国务院批准,国家发展改革委、科技部、工 信部与地方政府共同主办,未来移动通信论坛联合属地主管厅局联合 承办,邀请全球友好伙伴共同打造的全球首个 5G 领域…

KITTI数据集处理为COCO数据集格式

KITTI作为自动驾驶常用数据集&#xff0c;被广泛的应用于自动驾驶目标检测等过程中。 首先是数据集类别合并&#xff0c;原始的KITTI数据集有九个类别&#xff0c;分别是&#xff1a; Car Van Truck Pedestrian Person_sitting Cyclist Tram Misc而我们在使用过程中&#xff0…