I2C对AT24C512存取

莫名其妙的虫子 2015-03-20 10:03:59
我在写I2C对AT24C512的操作。但是不知道为什么每次想从随机地址连续读取若干字节时,就只能接收到缓冲区偶数位上的数据。
如下图,

现在已经测出存储函数没问题了。。只有读取这块有这个问题。求各大神解答~代码略多。我贴在下边几个主要的,如果需要其他的跟我说。
这是接收部分的函数
void Memorizer_I2CRecieving()
{
if(Memorizer_Mode == 4)
{
if(Memorizer_ByteCount == Memorizer_RDByteSum) //如果是最后一个字节则清零字节计数器
{
I2C0CONCLR = 0x0C;
Memorizer_ByteCount = 0;
Memorizer_DataRWFinshSymbol = MEMORIZER_RWFINISH;
}
else
{
Memorizer_RecordNum[Memorizer_ByteCount] = I2C0DAT;
I2C0CONSET = 0x04;
I2C0CONCLR = 0x08;
Memorizer_ByteCount ++;
}
}
if(Memorizer_Mode == 5)
{
if(Memorizer_ByteCount == Memorizer_RDByteSum) //如果是最后一个字节则清零字节计数器
{
I2C0CONCLR = 0x0C;
Memorizer_ByteCount = 0;
Memorizer_DataRWFinshSymbol = MEMORIZER_RWFINISH;
}
else
{
SetBuf[Memorizer_ByteCount] = I2C0DAT;
I2C0CONSET = 0x04;
I2C0CONCLR = 0x08;
Memorizer_ByteCount ++;
}
Delay(2000);
}
if(Memorizer_Mode == 3) //如果是添加记录模式
{
char getbyte;
getbyte = I2C0DAT;
if(getbyte == 0x64)
Memorizer_SaveFlag = 1; //已经找到保存位置

I2C0CONCLR = 0x0C; //退出读操作
Memorizer_DataRWFinshSymbol = MEMORIZER_RWFINISH;
}
else if(Memorizer_Mode == 1 && Memorizer_LoadFlag == 0) //如果是读取记录模式
{
char getbyte;
getbyte = I2C0DAT;
if(getbyte != 0x64)
Memorizer_LoadFlag = 1; //已经找到保存位置

I2C0CONCLR = 0x0C; //退出读操作
Memorizer_DataRWFinshSymbol = MEMORIZER_RWFINISH;
}
else //如果是浏览模式
{
if(Memorizer_ByteCount == Memorizer_RDByteSum) //如果是最后一个字节则清零字节计数器
{
I2C0CONCLR = 0x0C;
Memorizer_ByteCount = 0;
Memorizer_DataRWFinshSymbol = MEMORIZER_RWFINISH;
}
else
{
Memorizer_DataBuf[Memorizer_ByteCount] = I2C0DAT;
I2C0CONSET = 0x04;
I2C0CONCLR = 0x08;
Memorizer_ByteCount ++;
}
Delay(2000);
}


void Memorizer_I2CStopRecieving() 
{
I2C0CONSET = 0x14;
I2C0CONCLR = 0x08;
}


void Memorizer_I2CISR()
{
unsigned int bak;
char I2CState;

bak = VICIntEnable; //备份当前VICIntEnable的值
VICIntEnClear = (1<<9); //禁止当前优先级中断及低优先级中断
VICVectAddr = 0x00; //清除中断逻辑,以便VIC可以响应更高优先级IRQ中断

I2CState = I2C0STAT; //获取I2C接口的状态值
I2C0CONCLR = 0x28; //清零I2C0CONSET的STA和SI位
switch(I2CState)
{
case 0x08:Memorizer_I2CMasterT_SendDeviceAdr();break;
case 0x10:Memorizer_I2CMasterR_SendDeviceAdr();break;

case 0x18:Memorizer_I2CWRFirstByte();break;
case 0x20:;break;
case 0x28:Memorizer_I2CSendByteAfterFirst();break;
case 0x30:Memorizer_I2CStopRecieving();break;
case 0x38:;break;

case 0x40:Memorizer_I2CReadyToRecieve();break;
case 0x48:;break;

case 0x50:Memorizer_I2CRecieving();break;
case 0x58:Memorizer_I2CStopRecieving();break;
}

VICIntEnable = bak;
}


void Memorizer_I2CReadyToRecieve()
{
I2C0CONSET = 0x04;
I2C0CONCLR = 0x08;
}
...全文
469 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你i2c 是怎么读取的
csdk401k 2015-05-25
  • 打赏
  • 举报
回复
我使用I2C读写AT24系列没问题,AT24C每一种型号的分页读写的长度不一样,你仔细看看datasheet。

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