高级会员
- 积分
- 853
- 金钱
- 853
- 注册时间
- 2016-4-7
- 在线时间
- 151 小时
|
5金钱
最近在写一个24c02数据连续存储读取程序,基本上是正确的,但偶尔会有一个字节出错,用1602第一行显示写入到24c02的数据,第二行显示从24c02读出的数据,见下图,望大神指导一下,万分感谢
[mw_shl_code=applescript,true]#include<reg51.h>
#include<lcd.h>
#include<i2c.h>
unsigned char code a[1000] = "icannotbelieveit";
unsigned char b[50];
void Send_I2c(uchar cStart_Address,uchar cDate_Size,uchar *dat);
void Read_I2c(uchar cStart_Address,uchar cDate_Size,uchar *dat);
void main(void)
{
unsigned int i;
lcd_init();
lcd_writecom(0x80+0x00);
for(i=0;i<16;i++)
lcd_writedata(*(a+i));
Send_I2c(0xaa,17,a);
Read_I2c(0xaa,17,b);
lcd_writecom(0x80+0x40);
for(i=0;i<16;i++)
lcd_writedata(*(b+i));
while(1)
{
P1 = 0;
delay1ms(255);
P1 = 1;
delay1ms(255);
}
}
/***********************Send_I2c***********************
** Function: send data to 24c02
** cStart_Address: 信息在24c02中存储的起始地址
** cDate_Size: 数据的大小(字节数)
** *dat: 待发送的数据指针
** Note: 24c02一次最多写入一页的数据(8字节)
*************************End**************************/
void Send_I2c(uchar cStart_Address,uchar cDate_Size,uchar *dat)
{
uchar i,cDate_Size1,cDate_Size2; //cDate_Size1为写入的最大页数,cDate_Size2为余数部分
uint j,count=0;
cDate_Size1 = cDate_Size/8; //8字节一页
cDate_Size2 = cDate_Size%8;
for(j=0;j<cDate_Size1;j++)
{
I2C_Start();
I2C_SendByte(0xa0, 1);//发送写器件地址
I2C_SendByte((cStart_Address+j*8), 1);//发送要写入内存地址
for(i=0;i<8;i++)
{
I2C_SendByte(*(dat+count), 0); //发送数据
count++;
delay1ms(5);
}
I2C_Stop();
delay1ms(5); //此处延时非常重要,至少5ms,否则下一个字节的数据可能写不进去
}
// delay1ms(1);
if(cDate_Size2!=0)
{
I2C_Start();
I2C_SendByte(0xa0, 1);//发送写器件地址
I2C_SendByte((cStart_Address+cDate_Size1*8), 1);//发送要写入内存地址
for(i=0;i<cDate_Size2;i++)
{
I2C_SendByte(*(dat+8*cDate_Size1-1), 0); //发送数据
// delay1ms(1);
}
I2C_Stop();
delay1ms(5);
}
}
/***********************Read_I2c***********************
** Function: read data from 24c02
** cStart_Address: 数据在24c02中存储的起始地址
** cDate_Size: 数据的大小(字节数)
** *dat: 数据被读出来后的存储指针
** Note: 24c02读数据只需给出起始地址就可以
在整个存储空间内读取任意长度,没有页的概念
*************************End**************************/
void Read_I2c(uchar cStart_Address,uchar cDate_Size,uchar *dat)
{
uchar i;
I2C_Start();
I2C_SendByte(0xa0, 1); //发送写器件地址
I2C_SendByte(cStart_Address, 1); //发送要读取的地址
I2C_Start();
I2C_SendByte(0xa1, 1); //发送读器件地址
for(i=0;i<cDate_Size;i++)
{
*(dat+i)=I2C_ReadByte(); //读取数据
if(i==(cDate_Size-1))
Send_Not_Ack(); //最后的一个数据,不需要应答信号了
else
Send_Ack(); //单片机作应答,24c02只有检测到应答信号才会把内部地址存储器
//自动加一指向下一个单元
delay1ms(1);
}
I2C_Stop();
delay1ms(5);
}[/mw_shl_code]
|
|