秉火429笔记之十六 I2C--操作EEPROM
目录
1. I2C 概述
2. 硬件设计
3. 代码实现
1. I2C 概述
参考该链接,不在赘述:https://blog.csdn.net/XieWinter/article/details/91903678
介于ST I2C接口相对不好用,在此直接采用模拟I2C方式操作设备
2. 硬件设计
特征:兼容400KHZ,百万次写入,详见数据手册
EEPROM的7位设备地址是:,A0/A1/A2均为0, 0x50
EEPROM芯片中还有一个WP引脚,具有写保护功能,当该引脚电平为高时,禁止写入数据,当引脚为低电平时,可写入数据,直接接地,则禁用写保护功能。
EEPROM操作图
- 字节写
- 页写
- 当前地址读
- 随机读
- 顺序读
3. 代码实现
模拟I2C源码链接:https://download.csdn.net/download/xiewinter/11258552
/******************************************************************************Copyright(c) 2018-2020 Xanthium All rights reserved.******************************************************************************文 件 名 : bsp_i2c_gpio.h版 本 号 : 初稿作 者 : Xanthium生成日期 : 2019年6月25日最近修改 :功能描述 : I2C模拟总线驱动模块H文件函数列表 :修改历史 :1.日 期 : 2019年6月25日作 者 : Xanthium修改内容 : 创建文件******************************************************************************/#ifndef __BSP_I2C_GPIO_H__
#define __BSP_I2C_GPIO_H__#ifdef __cplusplusextern "C" {
#endif#include "stm32f4xx.h"#define I2C_WR 0 /* 写控制bit */
#define I2C_RD 1 /* 读控制bit */void bsp_InitI2C(void);
void i2c_Start(void);
void i2c_Stop(void);
void i2c_SendByte(uint8_t _ucByte);
uint8_t i2c_ReadByte(void);
uint8_t i2c_WaitAck(void);
void i2c_Ack(void);
void i2c_NAck(void);
uint8_t i2c_CheckDevice(uint8_t _Address);#ifdef __cplusplus
}
#endif#endif // end of __BSP_I2C_GPIO_H__
/* -------------- 部分代码---------完整代码见个人资源库*/
/*i2c总线GPIO:PB6/I2C1_SCLPB7/I2C1_SDA
*//* 定义I2C总线连接的GPIO端口, 用户只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */#define RCC_I2C_PORT RCC_AHB1Periph_GPIOB /* GPIO端口时钟 */#define PORT_I2C_SCL GPIOB /* GPIO端口 */
#define PIN_I2C_SCL GPIO_Pin_6 /* GPIO引脚 */#define PORT_I2C_SDA GPIOB /* GPIO端口 */
#define PIN_I2C_SDA GPIO_Pin_7 /* GPIO引脚 */#define I2C_SCL_PIN GPIO_Pin_6 /* 连接到SCL时钟线的GPIO */
#define I2C_SDA_PIN GPIO_Pin_7 /* 连接到SDA数据线的GPIO *//* 定义读写SCL和SDA的宏 */
#define I2C_SCL_1() GPIO_SetBits(PORT_I2C_SCL,I2C_SCL_PIN) /* SCL = 1 */
#define I2C_SCL_0() GPIO_ResetBits(PORT_I2C_SCL,I2C_SCL_PIN) /* SCL = 0 */#define I2C_SDA_1() GPIO_SetBits(PORT_I2C_SDA,I2C_SDA_PIN) /* SDA = 1 */
#define I2C_SDA_0() GPIO_ResetBits(PORT_I2C_SDA,I2C_SDA_PIN) /* SDA = 0 */#define I2C_SDA_READ() (GPIO_ReadInputDataBit(PORT_I2C_SDA,I2C_SDA_PIN)) /* 读SDA口线状态 */
#define I2C_SCL_READ() (GPIO_ReadInputDataBit(PORT_I2C_SCL,I2C_SCL_PIN)) /* 读SCL口线状态 *//*
*********************************************************************************************************
* 函 数 名: bsp_InitI2C
* 功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitI2C(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /* 开漏输出模式 */GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = PIN_I2C_SCL;GPIO_Init(PORT_I2C_SCL, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = PIN_I2C_SDA;GPIO_Init(PORT_I2C_SDA, &GPIO_InitStructure);/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */i2c_Stop();
}/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线启动信号
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */I2C_SDA_1();I2C_SCL_1();i2c_Delay();I2C_SDA_0();i2c_Delay();I2C_SCL_0();i2c_Delay();
}/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线停止信号
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */I2C_SDA_0();I2C_SCL_1();i2c_Delay();I2C_SDA_1();i2c_Delay();
}// ....
/******************************************************************************Copyright(c) 2018-2020 Xanthium All rights reserved.******************************************************************************文 件 名 : bsp_eeprom_24xx.h版 本 号 : 初稿作 者 : Xanthium生成日期 : 2019年6月25日最近修改 :功能描述 : 串行EEPROM 24xx02驱动模块H文件函数列表 :修改历史 :1.日 期 : 2019年6月25日作 者 : Xanthium修改内容 : 创建文件******************************************************************************/#ifndef __BSP_EEPROM_24XX_H__
#define __BSP_EEPROM_24XX_H__#ifdef __cplusplusextern "C" {
#endif#include <stdint.h>#define AT24C02
//#define AT24C128#ifdef AT24C02#define EE_MODEL_NAME "AT24C02"#define EE_DEV_ADDR 0xA0 /* 设备地址 */#define EE_PAGE_SIZE 8 /* 页面大小(字节) */#define EE_SIZE 256 /* 总容量(字节) */#define EE_ADDR_BYTES 1 /* 地址字节个数 */
#endif#ifdef AT24C128#define EE_MODEL_NAME "AT24C128"#define EE_DEV_ADDR 0xA0 /* 设备地址 */#define EE_PAGE_SIZE 64 /* 页面大小(字节) */#define EE_SIZE (16*1024) /* 总容量(字节) */#define EE_ADDR_BYTES 2 /* 地址字节个数 */
#endifuint8_t bsp_ee_CheckOk(void);
uint8_t bsp_ee_ReadBytes(uint8_t *_pReadBuf, uint16_t _usAddress, uint16_t _usSize);
uint8_t bsp_ee_WriteBytes(uint8_t *_pWriteBuf, uint16_t _usAddress, uint16_t _usSize);#ifdef __cplusplus
}
#endif#endif // end of __BSP_EEPROM_24XX_H__
秉火429笔记之十六 I2C--操作EEPROM相关推荐
- 秉火429笔记之十四 USART--串口通信
目录 1. 串口通讯协议简介 1.1 物理层 1.2 协议层 2 ST USART 2.1 功能引脚 2.2 重要状态 2.3 编程要点 2.4 代码实例 1. 串口通讯协议简介 串口通讯(Seri ...
- 秉火429笔记之十八 ETH--以太网
目录 1. 以太网简介 2. SMI 接口 (站管理接口) 2.1 SMI帧格式 2.2 SMI 读写操作 3. MII 和 RMII接口 4. MAC 802.3 4.1 MAC 802.3 帧格 ...
- 秉火429笔记之十五 DMA--直接存储区访问
目录 1. 简介 2. 功能 2.1 外设通道 2.2 仲裁器 2.3 FIFO 2.4 存储器端口和外设端口 2.5 编程接口 3. DMA数据配置 1. 简介 直接存储器访问 (DMA) 用于在外 ...
- 秉火429笔记之十二 看门狗
目录 1. 概述 2. 独立看门狗(IWDG) 3. 窗口看门狗(WWDG) 1. 概述 STM32有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬. 一 ...
- 秉火429笔记之十 EXTI-外部中断/事件
目录 1. EXTI 简介 2. EXTI 功能框图 3. 功能点 4. 编码要点 1. EXTI 简介 外部中断/事件控制器(EXTI)管理了控制器的23个中断/事件线.每个中断/事件线都对应有一个 ...
- 秉火429笔记之八 RCC时钟
目录 1. RCC 作用概述 2. RCC框图剖析-时钟树 3. 编程要点 4. 源码实例 1. RCC 作用概述 RCC :reset clock control 复位和时钟控制器. 设置系统时钟S ...
- 秉火429笔记之三GPIO框图剖析
目录 1. GPIO概述 2.保护二极管及上.下拉电阻 3. P-MOS管和N-MOS管 1. GPIO概述 GPIO是通用输入输出端口(General-purpose I/O)的简称.芯片的GPIO ...
- 秉火429笔记之十七 SPI--操作FLASH
目录 1. SPI协议概述 2. STM32 SPI特性及架构 2.1 SPI外设简介 2.2 STM32的SPI架构剖析 2.2.1 通讯引脚 2.2.2 时钟控制逻辑 2.2.3 数据控制逻辑 3 ...
- 秉火429笔记之九 中断应用概述
目录 1. 中断类型 2. NVIC 概述 3. 中断优先级 4. 优先级分组 5. 编程要点 1. 中断类型 在此不严格区分中断和异常,即简单的认为中断与异常一个概念. M4 内核搭载了异常响应系 ...
最新文章
- C语言运算符优先级-----从没像现在这样深刻体会
- 用XFTP向Linux上传文件时出现Permission is not allowed
- 听腾讯 TEG 大佬谈腾讯万亿级 Elasticsearch 技术解密
- java 随机数种子_Java--随机数和随机数种子(转)
- 淮阴工学院计算机答辩,淮阴工学院关于做好2014级研究生学位论文答辩工作的通知...
- JAVA知识基础(十一):异常
- java连接mysql实现增删改查_JDBC之Java连接mysql实现增删改查
- 【软件测试从入门到放弃】入门阶段:迈入软件测试大门
- apache环境下web站点禁止用服务器ip访问
- 原生js实现吸顶导航和回到顶部特效
- 高翔《视觉SLAM十四讲》从理论到实践
- 最速下降法(附Python代码)
- DVWA安装教程(懂你的不懂·详细)
- 计算机网络原理(3)数据编码技术
- html自定义弹窗,自定义弹窗为密文密码框(实现重新鉴别密码),一系列踩坑解决
- 亚夏汽车首发申请通过 成第2家IPO经销商_135
- java tps 优化_高tps下,java性能调优
- uniapp小程序更换头像
- 文法和语言的基本知识
- 如何将多个图片转成文字版的Word
热门文章
- Week 5.1 | 左倾红黑树LLRB | Princeton Algorithms
- RGB与HSL、ESL转换
- 计算机职业资格证书有哪些
- java开发用allman风格_缩进风格
- java格式化时间字符串 毫秒_SimpleDateFormat是否有格式字符串来获取毫秒日期时间值,而不是人类可读的格式?...
- 于晓津外头游荡了半天
- python 老师和父亲_强烈推荐给老师和父母的21部电影
- 匈牙利命名法(指导)
- Dapper,大规模分布式系统的跟踪系统
- 1251:丛林中的路