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 转眼间期末又到了,最近开始了所谓的期末总预习,比 ...
随机推荐
- 201521123023《java程序设计》第四周学习总结
1. 本周学习总结 思维导图 常规: (1)抽象类:不能被直接实例化.只能作为其它类的父类,这一点与final类正好相反.用关键词abstract声明. (2)继承:只能有一个父类,即单继承,子类继承 ...
- 201521123006 《Java程序设计》 第2周学习总结
1. 本周学习总结 本周进一步学习了java,了解了java编程中一些特定的用法,比如:在编译程序时可以使用import来减少输入包名称.本周还学会了使用枚举类(enum Choice{fab,sor ...
- 201521123121 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 1.两类传输协议:TCP:UDP TCP/IP协议的名称中只有TCP这个协议名,但是在TCP/IP的传输层 ...
- 谈一谈最近学了一段时间的node.js
官方说明 1.NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”. 2.node是一个基于Chrome V8引擎进行代码解释的.轻量.可伸缩的具有事件驱动和非阻塞I/O机制的js运 ...
- 网页端HTML使用MQTTJs订阅RabbitMQ数据
最近在做一个公司的日志组件时有一个问题难住了我.今天问题终于解决了.由于在解决问题中,在网上也查了很多资料都没有一个完整的实例可以参考.所以本着无私分享的目的记录一下完整的解决过程和实例. 需求:做一 ...
- java类成员的访问权限
private:这是安全级别最高的访问权限,尽在该类中可以访问到: 默认访问权限:又称包访问权限,顾名思义,仅在该包内可以访问: protected:在包访问权限的基础上,该类的子类也可以访问到: p ...
- 《HelloGitHub》第 18 期
<HelloGitHub>第 18 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...
- 变量的声明和定义以及extern的用法
变量的声明和定义以及extern的用法 变量的声明不同于变量的定义,这一点往往容易让人混淆. l 变量 ...
- base64码转图片
1将图片转换为Base64编码,可以让你很方便地在没有上传文件的条件下将图片插入其它的网页.编辑器中. 这对于一些小的图片是极为方便的,因为你不需要再去寻找一个保存图片的地方. 2.假定生成的代码为& ...
- UI自动化测试简介及Selenium工具的介绍和环境搭建
自动化测试简介 1.1何为自动化测试? 是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程.换言之,就是以程序实现的方式来代替手工测试. 1.2自动化测试分类 分为功能自动化测 ...