📄 at24c0x.txt
字号:
我用at24c02 .我的程序运行后,可读写;但是读出后发现每个字节都左移一位,且最低位为1。我推测两种可能:1、读错 2、写错。
经试验不可能是读错,但为什么会写错呢?(写地址是对的),还有其他可能吗?
****************************************************************************
#include <at892051.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define AddWr 0xae /*?÷?tμ??·?????°D′±ê??*/
#define AddRd 0xaf /*?÷?tμ??·?????°?á±ê??*/
/*óD1?è???±?á?*/
uchar bdata buffer;
sbit SDA = P3^5; /*′?DDêy?Y*/
sbit SCL = P3^4; /*′?DDê±?ó*/
sbit WP = P3^3; /*ó2?tD′±£?¤*/
sbit B7 = buffer^7;
sbit B6 = buffer^6;
sbit B5 = buffer^5;
sbit B4 = buffer^4;
sbit B3 = buffer^3;
sbit B2 = buffer^2;
sbit B1 = buffer^1;
sbit B0 = buffer^0;
//----------------------------------------------------------------
//?óê±9.8uS,11.0592M?§??±ê×??óê±3ìDò
//----------------------------------------------------------------
/*void delay_10uS(void)
{
uchar i;
for(i=0;i<1;i++);
}*/
//----------------------------------------------------------------
//?óê±5.4uS,11.0592M?§??±ê×??óê±3ìDò
//----------------------------------------------------------------
void delay_5uS(void)
{
_nop_();
}
//----------------------------------------------------------------
//?óê±joá??3ìDò,11.0592M?§??·?±ê×??óê±3ìDò
//----------------------------------------------------------------
void mS_Delay(uchar j)
{
uchar i;
while(j>0)
{
i = 0;
j--;
while(i<114) i++;
}
}
//----------------------------------------------------------------
/*·¢?í?eê?ì??t*/
//----------------------------------------------------------------
void Start_01(void) /*?eê?ì??t*/
{
do{
SDA=1;
SCL=1;
}while(!(SDA&&SCL)); //?ì2a×ü??ê?·??éó?
delay_5uS();
SDA=0;
delay_5uS();
SCL=0;
}
//----------------------------------------------------------------
/*í£?1ì??t*/
//----------------------------------------------------------------
void Stop_01(void)
{
SDA=0;
SCL=1;
delay_5uS();
SDA=1;
_nop_();
_nop_();
}
//----------------------------------------------------------------
//?ì2aó|′e??
//----------------------------------------------------------------
void Ack(void)
{
SCL=1;
_nop_();
_nop_();
while(SDA);
SCL=0;
}
//----------------------------------------------------------------
/*·′?òó|′e??*/
//----------------------------------------------------------------
void NoAck(void)
{
SDA=1;
delay_5uS();
SCL=1;
delay_5uS();
SCL=0;
}
//----------------------------------------------------------------
/*·¢?íêy?Y×ó3ìDò,Data?aòa?ó·¢?íμ?êy?Y*/
//----------------------------------------------------------------
void Send_01(void)
{
uchar i; /*??êy????*/
for(i=0;i<8;i++)
{
SDA = B7;
buffer = buffer<<1;
delay_5uS();
SCL=1;
delay_5uS();
SCL = 0;
}
SDA=1;
}
//-----------------------------------------------------------------------------
/*?áò???×??úμ?êy?Y,2¢·μ????×??ú?μ*/
//-----------------------------------------------------------------------------
void Read_01(void)
{
uchar i;
SDA=1;
for(i=0;i<8;i++)
{
buffer = buffer<<1;
SCL=1;
delay_5uS();
SCL=0;
_nop_();
_nop_();
B0 = SDA;
}
}
//----------------------------------------------------------------
//êy?Y?éD′è?£?′?μY2?êy£oêy?Y?éê×?·?¢D′è?μ??·?¢êy?Y?é3¤?è
//---------------------------------------------------------------
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
uchar data i;
uchar data *PData;
WP = 0;
PData=Data;
for(i=0;i<Num;i++)
{
Start_01(); /*·¢?í???ˉD?o?*/
buffer = AddWr;
Send_01(); /*?????÷?t*/
Ack();
buffer = Address+i;
Send_01(); /*·¢?íμ??·*/
Ack();
buffer = *(PData+i);
Send_01();
Ack();
Stop_01();
mS_Delay(15);
}
WP = 1;
}
//----------------------------------------------------------------
//êy?Y?é?á3?£?′?μY2?êy£oêy?Y?éê×?·?¢?á3?μ??·?¢êy?Y?é3¤?è
//---------------------------------------------------------------
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start_01();
buffer = AddWr;
Send_01();
Ack();
buffer = Address+i;
Send_01();
Ack();
Start_01();
buffer = AddRd;
Send_01();
Ack();
Read_01();
*(PData+i)= buffer;
NoAck();
Stop_01();
}
}
//-------------------------------------------
//′??ú·¢?í×ó3ìDò,ì??t£oTI=1,ES=0;
//---------------------------------------------
void ser_send(uchar a)
{
while(TI==0);
SBUF = a;
TI=0;
}
/*=============================================================================
*Name :SysInit
*Descripton :sysem initialization
*Status :Done
=============================================================================*/
void SysInit(void)
{
mS_Delay(1);
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD = 0x21; /* T01¤×÷óú·?ê?1,ê?áù???¨ê±?÷£?T11¤×÷óú·?ê?2 */
TH1 = 0xff; /* TH1: reload value for 1200 baud @ 16MHz */
TL1 = 0xff;
PCON = PCON|0x80;
TL0 = 0x3f;
TH0 = 0xfe;
TR1 = 1; /* TR1: timer 1 run */
//TR0 = 1; /* TR0: timer 0 run */
IE = 0x80;
P1 = 0X00;
}
void main()
{
uchar Number[50]={0};
uchar i;
SysInit();
WP= 1;
for(i=0;i<50;i++)
{
Number[i]=i;
}
WrToROM(Number,0,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
mS_Delay(20);
for(i=0;i<50;i++)
{
Number[i]=i+500;
}
WrToROM(Number,50,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
mS_Delay(20);
for(i=0;i<50;i++)
{
Number[i]=i+100;
}
WrToROM(Number,100,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
mS_Delay(20);
for(i=0;i<50;i++)
{
Number[i]=i+150;
}
WrToROM(Number,150,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
mS_Delay(20);
for(i=0;i<50;i++)
{
Number[i]=i+200;
}
WrToROM(Number,200,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
mS_Delay(20);
Number[0]=0;
Number[1]=0;
Number[2]=0;
Number[3]=0; /*??êy×é?Dμ??μ??μ?£?ò??é?¤?á3?μ?êyê?·??yè·*/
RdFromROM(Number,4,4);
for(i=0;i<255;i++)
{
RdFromROM(Number,i,1);
TI = 1;
ser_send(Number[0]);
}
WP= 1; //??AT24C01AD′±£?¤
while(1)
{
Start_01(); /*·¢?í???ˉD?o?*/
buffer = 0xaa;
Send_01(); /*?????÷?t*/
Ack();
Stop_01();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -