历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-09-12 来源:eefocus

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_

推荐阅读

史海拾趣

Daito Communication Apparatus Co Ltd公司的发展小趣事

随着微电子学的快速发展,电子设备对元器件的要求也越来越高。Daito公司敏锐地捕捉到了这一市场趋势,决定对保险丝进行进一步的创新。在1995年,他们成功开发出了适用于电路板安装的高精度小型报警保险丝。这一产品的推出,不仅满足了市场对小型化、高精度保险丝的需求,也进一步巩固了Daito公司在电子行业中的领先地位。

随后,Daito公司又针对微电子学的进一步发展,推出了可以连续自动安装的方形微型保险丝。这一产品的推出,大大提高了生产效率,降低了成本,同时也为客户提供了更加便捷的使用体验。近年来,随着面安装技术的兴起,Daito公司又迅速推出了适用于面安装技术的片状保险丝,再次展示了他们在电子行业中的创新实力。

请注意,由于篇幅限制,以上仅为两个故事示例。如果需要更多故事,可以进一步深入研究和探索Daito公司在电子行业中的发展历程和创新实践。

DATEL Inc公司的发展小趣事

DATEL Inc.公司成立于1970年,总部位于美国马萨诸塞州。公司成立的初衷是解决当时数据采集领域的痛点,如数据准确性低、采集效率低下等问题。创始人带领一支由工程师组成的团队,开始研发第一代数据采集产品。他们日夜兼程,不断试验、调整,最终成功推出了一款体积小、功耗低、易于开发的数据采集器,这款产品迅速在市场中获得了认可。

安碁科技(AKER)公司的发展小趣事

在电子行业快速发展的背景下,安碁科技始终坚持持续创新和客户导向的经营理念。公司不断投入研发资源,推出具有竞争力的新产品和解决方案,以满足客户不断变化的需求。同时,安碁科技也注重与客户的沟通和合作,深入了解客户的需求和反馈,不断优化产品和服务。这种以客户为中心的经营模式,使得安碁科技在市场上赢得了良好的声誉和口碑。

这五个故事只是安碁科技发展历程中的一部分,但它们充分展示了公司在电子行业中的崛起和发展。安碁科技凭借其卓越的技术实力、品质管理和创新能力,在激烈的市场竞争中脱颖而出,成为行业的佼佼者。未来,随着电子行业的不断发展和变化,安碁科技将继续保持创新和进取的精神,为客户和市场带来更多优质的产品和服务。

ADMOS公司的发展小趣事

在电子行业的早期,ADMOS公司以其前瞻性的技术视野和不懈的研发努力,成功开发出一款高效能、低能耗的功率管理芯片。这款芯片在市场上迅速获得了认可,为ADMOS公司赢得了良好的口碑。这一技术突破不仅奠定了ADMOS在功率管理领域的领先地位,也为公司的后续发展奠定了坚实的基础。

乔光电子(FTR)公司的发展小趣事

在电子行业的早期,ADMOS公司以其前瞻性的技术视野和不懈的研发努力,成功开发出一款高效能、低能耗的功率管理芯片。这款芯片在市场上迅速获得了认可,为ADMOS公司赢得了良好的口碑。这一技术突破不仅奠定了ADMOS在功率管理领域的领先地位,也为公司的后续发展奠定了坚实的基础。

EOS POWER INDIA Pvt公司的发展小趣事

在追求经济效益的同时,EOS也注重可持续发展和环保责任。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。EOS还投入资金建设了环保设施,确保生产过程中的废弃物得到有效处理。此外,公司还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了EOS的社会责任感,也为公司的长期发展奠定了坚实的基础。

问答坊 | AI 解惑

淘宝上卖的大赛小车成品资料,很有价值

本帖最后由 paulhyde 于 2014-9-15 09:10 编辑  …

查看全部问答>

【Labview】labview学习网站有哪些

大家学习labview都在哪些网站和论坛上混啊?     本人常去的有两个,www.ni.com这是NI的网站,学习labview怎么能不上呢!     其次是www.gsdzone.net 这是我常去的Labview论坛,里面有资深NI工程师潜伏哦!…

查看全部问答>

wince应用程序ICO图标问题

在vs中的工程设置的图标 程序原来在wm上运行,图标显示是正常的 到了wince上就显示不正常了 好像是分辨率的问题 请问这个怎么解决呢…

查看全部问答>

学usb驱程有用吗

老师上课说大四做毕业设计有做usb驱程的,我有些兴趣就买了相关方面的书看,可是刚看前言作者就说学usb驱程很复杂也没有什么用,想问一下学这个对开发嵌入式有用吗…

查看全部问答>

关于计算机的二进制计算问题

最近在看汇编,但是很是困惑: 1.我们一般在高级语言里碰到的int\\float,与我们在讲解二进制加法时用的8位有什么关系? 2.若汇编老师在讲解完计算机内的数字存储后,发问7+251=?那到底怎么做呢?   251=11111011已经八位了啊!!? ...…

查看全部问答>

wince writefile 总是发送不了数据,但不报错!

问题如下:        我现在接手别人的工作,驱动别人是用evc4.2写dll,驱动经测试可用。        我现在用C#开发应用程序。        现在的问题是,驱动writefile第二个参数他传的是 ...…

查看全部问答>

初学ATmega128,有个数据存储的问题想请教各位大虾

在C51中,char xdata doc[19]=\"AT+CMGF=0\"; 我想请教一下各位大虾,在ATmega128中,这个语句应该怎样写呢? …

查看全部问答>

windows mobile 6.0 下ras拨号的问题

我在mobile5下使用ras函数RasDial拨号连接没有问题 同样的程序以及拨号配置在mobile 6下却无法拨号成功 不知道5跟6在这方面有什么不一样吗 有经验的大虾帮忙看看,谢谢!!!…

查看全部问答>

菜鸟,请你们珍爱生命,远离protues

       今天,用protues搭了一个电路,写了一个相应的程序,调试运行了一下,竟然无效, 于是乎,我就把原本庞大的电路删减一部分剩下基本的显示数码管,可是竟然还是不 对,那么,我首先怀疑是不是我的程序有问题 ...…

查看全部问答>