本文采用STM32的模拟I2C对 EEPROM(AT24C02)进行读写操作。

1.EEPROM(24C02):I2C接口

1.1-24C02器件介绍:

AT24C02的总容量是256个字节,也就是2K。
VCC和VSS是芯片的电源和地,电压的工作范围为:+1.8V~+6.0V;
A0、A1、A2是IC的地址选择脚;
SCL是I2C通讯时钟引脚;
SDA是I2C通讯数据引脚;
WP是写保护使能脚;当WP引脚接高电平的时,24C02只能进行读取操作,不能进行写操作;只有当WP引脚悬空或接低电平时,24C02才能进行写操作。

1.2-24C02的读写

AT24C02的设备地址为如下:
前四位固定为1010,A2~A0由管脚电平决定,最后一位表示读/写操作。
因此:
AT24C02的读地址为0xA1
AT24C02的写地址为0xA0
AT24C02芯片片内地址寻址可对内部256个字节中的任一个进行读/写操作,其寻址范围为00~FF,共256个。

1.2.1-24C02字节写时序

1.2.2-24C02字节读时序

1.2.3-程序代码

at24cxx.h,硬件以AT24C02为例;

#ifndef __AT24CXX_H__
#define __AT24CXX_H__#include "stm32f10x.h"#define EEPROM_TYPE               AT24C02#define AT24C01                   127
#define AT24C02                   255
#define AT24C04                   511
#define AT24C08                   1023
#define AT24C16                   2047
#define AT24C32                   4096#define AT24C02_WRITEADDRESS    0XA0
#define AT24C02_READADDRESS     0XA1void AT24CXX_WriteOneByte(u8 writeaddr,u8 writedat);
u8 AT24CXX_ReadOneByte(u16 readaddr);u8 AT24CXX_Check(void);//检测器件是否正常void AT24CXX_WriteLenByte(u16 writeaddr,u32 writedat,u8 Len);
u32 AT24CXX_ReadLenByte(u16 readaddr,u8 Len);void AT24CXX_Read(u16 readaddr,u8 *p,u16 num);
void AT24CXX_Write(u16 writeaddr,u8 *p,u16 num);#endif

at24cxx.c

