资源简介
EEPROM是一种掉电后数据不丢失的存储器,常用来存储一些配置信息,以便系统重新上电的时候加载之。EEPROM芯片最常用的通讯方式是IIC协议。此代码为AT24C08的I2C驱动程序,其他型号可按照规格书自行扩展
代码片段和文件信息
#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
- 下一篇:软件系统设计文档模板
相关资源
- win10可用msp430驱动
- STM8L驱动lcd
- NI visa驱动器-版本14.0.1
- cass加密锁驱动
- MY1690-12P MP3解码模块应用程序含驱动程
- 戴尔R720 服务器2008 R2阵列卡驱动
- sht20驱动程序51
- CH340 、USB转串口驱动、Win10 64位,亲测
- 博世BMI160自写驱动
- CC2530单片机ADXL345的i2C程序
- DHT11驱动STC12C5A单片机
- 51开发板利用L298N驱动模块驱动电机进
- USB读写器驱动.zip
- 关于S32K系列驱动之----SPISDK开发分享
- STM32的DS3231时钟芯片驱动串口测试程序
- MOS驱动双电机.PcbDoc
- 开源云台电路图
- cs5530驱动程序
- 51单片机驱动K型热电偶数字转换器M
- 驱动级鼠标键盘模拟含最新WinIo资源及
- 新智捷刻字机驱动
- QN8035 FM 单芯片驱动
- IIC驱动程序
- 单片机驱动直流电机 proteus仿真+程序
- STM32F103单片机+ULN2003驱动直流电机
- DMD驱动板设计/FPGA
- 0.96寸OLED显示屏适配MSP430F5529
- 51驱动继电器相关电路
- stm32驱动si4463收发
- 240128lcd驱动程序
评论
共有 条评论