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 转眼间期末又到了,最近开始了所谓的期末总预习,比 ...
随机推荐
- 201521123015 《Java程序设计》第4周学习总结
本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.多态:使用单一接口操作多种类型的对象. 2.private修饰属性,public修饰方法. 3 ...
- vbs文件共享变量与函数的方法
参考资料: vbs能否像其他编程语言一样,把写好的代码打包成类库以供调用呢?经过搜索和实验,发现vbs文件之间可以互相调用并共享变量,这样我们就不用再反复地编写轮子了. 以下是一个调用实例: ==== ...
- 201521123013 《Java程序设计》第13周学习总结
1. 本周学习总结 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? ping值 ...
- 201621123067《JAVA程序设计》第一周学习总结
第一周-JAVA基本概念 1.本周学习总结 本周初次接触Java这一工程语言,我也首次接触了类名和面向对象这两个关键术语,虽然有C的基础但还是觉得有点不同.同时也学习到了Java的安装,eclipse ...
- python基础之元组,集合
一.元组 为何要有元组,存放多个值,元组不可变,更多的是用来做查询 t=(,[,],,)) #t=tuple((,[,],,))) print(type(t)) 元组可以作为字典的key d={(,, ...
- 02_Ext_Panel
1,面板由以下几个部分组成, 一个顶部工具栏(tbar).一个底部工具栏(bbar).面板头部(header).面板尾部(bottom).面板主区域(body)几个部分组成. 面板类中还内置了面板展开 ...
- Java 使用Axis实现WebService实例
在上一篇WebService实例中,基于jdk1.6以上的javax.jws 发布webservice接口.这篇博文则主要用eclipse/myeclipse 使用axis插件进行发布和调用WebSe ...
- 【DDD】领域驱动设计实践 —— Application层实现
本文是DDD框架实现讲解的第二篇,主要介绍了DDD的Application层的实现,详细讲解了service.assemble的职责和实现.文末附有github地址.相比于<领域驱动设计> ...
- Tomcat启动一闪而过
问题: 在下载tomcat7纯净版之后,配置完环境变量.运行startup.bat,一闪而过tomcat没有启动成功. 解决办法: 设置CLASSPATH.环境变量设置JAVA_HOME为java安装 ...
- java集合系列——List集合之LinkedList介绍(三)
1. LinkedList的简介 JDK 1.7 LinkedList是基于链表实现的,从源码可以看出是一个双向链表.除了当做链表使用外,它也可以被当作堆栈.队列或双端队列进行操作.不是线程安全的,继 ...