资源简介
at24c1024驱动函数,解开屏蔽即可测试。
代码片段和文件信息
/************************************
eeprom:at24c1024 128kBytewp接地。
XUXING 2011.7.13
************************************/
#include
#include “delay.h“
#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long
//用单片机模拟iic
sbit iic_sda=P1^2;
sbit iic_scl=P1^1;
/***********************************
iic开始传送函数,在scl是高电平且恢复
低电平之前sda由高电平变为低电平
************************************/
void iic_start(void)
{
iic_sda=1;
iic_scl=1;
iic_sda=0;
iic_scl=0;
}
/*******************************************
停止传送函数
********************************************/
void iic_stop()
{
iic_scl=0;
iic_sda=0;
iic_scl=1;
iic_sda=1;
}
/********************************************
发送确认(应答)信号 ,即在第九个串行上升沿时
将sda置低电平
void iic_ack()
{
delay_n_us(10);
iic_sda =0;
delay_n_us(10);
iic_scl=1;
delay_n_us(10);
iic_scl=0;
delay_n_us(10);
}
*********************************************/
/************************************************
非应答
*************************************************/
void iic_nack()
{
iic_sda=1;
iic_scl=1;
iic_scl=0;
;
}
/*******************************************
发送一个字节形参d为要发送的数据。
mcu向eeprom 写数据的时候首先传送数据
则调用该函数
********************************************/
bit iic_send_byte(uint8 d)
{
uint8 i=8;
bit bit_ack;
while(i--)
{
if(d&0x80)
iic_sda=1;
else
iic_sda=0; //最高有效位先发送,直至最低有效位
iic_scl=1;
iic_scl=0;
d<<=1;
}
// test ack
iic_sda=1;
iic_scl=1;
bit_ack=iic_sda;
iic_scl=0;
return bit_ack; // 本段程序时用于检测是否ack的状态
}
/***********************************************
接收一个八位数据 ,当单片机接收eeprom传来的数据时,
则调用该函数
***********************************************/
uint8 iic_receive_byte(void)
{
uint8 i=8d;
iic_sda=1;
while(i--)
{
d<<=1;
iic_scl=1;
if(iic_sda)
d++;
iic_scl=0;
}
return d;
}
/***********************************************
写eeprom操作,输入参量为单片机内部存储单元,
还有eeprom的地址, unsigned int count 数据串的长度
如果单片机存储的数据的地址为data ,要向eeprom的0x30写数据
数据串长度为10 ,则调用 at24c1024_write(data0x3010)
从单片机想eeprom中连续写n个字节数据
************************************************/
void at24c1024_write(uint8* mcu_addrbit addr_p0uint16 *at24c1024_addruint8 count)
{
while(count--)
{
iic_start();
if(addr_p0==1)
{
iic_send_byte(0xa2);
}
else
{
iic_send_byte(0xa0);
}
iic_send_byte(*at2
评论
共有 条评论