随便说说,没有原则性错误
改了一点(phh528@vip.sina.com.cn)
#include <reg51.h>
#include <intrins.h>
#define TRUE 0
#define FALSE 1
#define uchar unsigned char
#define WriteCMD 0xa0
#define ReadCMD 0xa1
#define SomeNOP(); _nop_();_nop_();_nop_();_nop_();_nop_();
sbit SDA=P1^0;
sbit SCL=P1^1;
sbit WP=P1^2;
void DelayMs(unsigned int t)
{
uchar temp;
while(t--)
{
for(temp=125;temp> 0;temp--);
}
}
/*------------------------------------------*/
/*功能:启动总线
/*------------------------------------------*/
bit StartI2C()
{
SDA=1;
SCL=1;
SomeNOP();
if(SCL==1)
{
SDA=0; SomeNOP();
SCL=0; SomeNOP();
return TRUE;
}
else
return FALSE;
}
/*------------------------------------------*/
/*功能:停止总线
/*------------------------------------------*/
void StopI2C()
{
SDA=0; SomeNOP();
SCL=1; SomeNOP();
SDA=1; SomeNOP();
}
/*------------------------------------------*/
/*功能:单片机送应答位0
/*------------------------------------------*/
void Ack()
{
SDA=0; SomeNOP();
SCL=1; SomeNOP();
SCL=0; SomeNOP();
}
/*------------------------------------------*/
/*功能:单片机送不应答位1
/*------------------------------------------*/
void NoAck()
{
SDA=1; SomeNOP();
SCL=1; SomeNOP();
SCL=0; SomeNOP();
}
/*------------------------------------------*/
/*功能:等待24c02送应答位0
/*------------------------------------------*/
bit WaittAck()
{
unsigned char errtime=255;
SDA=1;SomeNOP();
SCL=1;
if(SDA==1)
{
SomeNOP();
SCL=0;
return FALSE;
}
else
{
SomeNOP();
SCL=0;
return TRUE;
}
}
/*------------------------------------------*/
/*功能:单片机写8位数据到总线
/*------------------------------------------*/
Write8Bit(unsigned char input)
{
unsigned char temp;
for(temp=8;temp!=0;temp--)
{
SDA=(bit)(input&0x80);
input=input < <1;
SomeNOP();
SCL=1;
SomeNOP();
SCL=0;SomeNOP();
}
DelayMs(10);
}
/*------------------------------------------*/
/*功能:写一个字节到24c02某一单元
/*------------------------------------------*/
void Write_One_Byte(unsigned char addr,unsigned char thedata)
{
StartI2C() ;
Write8Bit(WriteCMD);
WaittAck();
Write8Bit(addr);/*address*/
WaittAck();
Write8Bit(thedata);/*thedata*/
WaittAck();
StopI2C();
DelayMs(50);
}
/*------------------------------------------*/
/*功能:连续写多个字节到24c02某连续单元
/*------------------------------------------*/
void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char
number)
{
StartI2C();
Write8Bit(WriteCMD);
WaittAck();
Write8Bit(RomAddress);
WaittAck();
for(;number!=0;number--)
{
Write8Bit(*Wdata);
WaittAck();
Wdata++;
}
StopI2C();
DelayMs(50);
}
/*------------------------------------------*/
/*功能:从总线读8位数据
/*------------------------------------------*/
unsigned char Read8Bit()
{
unsigned char temp,rbyte=0;
SDA=1;
for(temp=8;temp!=0;temp--)
{
SCL=1;
SomeNOP();
rbyte=rbyte < <1;
rbyte=rbyte|((unsigned char)(SDA));
SCL=0;
SomeNOP();
}
return(rbyte);
}
/*------------------------------------------*/
/*功能:从24c02某单元读一个字节
/*------------------------------------------*/
unsigned char Read_One_Byte(unsigned char addr)
{
bit acktemp=1;
char mydata;
StartI2C();
Write8Bit(WriteCMD);
WaittAck();
Write8Bit(addr);
WaittAck();
StartI2C();
Write8Bit(ReadCMD);
WaittAck();
mydata=Read8Bit();
NoAck();
StopI2C();
DelayMs(20);
return mydata;
}
/*------------------------------------------*/
/*功能:从24c02某连续单元读多个字节
/*------------------------------------------*/
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char
bytes)
{
StartI2C();
Write8Bit(WriteCMD);
WaittAck();
Write8Bit(RomAddress);
WaittAck();
StartI2C();
Write8Bit(ReadCMD);
WaittAck();
while(bytes)
{
*RamAddress=Read8Bit();
Ack();
RamAddress++;
bytes--;
}
NoAck();
StopI2C();
}
/*************************************************/
/*******************以下为主函数******************/
/*************************************************/
void main()
{
unsigned int i;
unsigned char myarray1[8];
unsigned char myarray2[8];
unsigned char myarray3[8];
unsigned char myarray4[8];
unsigned char rdarray1[8];
unsigned char rdarray2[8];
unsigned char rdarray3[8];
unsigned char rdarray4[8];
unsigned char thedata1,thedata3,thedata4,thedata5;
unsigned char thedata6;
unsigned char thedata7;
unsigned char thedata8;
for(i=0;i <8;i++)
{
myarray1[i]=i;
myarray2[i]=i+10;
myarray3[i]=i+20;
myarray4[i]=i+30;
}
/*************************************************/
/**************以下单字节读写都正常***************/
/*************************************************/
WP=0;
DelayMs(10);
Write_One_Byte(0x10,3);
thedata1=Read_One_Byte(0x10);
Write_One_Byte(0x11,4);
thedata3=Read_One_Byte(0x11);
Write_One_Byte(0x13,6);
thedata4=Read_One_Byte(0x13);
Write_One_Byte(0x14,7);
Write_One_Byte(0x15,8);
Write_One_Byte(0x16,9);
Write_One_Byte(0x17,10);
thedata5=Read_One_Byte(0x14);
thedata6=Read_One_Byte(0x15);
thedata7=Read_One_Byte(0x16);
thedata8=Read_One_Byte(0x17);
/*************************************************/
/************以下多字节读写都正常*****************/
/*************************************************/
Write24c02(myarray1,0x20,8);
Read24c02(rdarray1,0x20,8);
Write24c02(myarray2,0x30,8);
Read24c02(rdarray2,0x30,8);
/*************************************************/
/*下面读写函数不正常
//===============================================//
/*写进去的数与读出来的数据不一致
/*在读操作中,最后执行不应答(NoAck()函数)时,给SDA送
/*1后,SDA仍然为0;执行停止操作(Stop()函数)时,给SDA
/*送1后,SDA仍然为0.
/*************************************************/
Write24c02(myarray3,0x40,8);
Read24c02(rdarray3,0x40,8);
/*************************************************/
/*下面写函数应答不正常,但读出来数据正确
//===============================================//
/*在等待24C02应答(WaitAck()函数)时,
/*给SDA送1后,SDA仍然为1;一直无应答信号;
/*************************************************/
Write24c02(myarray4,0x50,8);
Read24c02(rdarray4,0x50,8);
/*************************************************/
/******************清除数组数值*******************/
/*************************************************/
for(i=0;i <8;i++)
{
rdarray1[i]=0;
rdarray2[i]=0;
rdarray3[i]=0;
rdarray4[i]=0;
}
/*************************************************/
/*连续写几组数据,读出来的数据与写进去的不一致
/*************************************************/
Write24c02(myarray1,0x60,8);
DelayMs(10);
Write24c02(myarray2,0x70,8);
DelayMs(10);
Write24c02(myarray3,0x80,8);
DelayMs(20);
Write24c02(myarray4,0x90,8);
/*************************************************/
/*****************读出数据不正确******************/
/*************************************************/
Read24c02(rdarray1,0x60,8);
DelayMs(20);
/*************************************************/
/***************以下读出数据均正确****************/
/*************************************************/
Read24c02(rdarray2,0x70,8);
DelayMs(20);
Read24c02(rdarray3,0x80,8);
DelayMs(20);
Read24c02(rdarray4,0x90,8);
///////////////////////////////////////////////////
while(1);
}
发表时间:2004年10月30日20:21:29