佚名通过本文主要向大家介绍了pic24fj64ga306,时租卡读写器,时分秒的读写,读写人,rfid读写器等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:PIC24FJ64GA306读写24LC512其他时地址0x00-0x03的数据被修改
描述:
现象如下:
写完一个完整的数组到EEPROM后,增加相应的地址,又重新写入数据到新地址,一直循环,在第一次烧写的时候地址0x00-0x03的数据不会被修改,在第三次烧写数据的时候0x00-0x03的数据被就该,其值是数组中的四个数据,麻烦大家帮忙看看,卡这几天了。
代码如下:
unsigned char cC02Addr=0xA0;
unsigned char humidity_value_from_server[4];//数组用于存放读取EEPROM0x00-0x03的四个字节数据
unsigned char EEPROM_humidity_h_addr=0x00;//读取四个字节数据的高字节地址
unsigned char EEPROM_humidity_l_addr=0x00;//读取四个字节数据的低字节地址
unsigned char cMEM_h_w_addr=0x00;//不断写入数据的初始地址高字节
unsigned char cMEM_l_w_addr=0x0a;//不断写入数据的初始地址低字节
unsigned char return_data[71]={0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x47,0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70,0x71};
while(1)//循环写数据,并且写完后读取地址0x00的四个字节数据
{
xRead(cC02Addr,EEPROM_humidity_h_addr, EEPROM_humidity_l_addr,&humidity_value_from_server,sizeof(humidity_value_from_server));
_RB15=0;
Delay_N1ms(5);
xWrite(cC02Addr,cMEM_h_w_addr, cMEM_l_w_addr,&return_data,sizeof(return_data));//将该次测量数据存入EEROM
Delay_N1ms(5); //延时5ms
for(i=0;i<0x47;i++)
{
return_data[i]=0;
}
xRead(cC02Addr,cMEM_h_w_addr, cMEM_l_w_addr,&return_data,sizeof(return_data));
Delay_N1ms(5); //延时5ms
_RB15=1;
write_low_addr=cMEM_l_w_addr+0x47;
if(write_low_addr>255)
{
cMEM_l_w_addr=write_low_addr%256;
cMEM_h_w_addr=cMEM_h_w_addr+1;
}
else
cMEM_l_w_addr=write_low_addr;
}
函数代码:
void EEPROM_I2C_init()
{
_TRISB15=0;//EEPROM使能脚,输出0,使能EEPROM写使能,输出1禁止写入数据到EEPROM
_RB15=0;
I2C2BRG=0x27;//定义I2C的波特率,Fcy=Fosc/2,8M时钟频率,I2C时钟频率400K
I2C2CON=0x8000;//使能I2C1模块
EEPROM_return_flag=xWrite(cC02Addr,cMEM_h_w_addr, cMEM_l_w_addr,&cTXdata,sizeof(cTXdata));
Delay_N1ms(5); //延时5ms
EEPROM_return_flag = xRead(cC02Addr,cMEM_h_r_addr, cMEM_l_r_addr,&I2C_RXdata,sizeof(I2C_RXdata));
Delay_N1ms(5); //延时5ms
}
//写 24C02:ICaddr-IC地址, MEM_h_addr-单元高地址, MEM_l_addr-单元高地址,DataPtr-单元首址, Nbyte-字节数。
char xWrite( unsigned char ICaddr, unsigned char MEM_h_addr, unsigned char MEM_l_addr, unsigned char *DataPtr, unsigned char Nbyte)
{
char Flag; unsigned char xAddr;
I2C2CONbits.SEN = 1;
Delay_N1us(2); //起动总线
while(I2C2CONbits.SEN); //等待启动结束
xAddr=ICaddr; //xAddr等于EEPROM芯片地址
Flag=WriteI2C1( &xAddr,1 );//发送EEPROM地址
if( Flag !=0 )
return Flag; //出错返回
xAddr=MEM_h_addr ; //xAddr等于EEPROM写入数据的首地址的高字节
Flag=WriteI2C1(&xAddr ,1 );//发送待写入数据在EEPROM的首地址
if( Flag !=0 )
return Flag;
xAddr=MEM_l_addr ; //xAddr等于EEPROM写入数据的首地址的低字节
Flag=WriteI2C1(&xAddr ,1 );//发送待写入数据在EEPROM的首地址
if( Flag !=0 )
return Flag;
Flag=WriteI2C1( DataPtr,Nbyte );//往EEPROM写入数据
I2C2CONbits.PEN = 1; //产生停止信号
while(I2C2CONbits.PEN); //等待停止信号结束
return 0;
}
//写24C02: 指针data-待写数据的首地址,Nbyte-待写字节数.
//返回: 0-OK, -1-有总线冲突, -2-从器件无应答
char WriteI2C1(unsigned char *data, unsigned char NByte )
{
while(NByte!=0)
{
I2C2TRN = *data;
if(I2C2STATbits.IWCOL)
return -1; //有写冲突返回 &nbs
描述:
单片机 I2CEEPROM;
新手初次使用单片机烧写数据到EEPROM,在给EEPROM其他地址时写入数据时,地址0x00-0x03的数据被改变,请问是怎么回事呢?现象如下:
写完一个完整的数组到EEPROM后,增加相应的地址,又重新写入数据到新地址,一直循环,在第一次烧写的时候地址0x00-0x03的数据不会被修改,在第三次烧写数据的时候0x00-0x03的数据被就该,其值是数组中的四个数据,麻烦大家帮忙看看,卡这几天了。
代码如下:
unsigned char cC02Addr=0xA0;
unsigned char humidity_value_from_server[4];//数组用于存放读取EEPROM0x00-0x03的四个字节数据
unsigned char EEPROM_humidity_h_addr=0x00;//读取四个字节数据的高字节地址
unsigned char EEPROM_humidity_l_addr=0x00;//读取四个字节数据的低字节地址
unsigned char cMEM_h_w_addr=0x00;//不断写入数据的初始地址高字节
unsigned char cMEM_l_w_addr=0x0a;//不断写入数据的初始地址低字节
unsigned char return_data[71]={0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x47,0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70,0x71};
while(1)//循环写数据,并且写完后读取地址0x00的四个字节数据
{
xRead(cC02Addr,EEPROM_humidity_h_addr, EEPROM_humidity_l_addr,&humidity_value_from_server,sizeof(humidity_value_from_server));
_RB15=0;
Delay_N1ms(5);
xWrite(cC02Addr,cMEM_h_w_addr, cMEM_l_w_addr,&return_data,sizeof(return_data));//将该次测量数据存入EEROM
Delay_N1ms(5); //延时5ms
for(i=0;i<0x47;i++)
{
return_data[i]=0;
}
xRead(cC02Addr,cMEM_h_w_addr, cMEM_l_w_addr,&return_data,sizeof(return_data));
Delay_N1ms(5); //延时5ms
_RB15=1;
write_low_addr=cMEM_l_w_addr+0x47;
if(write_low_addr>255)
{
cMEM_l_w_addr=write_low_addr%256;
cMEM_h_w_addr=cMEM_h_w_addr+1;
}
else
cMEM_l_w_addr=write_low_addr;
}
函数代码:
void EEPROM_I2C_init()
{
_TRISB15=0;//EEPROM使能脚,输出0,使能EEPROM写使能,输出1禁止写入数据到EEPROM
_RB15=0;
I2C2BRG=0x27;//定义I2C的波特率,Fcy=Fosc/2,8M时钟频率,I2C时钟频率400K
I2C2CON=0x8000;//使能I2C1模块
EEPROM_return_flag=xWrite(cC02Addr,cMEM_h_w_addr, cMEM_l_w_addr,&cTXdata,sizeof(cTXdata));
Delay_N1ms(5); //延时5ms
EEPROM_return_flag = xRead(cC02Addr,cMEM_h_r_addr, cMEM_l_r_addr,&I2C_RXdata,sizeof(I2C_RXdata));
Delay_N1ms(5); //延时5ms
}
//写 24C02:ICaddr-IC地址, MEM_h_addr-单元高地址, MEM_l_addr-单元高地址,DataPtr-单元首址, Nbyte-字节数。
char xWrite( unsigned char ICaddr, unsigned char MEM_h_addr, unsigned char MEM_l_addr, unsigned char *DataPtr, unsigned char Nbyte)
{
char Flag; unsigned char xAddr;
I2C2CONbits.SEN = 1;
Delay_N1us(2); //起动总线
while(I2C2CONbits.SEN); //等待启动结束
xAddr=ICaddr; //xAddr等于EEPROM芯片地址
Flag=WriteI2C1( &xAddr,1 );//发送EEPROM地址
if( Flag !=0 )
return Flag; //出错返回
xAddr=MEM_h_addr ; //xAddr等于EEPROM写入数据的首地址的高字节
Flag=WriteI2C1(&xAddr ,1 );//发送待写入数据在EEPROM的首地址
if( Flag !=0 )
return Flag;
xAddr=MEM_l_addr ; //xAddr等于EEPROM写入数据的首地址的低字节
Flag=WriteI2C1(&xAddr ,1 );//发送待写入数据在EEPROM的首地址
if( Flag !=0 )
return Flag;
Flag=WriteI2C1( DataPtr,Nbyte );//往EEPROM写入数据
I2C2CONbits.PEN = 1; //产生停止信号
while(I2C2CONbits.PEN); //等待停止信号结束
return 0;
}
//写24C02: 指针data-待写数据的首地址,Nbyte-待写字节数.
//返回: 0-OK, -1-有总线冲突, -2-从器件无应答
char WriteI2C1(unsigned char *data, unsigned char NByte )
{
while(NByte!=0)
{
I2C2TRN = *data;
if(I2C2STATbits.IWCOL)
return -1; //有写冲突返回 &nbs