本帖最后由 znmcu 于 2009-12-24 22:21 编辑
at24c64.c
#include "at24c64.h"
#include "iic.h"
#include "myfun.h"
/*******************************************************
+-------------------------------------+
| 振南电子 驱动程序模块 AT24C64部分 |
+-------------------------------------+
此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
严禁随意用于商业目的,违者必究,后果自负
振南电子
->产品网站 http://www.znmcu.cn/
->产品网店 http://shop.znmcu.cn/
->产品咨询 QQ:987582714
MSN:yzn07@126.com
WW:yzn07
********************************************************/
/******************************************************************
- 功能描述:向AT24C64的地址为addr的单元上写入一个字节dat
- 隶属模块:AT24C64模块
- 函数属性:外部,供用户使用
- 参数说明:addr:AT24C64的单元地址
dat:要写入的字节
- 返回说明:无
- 注:AT24C64的地址是字节级地址,即最小存储单元是字节,地址范围
是0~8191
******************************************************************/
void AT24C64_Write_Byte(unsigned int addr,unsigned char dat)
{
IIC_Start(); //启动IIC传输
IIC_Write_Byte(0xa0); //1010 A2 A1 A0 R/W [A2:A0]是AT24C64的芯片地址,0~7,即同一条IIC总线上可以挂接8个芯片;R/W是读/写选择位,0为写操作,1为读操作
IIC_Write_Byte(addr>>8);//写入地址高字节
IIC_Write_Byte(addr); //写入地址低字节
IIC_Write_Byte(dat); //写入一个字节的数据
IIC_Stop(); //IIC传输结束,AT24C64开始执行,即将这一个字节写入EEPROM中
delay(5000); //等待AT24C64操作完成,最大5ms
}
/******************************************************************
- 功能描述:写页操作
- 隶属模块:AT24C64模块
- 函数属性:外部,供用户使用
- 参数说明:addr:页开始地址
pbuf:指向数据缓冲区的指针
- 返回说明:无
- 注:向AT24C64芯片addr地址后面连续写入32个字节,即写页操作,
这些数据存放在pbuf中
******************************************************************/
void AT24C64_Write_Page(unsigned int addr,unsigned char *pbuf) //
{
unsigned char i;
IIC_Start(); //启动IIC传输
IIC_Write_Byte(0xa0); //1010 A2 A1 A0 R/W [A2:A0]是AT24C64的芯片地址,0~7,即同一条IIC总线上可以挂接8个芯片;R/W是读/写选择位,0为写操作,1为读操作
IIC_Write_Byte(addr>>8);//写入地址高字节
IIC_Write_Byte(addr); //写入地址低字节
for(i=0;i<32;i++)
{
IIC_Write_Byte(pbuf[i]); //将pbuf中的32个字节写入AT24C64的数据缓冲区
}
IIC_Stop(); //IIC传输结束,AT24C64开始执行,即将这32个字节写入EEPROM中
delay(5000); //等待AT24C64操作完成,最大5ms
}
/**********************************************************************************
- 功能描述:从当前地址连续读取length个字节,放入pbuf指向的数据缓冲区
- 隶属模块:AT24C64模块
- 函数属性:外部,供用户使用
- 参数说明:length:要读取的数据长度
pbuf:指向数据缓冲区的指针
- 返回说明:无
- 注:从当前的地址上读取数据,所以此函数中没有写入地址的操作
**********************************************************************************/
void AT24C64_Current_Addr_Read(unsigned int length,unsigned char *pbuf)
{
unsigned char i;
IIC_Start(); //启动传输,这里再次启动传输,因为下面要写入“读操作”的指令码,即0xa1
IIC_Write_Byte(0xa1); //写入0xa1,从AT24C64中读取数据
for(i=0;i<length-1;i++)
{
pbuf[i]=IIC_Read_Byte(); //读取length-1个字节
IIC_Ack(); //前length-1个字节,每读完一个字节要向AT24C64提供ACK,即告诉其继续提供下面的数据,读取操作还未完毕
}
pbuf[i]=IIC_Read_Byte(); //读取最后一个字节,即第length个字节
IIC_NAck(); //读取最后一个字节后,要向AT24C64提NACK,告诉其读取操作结束,不再向下读了
IIC_Stop(); //传输结束
}
/******************************************************************
- 功能描述:从某个地址读取一个字节
- 隶属模块:AT24C64模块
- 函数属性:外部,供用户使用
- 参数说明:addr:要读取字节的地址
- 返回说明:读到的字节
- 注:此函数中直接调用了上面的 AT24C64_Current_Addr_Read函数
只是在它前面进行了地址的写入
******************************************************************/
unsigned char AT24C64_Read_Byte(unsigned int addr)
{
unsigned char temp;
IIC_Start(); //启动传输
IIC_Write_Byte(0xa0);
IIC_Write_Byte(addr>>8); //写入地址高字节
IIC_Write_Byte(addr); //写入地址低字节
AT24C64_Current_Addr_Read(1,&temp); //从当前地址读取一个字节,放入temp中
return temp;//返回temp的值,即读到的字节
}
/******************************************************************
- 功能描述:读页操作
- 隶属模块:AT24C64模块
- 函数属性:外部,供用户使用
- 参数说明:addr:要读取的页开始地址
pbuf:指向数据缓冲区的指针
- 返回说明:无
- 注:从addr地址连续读取32个字节,将读出来的字节放在pbuf中
******************************************************************/
void AT24C64_Read_Page(unsigned int addr,unsigned char *pbuf)
{
IIC_Start(); //启动传输
IIC_Write_Byte(0xa0);
IIC_Write_Byte(addr>>8); //写入地址高字节
IIC_Write_Byte(addr); //写入地址低字节
AT24C64_Current_Addr_Read(32,pbuf); //从当前地址读取32个字节,放入pbuf中
}
/******************************************************************
- 功能描述:连续读操作
- 隶属模块:AT24C64模块
- 函数属性:外部,供用户使用
- 参数说明:addr:要读取的开始地址
length:要读取的数据长度
pbuf:指向数据缓冲区的指针
- 返回说明:无
- 注:从addr地址连续读取length个字节到pbuf中
******************************************************************/
void AT24C64_Sequential_Read(unsigned int addr,unsigned int length,unsigned char *pbuf)
{
IIC_Start(); //启动传输
IIC_Write_Byte(0xa0);
IIC_Write_Byte(addr>>8); //写入地址高字节
IIC_Write_Byte(addr); //写入地址低字节
AT24C64_Current_Addr_Read(length,pbuf); //从当前地址读取32个字节,放入pbuf中
}
at24c64.h
#ifndef _AT24C64_H_
#define _AT24C64_H_
/*******************************************************
+-------------------------------------+
| 振南电子 驱动程序模块 AT24C64部分 |
+-------------------------------------+
此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
严禁随意用于商业目的,违者必究,后果自负
振南电子
->产品网站 http://www.znmcu.cn/
->产品网店 http://shop.znmcu.cn/
->产品咨询 QQ:987582714
MSN:yzn07@126.com
WW:yzn07
********************************************************/
void AT24C64_Write_Byte(unsigned int addr,unsigned char dat);
void AT24C64_Write_Page(unsigned int addr,unsigned char *pbuf);
void AT24C64_Current_Addr_Read(unsigned int length,unsigned char *pbuf);
unsigned char AT24C64_Read_Byte(unsigned int addr);
void AT24C64_Read_Page(unsigned int addr,unsigned char *pbuf);
void AT24C64_Sequential_Read(unsigned int addr,unsigned int length,unsigned char *pbuf);
#endif
程序中包含的文件如下:
myfun.rar
(1.51 KB)
IIC.rar
(1.71 KB)
|