我的24C02和PCF8563挂在同一条51单片机模拟出来的I2C总线上,SDA和SCL也使用了外接上拉电阻(5K6).单片机可以正常读写PCF8563,但就是不能写24C02..但貌似可以读24C02,问题出在哪里啊???请高手指点下...
24C02的A2-A0接地,WP也接地了...器件地址使用0xa0(写),0xa1(读),文件包含PCF8563.H,而I2C.H文件包含在PCF8563中
与24C02相关的函数如下:
#include
/******************************************************
功能:写24C02一个数据
参数:存储地址(0-255),待写入的数据字节
*******************************************************/
void Write24c02_Byte(unsigned char addr,unsigned char wdata)
{
Start(); //启动I2C总线
WriteByte(ADDR_EP_W); //24C02写地址
WriteByte(addr); //存放地址
WriteByte(wdata); //数据
Stop(); //关闭I2C总线
}
/*******************************************************
功能:读24C02一个字节数据
参数:存储器地址(0-255)
*******************************************************/
unsigned char Read24c02_Byte(unsigned char addr)
{
unsigned char temp;
Start();
WriteByte(ADDR_EP_W); //发送24C02写地址
WriteByte(addr); //待读取内容所在的地址
Start(); //启动I2C总线
WriteByte(ADDR_EP_R); //发送24C02读地址
temp = ReadByte(); //读字节
WriteACK(1); //发送非应答位
Stop(); //关闭I2C总线
return temp; //返回数据字节
}
==========pcf8563.h中包括i2c.h文件=============================================
#include "I2C.H"
(.....略)
==============================
=================I2C.H===================
#include
#include
/*定义端口线*/
sbit SDA=P1^4;
sbit SCL=P1^3;
/********************************************
内部函数,延时1
功能:根据单片机的晶振频率制定延时时间
********************************************/
void DD()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************************************
内部函数,I2C开始
********************************************/
void Start()
{
EA=0;
SDA=1;
SCL=1;
DD();
SDA=0;
DD();
SCL=0;
}
/********************************************
内部函数,I2C结束
********************************************/
void Stop()
{
SDA=0;
SCL=0;
DD();
SCL=1;
DD();
SDA=1;
DD();
EA=1;
}
/********************************************
内部函数,输出ACK.每个字节传输完成,输出ack=0,结束读数据,ack=1;
********************************************/
void WriteACK(unsigned char ack)
{
SDA=ack;
DD();
SCL=1;
DD();
SCL=0;
}
/********************************************
功能:发送非应答位
内部函数,输出NoACK.
********************************************/
void WriteNoACK()
{
SCL = 0;
_nop_();
SDA = 1;
_nop_();
SCL = 1;
_nop_();
SCL = 0;
}
/********************************************
内部函数,等待ACK
********************************************/
void WaitACK()
{
unsigned char errtime=20;
SDA=1; //SDA线置输入状态
DD(); //读ACK
SCL=1;
DD();
while(SDA)
{
errtime--;
if(!errtime) Stop();
}
SCL=0;
DD();
}
/****************************************************************
功能:应答I2C总线检查 *
参数:无 *
返回:1 有ACK信号 0 无ACK信号 *
****************************************************************/
bit CheckAck() //
{
bit ack_flag;
SDA=1; //置输入状态
DD();
SCL=1;
DD();
if(SDA==0)
{
ack_flag=1;
}
else
{
ack_flag=0;
}
SCL=0;
return ack_flag;
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void WriteByte(unsigned char wdata)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(wdata&0x80) SDA=1;
else SDA=0;
wdata<<=1;
SCL=1;
DD();
SCL=0;
}
WaitACK(); //I2C器件或通讯出错,将会退出I2C通讯
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
unsigned char ReadByte()
{
unsigned char i,bytedata;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
bytedata<<=1;
bytedata|=SDA;
SCL=0;
DD();
}
return(bytedata);
}