STM32F10x -- 利用IIC协议操作AT24C02
关于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的更多相关文章
- 复习IIC协议---以AT24C02为例
1.总纲--复习IIC(inter integrated circuit)协议以及自己顺便读一下数据手册. /********************************************* ...
- STM32F10X -- 模拟IIC程序
听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议.此程序能成功对AT24C02操作. 程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具 ...
- IIC协议建模——读写EEPROM
案例采用明德扬设计思想完成.IIC协议是非常常用的接口协议,在电子类岗位招聘要求中经常出现它的身影.关于IIC协议这里只做简要介绍,详细信息请自行百度或查阅相关Datasheet,网上资料非常多.该篇 ...
- IIC协议解释(转)
IIC协议解释 推荐资源: http://m.elecfans.com/article/574049.html and https://blog.csdn.net/firefl ...
- 第十六章 IIC协议详解+UART串口读写EEPROM
十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...
- IIC协议解释
IIC协议解释 (1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量 ...
- 基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取
1. 综述 由上篇博客可知道IIC协议如何用代码实现,本篇博客就不涉及协议内容,只讲解如何使用. 本次的实验传感为:DS3231(时钟模块),对于时钟模块的具体信息我也就不多介绍,大家可以自行度娘,具 ...
- IIC协议解析
(1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距 ...
- IIC协议学习笔记
"移植"的重要性:并非所有的电路都得自己设计,到了一定阶段,"移植"也是一种学习能力.--CrazyBingo 转眼间期末又到了,最近开始了所谓的期末总预习,比 ...
随机推荐
- 201521123067 《Java程序设计》第8周学习总结
201521123067 <Java程序设计>第8周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 Q1.List中指定 ...
- Java程序设计第五周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 **代码阅读:Child压缩包内源代码 Child.java源代 ...
- 201521123045 《JAVA程序设计》 第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- 201521123104《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用sync ...
- linux目录结构图
- JS中的DOM对象及JS对document对像的操作
DOM对象 windows:属性:opener(打开者) 方法:open().close(),setTimeout().setInterval()... location:属性:href 方法:rel ...
- delphi引用别的单元时问题
当需要添加别的工程总的unit文件时,将unit的pas文档放入工程目录下,在工程页面Uses添加 Unit2 in 'Unit2.pas' {DataModule2: TDataModule}, U ...
- 分区工具fdisk,gdisk,parted
在linux中,当我们给系统添加一块新硬盘时,我们是无法使用的,因为他还没有分区和格式化,只有当我们将新硬盘分区并格式化之后,挂载在某个目录下,才能供我们正常使用,接下来我们要学习三种硬盘分区工具,f ...
- Struts2第十篇【数据校验、代码方式、XML配置方式、错误信息返回样式】
回顾以前的数据校验 使用一个FormBean对象来封装着web端来过来的数据 维护一个Map集合保存着错误信息-对各个字段进行逻辑判断 //表单提交过来的数据全都是String类型的,birthday ...
- 对比requirejs更好的理解seajs
seajs遵循CMD规范,requirejs遵循AMD规范.AMD规范是预加载,CMD规范是赖加载. 下文举例假设有文件 b.js, c.js如下 //b.js define(function(req ...