我在用51 向24C04读写。遇到了问题,就是在读写地址 0xff 以后的 就超过8位地址了。要怎样读取0xff 地址以后的数据呢?
由于24C04是4Kbit的容量,所以换算成字节有512个字节,而我们在操作的时候地址只有八位,从00到FF,一共256个,
所以如果只靠这一个字节是读写不完的,而且我看了下芯片资料 也没有B0这个引脚,所以没有分页之说咯?
那FF后面的地址我要怎么处理呢?
刚接触EEPROM 还不是很懂。请指教!谢谢了!
程序如下:
//----------------------------------------24C04.c-------------------------------------------------------
// 24C04 IIC 读/写程序
//------------------------------------------------------------------------------------------------------
void Start()
{
SDA = 1; SCL = 1; Delay4us(); SDA = 0; Delay4us(); SCL = 0;
}
//IIC停止
void Stop()
{
SDA = 0; SCL = 0; Delay4us(); SCL = 1; Delay4us(); SDA = 1;
}
//IIC总线初始化
void IIC_24C04_Init()
{
SCL = 0; Stop();
}
//发送应答信号
void ACK()
{
SDA = 0; SCL = 1; Delay4us(); SCL = 0; SDA = 1;
}
//读取应答
void RACK()
{
SDA = 1; Delay4us(); SCL = 1; Delay4us(); SCL = 0;
}
//发送非应答信号
void NO_ACK()
{
SDA = 1; SCL = 1; Delay4us(); SCL = 0; SDA = 0;
}
//从24C04中读一字节
uchar RecByte()
{
uchar i,d;
d = 0x00;
SDA = 1;
for(i = 0; i < 8; i++)
{
SCL = 1; d <<= 1; d |= SDA; Delay4us(); SCL = 0; Delay4us();
}
SCL = 0;
Delay4us();
return d;
}
//向24C04中写一字节
uchar SendByte(uchar wd)
{
uchar i;
bit ack0;
for(i = 0; i < 8; i++) //循环移入8位
{
SDA = (bit)(wd & 0x80);
_nop_(); _nop_();SCL = 1; Delay4us(); SCL = 0; wd <<= 1;
}
Delay4us(); //释放总线并准备读取应答
SDA = 1;
SCL = 1;
Delay4us();
ack0 = !SDA; //0表示无应答
SCL = 0;
Delay4us();
return ack0; //返回应答
}
//发送多字节数据函数
uchar SendString(uchar Slave, uchar Subaddr, uchar *Buffer, uchar N)
{
uchar i;
Start();
if(!SendByte(Slave)) return 0; //发送器件地址
if(!SendByte(Subaddr)) return 0; //发送器件子地址
for(i = 0; i < N; i++)
{
if(!SendByte(Buffer
)) return 0; //发送数据
}
Stop();
return 1;
}
//接受多字节数据函数
uchar RecString(uchar Slave, uchar Subaddr,uchar * Buffer,uchar N)
{
uchar i;
Start();
if(!SendByte(Slave)) return 0; //发送器件地址
if(!SendByte(Subaddr)) return 0; //发送器件子地址
Start();
if(!SendByte(Slave + 1)) return 0; //器件地址,读操作
for(i = 0;i < N-1; i++)
{
Buffer = RecByte(); //接收数据
ACK(); //发送应答位
}
Buffer[N-1] = RecByte(); //接收最后一位
NO_ACK(); //发送非应答位
Stop();
return 1;
}
//向24C04中写一字节
void Write_A_Byte(uchar byte)
{
uchar i;
for(i = 0; i < 8; i++) //循环移入8位
{
byte <<= 1; SDA = CY; _nop_();SCL = 1; Delay4us(); SCL = 0;
}
RACK(); //读取应答
}
//从24C04中读一字节
uchar Receive_A_Byte()
{
uchar i,d;
for(i = 0; i < 8; i++)
{
SCL = 1; d <<= 1; d |= SDA; SCL = 0;
}
return d;
}
//任意地址写数据
void Write_Random_Address_Byte(uchar addr, uchar dat)
{
Start();
Write_A_Byte(0xa8); Write_A_Byte(addr); Write_A_Byte(dat);
Stop();
DelayMS(10);
}
//当前地址读数据
uchar Read_Current_Address_Data()
{
uchar dat;
Start();
Write_A_Byte(0xa9); dat = Receive_A_Byte(); NO_ACK();
Stop();
return dat;
}
//任意地址读取数据
uchar Random_Read(uchar addr)
{
Start();
Write_A_Byte(0xa8); Write_A_Byte(addr);
Stop();
return Read_Current_Address_Data();
}
[
本帖最后由 米兰的小工匠 于 2011-8-10 14:14 编辑 ]
此帖出自
小平头技术问答
一周热门 更多>