关于AT24C02芯片的一些参数性能可参考其他的一些相关资料。此处只贴出程序。

宏文件AT24CXX.h 

#ifndef _AT24CXX_H_
#define _AT24CXX_H_ #include "IIC.h"
#include "SysTick.h" #define EEPROM_TYPE AT24C02 //实际中用到的EEPROM类型
/* 可以供选择的EEPROM类型 */
#define AT24C01 128
#define AT24C02 256
#define AT24C04 512
#define AT24C08 1024
#define AT24C16 2048 /* AT24CXX设备地址 */
#define AT24CXX_ADDRESS 0xA0 //与硬件的连接有关系
#define AT24CXX_READ AT24CXX_ADDRESS|1 //读bit有效
#define AT24CXX_WRITE AT24CXX_ADDRESS|0 //写bit有效
#define AT24CXX_DELAY(time) delay(time) /* 函数原型 */
void AT24CXX_Init(void);
unsigned char AT24CXX_ReadOneByte(unsigned short int ReadAddr);
unsigned int AT24CXX_ReadLenByte(unsigned short int ReadAddr, unsigned char Len); void AT24CXX_WriteOneByte(unsigned short int WriteAddr,unsigned char DataToWrite);
void AT24CXX_WriteLenByte(unsigned short int WriteAddr,unsigned int DataToWrite,unsigned char Len); unsigned char AT24CXX_Check(void); void AT24CXX_Read(unsigned short int ReadAddr,unsigned char *pBuffer,unsigned short int NumToRead);
void AT24CXX_Write(unsigned short int WriteAddr,unsigned char *pBuffer,unsigned short int NumToWrite); #endif

  

源程序文件 AT24CXX.c

#include "AT24CXX.H"

/*****************************
** 初始化AT24Cxx, IIC接口
**
******************************/
void AT24CXX_Init(void)
{
IIC_IOInit();
} /*****************************
** 在 AT24CXX 指定地址读出一个数据
** ReadAddr:开始读数的地址
** 返回值 :读到的数据
******************************/
unsigned char AT24CXX_ReadOneByte(unsigned short int ReadAddr)
{
unsigned char temp=0;
IIC_Start();
if(EEPROM_TYPE>AT24C16)
{
IIC_Send_Byte(AT24CXX_WRITE); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
}
else IIC_Send_Byte(AT24CXX_WRITE); //发送器件地址 0XA0,写数据
IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack(); IIC_Start();
IIC_Send_Byte(AT24CXX_READ); //进入接收模式
IIC_Wait_Ack(); temp=IIC_Read_Byte(0);
IIC_Stop();//产生一个停止条件
return temp;
} /*****************************
** 在 AT24CXX 指定地址写入一个数据
** WriteAddr :写入数据的目的地址
** DataToWrite:要写入的数据
******************************/
void AT24CXX_WriteOneByte(unsigned short int WriteAddr,unsigned char DataToWrite)
{
IIC_Start();
if(EEPROM_TYPE>AT24C16)
{
IIC_Send_Byte(AT24CXX_WRITE); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址
}else
IIC_Send_Byte(AT24CXX_WRITE); //发送器件地址 0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); //发送低地址
IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite); //发送字节
IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件
AT24CXX_DELAY(10000); //延迟10ms
} /*******************************************************************
** 在 AT24CXX 里面的指定地址开始写入长度为 Len 的数据
** 该函数用于写入 16bit 或者 32bit 的数据.
** WriteAddr :开始写入的地址
** DataToWrite:数据数组首地址
** Len :要写入数据的长度 2,4
********************************************************************/
void AT24CXX_WriteLenByte(unsigned short int WriteAddr,unsigned int DataToWrite,unsigned char Len)
{
unsigned char t;
for(t=0; t<Len; t++)
{
AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff); //低位写入低地址
}
} /*******************************************************************
** 在 AT24CXX 里面的指定地址开始读出长度为 Len 的数据
** 该函数用于读出 16bit 或者 32bit 的数据.
** ReadAddr :开始读出的地址
** 返回值 :数据
** Len :要读出数据的长度 2,4
********************************************************************/
unsigned int AT24CXX_ReadLenByte(unsigned short int ReadAddr, unsigned char Len)
{
unsigned char t;
unsigned int temp=0;
for(t=0;t<Len;t++)
{
temp<<=8;
temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1); //读出时先读高位
}
return temp;
} /*******************************************************************
** 检查 AT24CXX 是否正常
** 这里用了 24XX 的最后一个地址(255)来存储标志字.
** 如果用其他 24C 系列,这个地址要修改
** 返回 1:检测失败
** 返回 0:检测成功
********************************************************************/
unsigned char AT24CXX_Check(void)
{
unsigned char temp;
temp=AT24CXX_ReadOneByte(255);//避免每次开机都写 AT24CXX
if(temp==0X0d) return 0;
else//排除第一次初始化的情况
{
AT24CXX_WriteOneByte(255,0X0d);
temp=AT24CXX_ReadOneByte(255);
if(temp==0X0d) return 0;
}
return 1;
} /*******************************************************************
** 在 AT24CXX 里面的指定地址开始读出指定个数的数据
** ReadAddr :开始读出的地址 对 24c02 为 0~255
** pBuffer :数据数组首地址
** NumToRead:要读出数据的个数
**
********************************************************************/
void AT24CXX_Read(unsigned short int ReadAddr,unsigned char *pBuffer,unsigned short int NumToRead)
{
while(NumToRead)
{
*pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
NumToRead--;
}
} /*******************************************************************
** 在 AT24CXX 里面的指定地址开始写入指定个数的数据
** WriteAddr :开始写入的地址 对 24c02 为 0~255
** pBuffer :数据数组首地址
** NumToWrite:要写入数据的个数
**
********************************************************************/
void AT24CXX_Write(unsigned short int WriteAddr,unsigned char *pBuffer,unsigned short int NumToWrite)
{
while(NumToWrite--)
{
AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
WriteAddr++;
pBuffer++;
}
}

STM32F10x -- 利用IIC协议操作AT24C02的更多相关文章

  1. 复习IIC协议---以AT24C02为例

    1.总纲--复习IIC(inter integrated circuit)协议以及自己顺便读一下数据手册. /********************************************* ...

  2. STM32F10X -- 模拟IIC程序

    听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议.此程序能成功对AT24C02操作. 程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具 ...

  3. IIC协议建模——读写EEPROM

    案例采用明德扬设计思想完成.IIC协议是非常常用的接口协议,在电子类岗位招聘要求中经常出现它的身影.关于IIC协议这里只做简要介绍,详细信息请自行百度或查阅相关Datasheet,网上资料非常多.该篇 ...

  4. IIC协议解释(转)

    IIC协议解释 推荐资源: http://m.elecfans.com/article/574049.html       and       https://blog.csdn.net/firefl ...

  5. 第十六章 IIC协议详解+UART串口读写EEPROM

    十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...

  6. IIC协议解释

    IIC协议解释 (1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量 ...

  7. 基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取

    1. 综述 由上篇博客可知道IIC协议如何用代码实现,本篇博客就不涉及协议内容,只讲解如何使用. 本次的实验传感为:DS3231(时钟模块),对于时钟模块的具体信息我也就不多介绍,大家可以自行度娘,具 ...

  8. IIC协议解析

    (1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距 ...

  9. IIC协议学习笔记

    "移植"的重要性:并非所有的电路都得自己设计,到了一定阶段,"移植"也是一种学习能力.--CrazyBingo 转眼间期末又到了,最近开始了所谓的期末总预习,比 ...

随机推荐

  1. 联想G50-70安装SSD及WIN10教程

    借着双11的东风,果断入手SSD120G和4G内存条1枚.经过近一周的安装与试运行,笔者实现了SSD+HDD双硬盘+WIN10系统.目前运行体验非常好,开机时间9秒,软件运行也非常流畅.在折腾的过程中 ...

  2. 【java】聊聊java里的接口

    接口的概念 java中的接口用于描述类应该具备什么样的功能,而不给出具体的实现,一个类可以“实现”多个接口 [注意]接口不是类,而是对类的一组描述   还是让我们通过一个例子来看看接口如何运作吧!   ...

  3. Oracle与Mysql区别简述

    在Mysql中,一个用户下可以创建多个库: 而在Oracle中,Oracle服务器是由两部分组成 数据库实例[理解为对象,看不见的] 数据库[理解为类,看得见的] 一个数据库实例可拥有多个用户,一个用 ...

  4. 如何用SQL实现组内前几名的输出

    关于问题 如何查询组内最大的,最小的,大家或许都知道,无非是min.max的函数使用.可是如何在MySQL中查找组内最好的前两个,或者前三个? 什么是相关子查询 在提出对于这个问题的对应方法之前,首先 ...

  5. SharedPreferences的使用

  6. 比较JqGrid与XtraGrid

    此只能比较两者的功能优劣,实现某种功能.效果的方便性和效率.首先分别粗略介绍XtraGrid和jqGrid DevExpress是目前.net下最为强大和完整的UI控件库, XtraGrid是这个控件 ...

  7. [js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)

    接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的 ...

  8. 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题

    51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...

  9. Android Studio 字体和字号调整

    点击File,Settings. 找到Editor-Colors&Fonts-Font 点击Save As... 改个名字点击OK. 1为字体,2为字号,3为行间距. 我认为字体设置为Cons ...

  10. MySQL优化原理

    前言 说起MySQL的查询优化,相信大家收藏了一堆:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理 ...