历史上的今天

今天是:2024年09月12日(星期四)

正在发生

2019年09月12日 | 秉火429笔记之十六 I2C--操作EEPROM

发布者:xinyi9008 来源: eefocus关键字:秉火  I2C  操作EEPROM 手机看文章 扫描二维码
随时随地手机看文章

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 __cplusplus

extern "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_SCL

  PB7/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 __cplusplus

extern "C" {

#endif

 

#include

 

 

#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 /* 地址字节个数 */

#endif

 

uint8_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_

关键字:秉火  I2C  操作EEPROM 引用地址:秉火429笔记之十六 I2C--操作EEPROM

上一篇:秉火429笔记之十八 ETH--以太网
下一篇:秉火429笔记之五控制RGB彩灯

推荐阅读

最近英特尔处理器不论散片还是盒装都在涨价,之前分析的汇率、渠道调整等缘由也不攻自破,核心问题还是英特尔的14nm产能不足,导致供应紧缺,缺货导致了CPU涨价。在这方面,AMD的处理器价格一直没变化,反而不时降价促销。日前有传闻称AMD总代也要封仓,搞的A饭也人心惶惶,不过AMD官方辟谣了,称消息不实,AMD将继续为广大用户提供高性价比优质产品。 这...
名为“startup_stm32f429_439xx.s”的文件,它里边使用汇编语言写好了基本程序,当STM32芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起C语言的运行环境,所以我们把这个文件称为启动文件。该文件使用的汇编指令是Cortex-M4内核支持的指令,可从《Cortex-M4 Technical Reference Manual》查到,也可参考《Cortex-M3权威指南中文》,M3跟M4大...
  在2020年中国国际服务贸易交易会上,各种各样、多种用途的机器人产品吸引了参会者的极大关注。记者从中国电子学会获悉,中国机器人产业整体规模持续增长,尤其是服务机器人需求潜力巨大。中国服务机器人市场已占 市场1/4以上,2020年我国服务机器人市场规模有望突破40亿美元,为服务业注入新活力。   物流配送机器人、清扫消毒机器人、帮助做康...
跌落神坛的“扫地茅”还能重回巅峰吗?8月27日,科沃斯(603486.SH)发布2021年半年报显示,上半年营收53.59亿元,同比增长123.11%;净利8.50亿元,同比增长543.25%。尽管业绩亮眼,但二级资本市场似乎并不买单。科沃斯在8月30日、31日连续大幅下跌,跌幅分别为10%、7.35%。5倍的净利润增长,为何没有提振“扫地茅”的股价?在「不二研究」看来...

史海拾趣

问答坊 | AI 解惑

汽车发展的重要标志--现代汽车电子技术

汽车电子化被认为是汽车技术发展进程中的一次革命,汽车电子化的程度被看作是衡量现代汽车水平的重要标志,是用来开发新车型,改进汽车性能最重要的技术措施。汽车制造商认为增加汽车电子设备的数量、促进汽车电子化是夺取未来汽车市场的重要的有效 ...…

查看全部问答∨

嵌入式系统关键技术分析与开发应用

引 言   在当前数字信息技术和网络技术高速发展的后PC(Post-PC)时代,嵌入式系统已经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术以及人们的日常生活等方方面面中。随着国内外各种嵌入式产品的进一步开发和推广,嵌入式 ...…

查看全部问答∨

嵌入式软件测试的十大秘诀

在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1(实际上可能更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对一般人来讲很重要。   很多年前,一位开发人员为了对嵌入式有更深层次的理解 ...…

查看全部问答∨

一款AD芯片~~

本帖最后由 paulhyde 于 2014-9-15 08:53 编辑 一款AD芯片,ADS1110,采用I2C借口,16位~~~TI出品~~~挺好用的  …

查看全部问答∨

用directshow做camera程序,得到的图像画面是倒立的,当弹出messagebox后又变成正立(正常)画面,请是这是为什么?

用directshow做camera程序,得到的图像画面是倒立的,当弹出messagebox后又变成正立(正常)画面,请是这是为什么? …

查看全部问答∨

招linux 嵌入式开发工程师

c语言功底扎实,能快速完成简单数据结构链表,队列程序的编写,了解嵌入式linux开发。对基本的驱动程序编写原理了解。对GUI机制有所了解。待遇面谈。应届和工作1-2年的即可! 有意者请发简历到efly2008@qq.com…

查看全部问答∨

用PB订制内核时,如何让被定制的内核跟手边的特定硬件平台相关联?

在定制嵌入式XP内核时,是通过在目标硬件平台上运行一个工具,然后生成一个硬件平台信息文件,接着通过这个文件来订制内核的,很显然,这个信息文件就把系统跟目标硬件联系起来了,换句话说,这样生成的嵌入式系统是基于这个目标硬件平台的。初次学 ...…

查看全部问答∨

Intel下代主流芯片组命名P55

我们知道,P45是Intel LGA775平台的最后一款主流芯片组,而它的继任者是面向LGA1160平台的“Ibex Peak”,命名很简单:P55。 即将推出的X58虽然也是5系列芯片组,但仅用于高端LGA1366平台,支持Bloomfield Core i7系列处理器。 P55主要搭配代号Ly ...…

查看全部问答∨

求EVC上的五子棋源代码

小弟把VC上的五子棋源代码移植到EVC上发现不行,现在自己又不想再做一次,希望哪个大哥有EVC上的五子棋代码发个给我,不胜感激!!!!…

查看全部问答∨

大虾们 谁有CM3 9B95的中文资料

谁有CM3 9B95的中文资料  最近将要接触9B96片子   急需它的中文资料 拜谢~~…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved