资源简介
EEPROM是一种掉电后数据不丢失的存储器,常用来存储一些配置信息,以便系统重新上电的时候加载之。EEPROM芯片最常用的通讯方式是IIC协议。此代码为AT24C08的I2C驱动程序,其他型号可按照规格书自行扩展
![](http://www.nz998.com/pic/57561.jpg)
代码片段和文件信息
#include “AT24C08.h“
static void I2C_START(){
IIC_SDA_H;
IIC_SCL_H;
halMcuWaitUs(5);
IIC_SDA_L;
halMcuWaitUs(4);
IIC_SCL_L;
}
static void I2C_STOP(){
IIC_SDA_L;
halMcuWaitUs(2);
IIC_SCL_H;
halMcuWaitUs(4);
IIC_SDA_H;
halMcuWaitUs(5); //到下一次开始的总线最短空闲时间4.7us
}
//低电平应答,返回1表示无应答
static uint8 I2C_WaitAck(void)
{
IIC_SDA_H;
IIC_SCL_H;
halMcuWaitUs(5);
if(IIC_SDA_VALUE)
return 1;
IIC_SCL_L;
halMcuWaitUs(5);
return 0;
}
static void I2C_SendAck(void)
{
IIC_SCL_L;
IIC_SDA_L;
halMcuWaitUs(5);
IIC_SCL_H;
halMcuWaitUs(4);
IIC_SCL_L;
}
static void I2C_SendNoAck(void)
{
IIC_SCL_L;
IIC_SDA_H;
halMcuWaitUs(5);
IIC_SCL_H;
halMcuWaitUs(4);
IIC_SCL_L;
}
void I2C_WRITE(uint8 byte){
uint8 Cnt;
IIC_SDA_OUT;
IIC_SCL_L;
halMcuWaitUs(1);
for(Cnt=0;Cnt<8;Cnt++)
{
if(byte&0x80)
{
IIC_SDA_H;
}
else
{
IIC_SDA_L;
}
byte<<=1;
halMcuWaitUs(5);
IIC_SCL_H;
halMcuWaitUs(5);
IIC_SCL_L;
}
}
uint8 I2C_READ(){
uint8 CntByte=0;
IIC_SDA_H;
IIC_SDA_IN;
halMcuWaitUs(2);
for(Cnt=0;Cnt<8;Cnt++)
{
Byte<<=1;
IIC_SCL_H;
halMcuWaitUs(5);
if(IIC_SDA_VALUE)
Byte++;
IIC_SCL_L;
halMcuWaitUs(5);
}
IIC_SDA_OUT;
return Byte;
}
//写单个字节(设备地址+寄存器地址+单字节数据+停止位)数据地址为0-0xff每个地址存储一个8位字节
//at24c08设备地址第二三位表示存储阵列地址08总共有1k字节,共有四个区域,每个存储区域256字节,所以area--> 00 01 10 11
uint8 writeOneByte(uint8 Reguint8 RegValuint8 area)
{
I2C_START();
I2C_WRITE(IIC_WRITE_ADDR|(area<<1));
if(I2C_WaitAck())
return 1;
I2C_WRITE(Reg);
if(I2C_WaitAck())
return 1;
I2C_WRITE(RegVal);
if(I2C_WaitAck())
return 1;
I2C_STOP();
return 0;
}
//读单个字节,读取完成后主机不需要应答,只需要停止信号
//Reg 要读的寄存器的地址
//RegVal 读出来的数据保存的地址
//0 成功 1失败
uint8 readOneByte(uint8 Reguint8 *RegValuint8 area)
{
I2C_START();
I2C_WRITE(IIC_WRITE_ADDR|(area<<1));
if(I2C_WaitAck())
return 1;
I2C_WRITE(Reg);
if(I2C_WaitAck())
return 1;
I2C_START();
I2C_WRITE(IIC_READ_ADDR|(area<<1));
if(I2C_WaitAck())
return 1;
*RegVal=I2C_READ();
I2C_SendNoAck();
I2C_STOP();
return 0;
}
//连续写多个字节(写地址自动累加,最大16字节,多的将会覆盖之前的数据)
//设备地址+寄存器地址+多字节数据+停止位
uint8 writeMutipleDatas(uint8 Reguint8* RegValuint8 countuint8 area){
uint8 i = 0;
if(count>16)
return 1;
I2C_START();
I2C_WRITE(IIC_WRITE_ADDR|(area<<1));
if(I2C_WaitAck())
return 1;
I2C_WRITE(Reg);
if(I2C_WaitAck())
return 1;
for(;i I2C_WRITE(RegVal[i]);
if(I2C_WaitAck())return 1;
}
I2C_STOP();
return 0;
}
//连续读多个
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 667886 2018-11-15 18:30 AT24系列E2PROM\AT24c02中文官方资料手册pdf.pdf
文件 4538 2018-11-21 14:47 AT24系列E2PROM\AT24C08.c
文件 1060 2018-11-16 08:50 AT24系列E2PROM\AT24C08.h
目录 0 2018-11-26 17:57 AT24系列E2PROM
----------- --------- ---------- ----- ----
673484 4
- 上一篇:IAR for 8.10
- 下一篇:软件系统设计文档模板
相关资源
- 直流无刷电机方波驱动 stm32 例程代码
- elantech触控板驱动程序 v13.6.11 官方最
- 联想y470无线网卡驱动 for 32位64位
- 松下plc FP-XH的驱动
- IMX385驱动代码.zip
- 组态王驱动开发包3.0.0.7(中文)
- 飞思卡尔单片机MC9S12XS12G128驱动(硬件
- CASS9.1最新S4数据及驱动+ET199数据及驱
- 带有死区延时的H桥直流电机驱动电路
- USB转串口驱动,FT232R驱动程序,最新
- 德卡D3读卡器测试程序驱动文件
- WinCE下CP210x的驱动程序
- 用DIO 做的I2C程式
- ubuntu9.10 可加载内核模块和字符设备驱
- MCGS触摸屏西门子s7_1200驱动
- FPGA在步进电机驱动上的应用实例及代
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- RA8806液晶驱动程序
- 内核驱动进程保护演示程序
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- 组态王中S7-300TCP驱动
- STC12C5A60S2 CH4521 驱动数码管 显示
- STM32F103 CC2500完整驱动(模拟SPI)
- I2C总线接口设计
- 430系列单片机USBFET下载驱动
- dell阵列卡驱动s100 s300 2008 R2.rar
- keil vcom windows 7 64bit 驱动
- windows ce 系统的GPIO驱动程序
- 2440 cs8900a 网卡驱动程序
评论
共有 条评论