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 转眼间期末又到了,最近开始了所谓的期末总预习,比 ...
随机推荐
- apache: apache-tomcat-6.0.35完整下载
Index of /dist/tomcat/tomcat-6/v6.0.35/bin Name Last modified Size Description Parent Directory - ex ...
- 03_Ext_Viewport_Window_Dialog
Viewport Viewport 代表整个浏览器窗口,直接渲染到document.body节点,取代页面中的所有内容.一般作为应用程序主界面. 随着浏览器显示区域的大小自动改变,一个页面中只能有一个 ...
- Shiro初识与总结
1.1简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动应用程序 ...
- 【Debian 8.8】Java 8 安装以及环境变量配置
事实上可以分为简单的三个步骤: 下载 JDK 压缩包 解压压缩包 配置环境变量 需要注意的是: 所有命令默认在 root 权限下进行! 演示环境是 Debian 8.8 64位 (阿里云学生机) 1. ...
- WPF控件自适应屏幕
如果说界面设计,那么自适应问题一定无法避免,今天就来分享一下,wpf如何实现自适应,先看一下效果:(文末添加源代码下载) 基本思路就是用 Grid 的网格,进行宽度的自动填充适应, 不过对于 ...
- 【Linux笔记(001) 】-- centos7 系统目录结构与文件
一.目录结构与用途: /boot:系统引导文件.内核 /bin:用户的基本命令 /dev:设备文件 /etc:配置文件 /home:用户目录 /root:root用户目录 /sbin:管理类的基本命令 ...
- 教育,创新,提升:Indiegogo和Kickstarter上受中国用户支持的10个众筹项目
中国的经济正在迅速发展,已成为世界第二大经济体.中国家庭随着经济水平的提高,越来越多父母愿意将自己的子女送到海外留学. 家长们希望自己的子女可以有机会接受国外大学优质的教育, 以便他们将来可以学成归来 ...
- Paint the Grid Again ZOJ - 3780 拓扑
Paint the Grid Again Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu [ ...
- JSP获取input(含正则表达式)
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> < ...
- wireshark数据包分析实战 第二章
1,监听网络线路:即嗅探器的位置确定. 2,混杂模式:将网卡设置成混杂模式,网卡可以接受经过网卡的所有数据报,包括目的地址不是本网卡的数据报.这些数据都会发送给cpu处理,这样,wireshark就能 ...