目录

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相关推荐

  1. 秉火429笔记之十四 USART--串口通信

    目录 1. 串口通讯协议简介 1.1 物理层 1.2 协议层 2  ST USART 2.1 功能引脚 2.2 重要状态 2.3 编程要点 2.4 代码实例 1. 串口通讯协议简介 串口通讯(Seri ...

  2. 秉火429笔记之十八 ETH--以太网

    目录 1. 以太网简介 2.  SMI 接口 (站管理接口) 2.1 SMI帧格式 2.2 SMI 读写操作 3. MII 和 RMII接口 4. MAC 802.3 4.1 MAC 802.3 帧格 ...

  3. 秉火429笔记之十五 DMA--直接存储区访问

    目录 1. 简介 2. 功能 2.1 外设通道 2.2 仲裁器 2.3 FIFO 2.4 存储器端口和外设端口 2.5 编程接口 3. DMA数据配置 1. 简介 直接存储器访问 (DMA) 用于在外 ...

  4. 秉火429笔记之十二 看门狗

    目录 1. 概述 2. 独立看门狗(IWDG) 3. 窗口看门狗(WWDG) 1. 概述 STM32有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬. 一 ...

  5. 秉火429笔记之十 EXTI-外部中断/事件

    目录 1. EXTI 简介 2. EXTI 功能框图 3. 功能点 4. 编码要点 1. EXTI 简介 外部中断/事件控制器(EXTI)管理了控制器的23个中断/事件线.每个中断/事件线都对应有一个 ...

  6. 秉火429笔记之八 RCC时钟

    目录 1. RCC 作用概述 2. RCC框图剖析-时钟树 3. 编程要点 4. 源码实例 1. RCC 作用概述 RCC :reset clock control 复位和时钟控制器. 设置系统时钟S ...

  7. 秉火429笔记之三GPIO框图剖析

    目录 1. GPIO概述 2.保护二极管及上.下拉电阻 3. P-MOS管和N-MOS管 1. GPIO概述 GPIO是通用输入输出端口(General-purpose I/O)的简称.芯片的GPIO ...

  8. 秉火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 ...

  9. 秉火429笔记之九 中断应用概述

    目录 1. 中断类型 2. NVIC 概述 3.  中断优先级 4. 优先级分组 5. 编程要点 1. 中断类型 在此不严格区分中断和异常,即简单的认为中断与异常一个概念. M4 内核搭载了异常响应系 ...

最新文章

  1. C语言运算符优先级-----从没像现在这样深刻体会
  2. 用XFTP向Linux上传文件时出现Permission is not allowed
  3. 听腾讯 TEG 大佬谈腾讯万亿级 Elasticsearch 技术解密
  4. java 随机数种子_Java--随机数和随机数种子(转)
  5. 淮阴工学院计算机答辩,淮阴工学院关于做好2014级研究生学位论文答辩工作的通知...
  6. JAVA知识基础(十一):异常
  7. java连接mysql实现增删改查_JDBC之Java连接mysql实现增删改查
  8. 【软件测试从入门到放弃】入门阶段:迈入软件测试大门
  9. apache环境下web站点禁止用服务器ip访问
  10. 原生js实现吸顶导航和回到顶部特效
  11. 高翔《视觉SLAM十四讲》从理论到实践
  12. 最速下降法(附Python代码)
  13. DVWA安装教程(懂你的不懂·详细)
  14. 计算机网络原理(3)数据编码技术
  15. html自定义弹窗,自定义弹窗为密文密码框(实现重新鉴别密码),一系列踩坑解决
  16. 亚夏汽车首发申请通过 成第2家IPO经销商_135
  17. java tps 优化_高tps下,java性能调优
  18. uniapp小程序更换头像
  19. 文法和语言的基本知识
  20. 如何将多个图片转成文字版的Word

热门文章

  1. Week 5.1 | 左倾红黑树LLRB | Princeton Algorithms
  2. RGB与HSL、ESL转换
  3. 计算机职业资格证书有哪些
  4. java开发用allman风格_缩进风格
  5. java格式化时间字符串 毫秒_SimpleDateFormat是否有格式字符串来获取毫秒日期时间值,而不是人类可读的格式?...
  6. 于晓津外头游荡了半天
  7. python 老师和父亲_强烈推荐给老师和父母的21部电影
  8. 匈牙利命名法(指导)
  9. Dapper,大规模分布式系统的跟踪系统
  10. 1251:丛林中的路