#include "at24cxx.h"
#include "iic.h"
#include "delay.h"void AT24CXX_WriteOneByte(u8 writeaddr,u8 writedat)
{IIC_Start();  if(EEPROM_TYPE>AT24C16){IIC_WriteByte(AT24C02_WRITEADDRESS);//发送写命令IIC_Wait_Ack();IIC_WriteByte(writeaddr>>8);//发送高地址     }else{IIC_WriteByte(AT24C02_WRITEADDRESS+((writeaddr/256)<<1));   //发送器件地址,写}       IIC_Wait_Ack();    IIC_WriteByte(writeaddr%256);//发送低地址IIC_Wait_Ack();                                                     IIC_WriteByte(writedat);//发送要写入的数据                          IIC_Wait_Ack();                     IIC_Stop();     //产生一个停止条件 delay_ms(10);
}
u8 AT24CXX_ReadOneByte(u16 readaddr)
{                 u8 temp=0;                                                                                IIC_Start();  if(EEPROM_TYPE>AT24C16){IIC_WriteByte(AT24C02_WRITEADDRESS);//发送写命令IIC_Wait_Ack();IIC_WriteByte(readaddr>>8);//发送高地址        }else {IIC_WriteByte(AT24C02_WRITEADDRESS+((readaddr/256)<<1));   //发送器件地址,写}           IIC_Wait_Ack(); IIC_WriteByte(readaddr%256);//发送低地址IIC_Wait_Ack();       IIC_Start();           IIC_WriteByte(AT24C02_READADDRESS); //进入接收模式            IIC_Wait_Ack();   temp=IIC_ReadByte();//接收数据           IIC_Stop();//产生一个停止条件        return temp;
}
//检查AT24CXX是否正常
//这里用了24CXX的最后一个地址(255)来存储标志字.
//如果用其他24C系列,这个地址要修改
//返回1:检测失败
//返回0:检测成功
u8 AT24CXX_Check(void)
{u8 temp;temp=AT24CXX_ReadOneByte(255);//避免每次开机都写AT24CXX   if(temp==0X55){return 0;}        else//排除第一次初始化的情况{AT24CXX_WriteOneByte(255,0X55);temp=AT24CXX_ReadOneByte(255);   if(temp==0X55)return 0;}return 1;
}//在AT24CXX里面的指定地址开始写入长度为Len的数据
//该函数用于写入16bit或者32bit的数据.
//writeaddr  :开始写入的地址
//writedat   :数据数组首地址
//Len        :要写入数据的长度2,4
void AT24CXX_WriteLenByte(u16 writeaddr,u32 writedat,u8 Len)
{   u8 t;for(t=0;t<Len;t++){AT24CXX_WriteOneByte(writeaddr+t,(writedat>>(8*t))&0xff);}
}//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
//readaddr   :开始读出的地址
//返回值     :数据
//Len        :要读出数据的长度2,4
u32 AT24CXX_ReadLenByte(u16 readaddr,u8 Len)
{   u8 t;u32 temp=0;for(t=0;t<Len;t++){temp<<=8;temp+=AT24CXX_ReadOneByte(readaddr+Len-t-1);                      }return temp;
}
//在AT24CXX里面的指定地址开始读出指定个数的数据
//readaddr  :开始读出的地址 对24c02为0~255
//p         :数据数组首地址
//num       :要写入数据的个数
void AT24CXX_Read(u16 readaddr,u8 *p,u16 num)
{while(num){*p++=AT24CXX_ReadOneByte(readaddr++);  num--;}
}
//在AT24CXX里面的指定地址开始写入指定个数的数据
//writeaddr :开始写入的地址 对24c02为0~255
//p         :数据数组首地址
//num       :要写入数据的个数
void AT24CXX_Write(u16 writeaddr,u8 *p,u16 num)
{while(num--){AT24CXX_WriteOneByte(writeaddr,*p);writeaddr++;p++;}
}

2.工程结构

此工程硬件基于野火指南者开发板,板载EEPROM芯片24C02,采用I2C接口读写,LED灯指示工作状态,KEY按键进行读写操作,USART串口显示信息,工程包含文件如下图所示:
给出主程序main.c

#include "stm32f10x.h"#include "led.h"
#include "key.h"
#include "delay.h"
#include "usartx.h"
#include "iic.h"
#include "at24cxx.h"//要写入到24c02的字符串数组
const u8 TEXT_Buffer[]={" STM32F103VET6 IIC-24C02 TEST OK! "};
#define SIZE sizeof(TEXT_Buffer)     int main(void)
{u8 i=0;u8 datatemp[SIZE];delay_init();LED_GPIO_Config();KEY_GPIO_Config();IIC_GPIO_Config();Usart_Config(115200);printf("IIC-AT24C02 TEST \r\n");while(AT24CXX_Check())//检测不到AT24c02{printf("AT24C02 Check Failed! \r\n");delay_ms(500);printf("Please Check! \r\n");delay_ms(500);LEDR_TOGGLE; }while(1){if(KEY_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_DOWN){LED_BLUE;AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);USART_SendString(USARTx,"Start Write 24C02.... \r\n");USART_SendString(USARTx,"24C02 Write Finished! \r\n");}if(KEY_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_DOWN){LED_GREEN;USART_SendString(USARTx,"Start Read 24C02.... \r\n");AT24CXX_Read(0,datatemp,SIZE);USART_SendString(USARTx,"24C02 Read Finished! \r\n");USART_SendString(USARTx,"The Data Readed Is: ");USART_SendString(USARTx,datatemp);USART_SendString(USARTx,"\r\n");}i++;delay_ms(10);if(i==10){LEDG_TOGGLE;//提示系统正在运行//printf("AT24C02 Run OK! \r\n");          i=0;}  }
}

3.功能测试

4.资料分享

STM32+I2C+AT24C02

基于STM32的I2C通信 2(读写AT24C02)相关推荐

  1. 基于距离传感器的I2C通信(一)

    基于距离传感器的I2C通信(一) 一.软硬件准备 (一)硬件 (二)软件 ST-Link驱动的下载安装 二.keil软件的配置 (一)初始配置 (二)程序下载及调试 三.器件的初步了解 四.接线方法 ...

  2. STM32 I2C通信(读写eeprom)

    I2C通信 双线制:串行时钟线SCL,串行数据线SDA. 通常采用软件模拟i2c通信.

  3. 基于STM32实现I2C从机的数字数学计算器:用于执行加法、减法和乘法操作的深度解析及应用

    一.引言 在许多现代电子设备中,微控制器都是至关重要的组成部分,其作用是控制和处理系统内部的各种操作.我们经常遇到一种情况,即需要微控制器与其他设备进行通信以接收或传递信息.在这种情况下,I2C(In ...

  4. STM32的I2C通信

      STM32的两个GPIO引脚,分别用于SCL和SDA,按照I2C规约的时序,像控制LED灯那样控制引脚输出,若是接收数据时则读取SDA线上的电平,那就可以实现I2C通信了,这也是我们在51单片机上 ...

  5. 单片机与PC机的交流———基于STM32的串口通信

    STM32之串口通信程序 前言: 一.串口通信要求 二.串口通信准备 1.硬件准备 2.软件准备 三.下载程序进入STM32 1.下载之前相关配置 2.下载 四.最终效果展示 总结: 前言: 本文主要 ...

  6. 基于STM32实现串口通信输出hello windows!

    文章目录 前言 一.介绍 1.串口协议和RS-232.485标准 2.RS232.485电平与TTL电平的区别 3.USB/TTL转232模块的工作原理 二.安装 1.安装STM32CubeMX 2. ...

  7. arduino i2c 如何写16位寄存器_基于STM32使用I2C读取传感器数据

    撑腰会儿:I2C通信协议介绍​zhuanlan.zhihu.com 上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息. 首先,为了使用I2C读取传感器测量 ...

  8. 基于STM32的ModbusRtu通信--终极Demo设计(二)

    [--------------点击下面,进入总目录索引--------------]  STM32系列精品Demo集 - 总目录 图示:MosbusRtu通信效果演示 一.方案设计 1.1.Uart接 ...

  9. linux i2c 多字节读写,基于51单片机i2c多字节的读写

    描述 使用Keil的编译环境下载,确实能够下载,但是入口的地址是如下黄色的那行显示所示,如果单步执行(F11)或全速运行(F5),程序始终在原位置不动(0x1FFF4252),如果强制的将PC指针的值 ...

最新文章

  1. xcode svn commit is not under version control 和 git常用指令
  2. Socket之UDP服务器【Python】
  3. mysql 时间chuo格式化_Mysql时间戳与时间格式转换问题汇总
  4. 【javascript】DOM操作方法(3)——document节点属性
  5. React开发(247):react项目理解 学会debugger
  6. 树:二叉树的非递归遍历算法
  7. 复变函数:傅里叶级数
  8. Kali linux 渗透测试(五)——渗透WPS攻击
  9. Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
  10. Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统
  11. ROS基础篇(四)-- 调试时,常用的命令有哪些
  12. 时间去哪儿了?--读《时间简史》有感
  13. Swift 读标准库源码笔记 -- Integers(基本数据类型篇)
  14. 鸿图之下服务器维护10月25,更新公告丨《鸿图之下》11月25日维护更新预告
  15. 【测试用例练习】微信发红包(含思路)
  16. WordPress插件开发教程1:开发第一个WordPress插件
  17. 小老虎CSDN博客流量分析
  18. Deeply Learned Attributes for Crowded Scene Understanding
  19. SQL Server中的约束(六种约束)
  20. 禁用和恢复用户账户Linux,linux用户和组管理.ppt

热门文章

  1. 显示答案c语言代码编程,c语言编程例题及答案
  2. 智能手机PDR和VDR思考
  3. 特殊格式的时间读取并排序
  4. 视频编解码之常见GOP结构
  5. pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed
  6. P2-前端基础-网页中的实体(转义字符)
  7. 金融企业邮箱发推荐信,金融行业如何保障邮件安全?
  8. java,判断一个整数是质数还是合数.
  9. 市场调研-船用离合器市场现状及未来发展趋势
  10. 维吉尼亚算法python编程实现