我的24C16A芯片读写不了,请指点一下,
下面是我的测试代码,
读和写都不行,不知道哪里出了问题。
#1 A0 接地
#2 A1 接地
#3 A2 接地
#4 GND 接地
#5 SDA P2^1
#6 SCL P2^0
#7 WP 接地
#8 VCC 5V
#include <reg52.h>
#include <intrins.h>
#define OP_WRITE 0xa0
#define OP_READ 0xa1
sbit SCL=P2^0;
sbit SDA=P2^1;
void delayms(unsigned char address);
/*-----------------------------------------------
调用方式:void start_bit(void)
函数说明:开始位
-----------------------------------------------*/
void start_bit(void)
{
SCL=1;_nop_();
SDA=1;_nop_();
SDA=0;_nop_();
SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:void stop_bit(void)
函数说明:停止位
-----------------------------------------------*/
void stop_bit(void)
{
SDA=0;_nop_();
SCL=1;_nop_();
SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:void mast_ack(void)
函数说明:主答函数
-----------------------------------------------*/
void mast_ack(void)
{
SCL=0;_nop_();
SDA=0;_nop_();
SCL=1;_nop_();
SCL=0;_nop_();
SDA=1;_nop_();
}
/*-----------------------------------------------
调用方式:void ack(void)
函数说明:应答函数
-----------------------------------------------*/
void ack(void)
{
SDA=1;
SCL=0;_nop_();
SCL=1;_nop_();
while(SDA){;}
SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:void no_ack(void)
函数说明:无需应答位,在读程序中用到
-----------------------------------------------*/
void no_ack(void)
{
SDA=1;_nop_();
SCL=1;_nop_();
SCL=0;_nop_();
}
/*-----------------------------------------------
调用方式:write_8bit(unsigned char ch)
函数说明:写一个字节(8位)数据
-----------------------------------------------*/
write_8bit(unsigned char ch)
{
unsigned char i=8;
SCL=0;_nop_();
while(i--)
{
SDA=(bit)(ch&0x80);_nop_();
ch < <=1;
SCL=1;_nop_();
SCL=0;_nop_();
}
}
/*----------------------------------------------
调用方式:unsigned char read24c16(unsigned int address)
函数说明:读24c16指定地址数据(字节读)
-----------------------------------------------*/
unsigned char read24c16(unsigned int address)
{
unsigned char page=(address/256) < <1;
unsigned char data rdata;
unsigned char i=8;
start_bit();
write_8bit(OP_WRITE|page);
ack();
write_8bit(address);
ack();//伪写
start_bit();
write_8bit(OP_READ|page);
ack();
while(i--)
{
rdata < <=1;
SCL=0;_nop_(); SCL=1;
_nop_();
if(SDA) rdata|=0x01;
}
no_ack();
stop_bit();
return(rdata);
}
/*-----------------------------------------------
调用方式:void write24c16(unsigned int address,unsigned char ddata)
函数说明:写数据到24c16的指定地址(字节写)
-----------------------------------------------*/
void write24c16(unsigned int address,unsigned char ddata)
{
unsigned char page=(address/256) < <1;
start_bit();
write_8bit(OP_WRITE|page);
ack();
write_8bit(address);
ack();
write_8bit(ddata);
ack();
stop_bit();
delayms(10);
}
/*-----------------------------------------------
调用方式:void page_wr(unsigned int firstw_ad,unsigned int counter,unsigned int data *firstr_ad)
函数说明:页面写函数,firstw_ad为写入字节单元的首地址,
*firstr-ad为被写入数据所在首地址指针
counter为写入数据字节数
-----------------------------------------------*/
void page_wr(unsigned int firstw_ad,unsigned int counter,unsigned char *firstr_ad)
{
unsigned char page=(firstw_ad/256) < <1;
unsigned char *ufirstr_ad;
ufirstr_ad=firstr_ad;
start_bit();
write_8bit(OP_WRITE|page);
ack();
write_8bit(firstw_ad);
ack();
while(counter--)
{
write_8bit(*ufirstr_ad);
ufirstr_ad++;
ack();
}
stop_bit();
delayms(10);
}
/*-----------------------------------------------
调用方式:void page_rd(unsigned int firstrd_ad,unsigned int count,unsigned int firstwr_ad)
函数说明:页面读函数,firstrd-ad为所读字节首地址,count为读字节数
*ufirstwr-ad为读出数据存储首地址指针
-----------------------------------------------*/
void page_rd(unsigned int firstrd_ad,unsigned int count,unsigned char *firstwr_ad)
{
unsigned char page=(firstrd_ad/256) < <1;
unsigned char j=8;
unsigned char *ufirstwr_ad;
ufirstwr_ad=firstwr_ad;
start_bit();
write_8bit(OP_WRITE|page);
ack();
write_8bit(firstrd_ad);
ack();
start_bit();
write_8bit(OP_READ|page);
ack();
while(count--)
{
unsigned char i=8;
while(i--)
{
(*ufirstwr_ad) < <=1;
SCL=0;_nop_();_nop_();SCL=1;
if(SDA) (*ufirstwr_ad)|=0x01;
}
ufirstwr_ad++;
mast_ack();
}
while(j--)
{
(*ufirstwr_ad) < <=1;
SCL=0;_nop_();_nop_();SCL=1;
if(SDA) (*ufirstwr_ad)|=0x01;
}
no_ack();
stop_bit();
}
void delayms(unsigned char address){
_nop_();
}
main()
{
unsigned char ch;
write24c16(0x0,'a'); //在24c16的0x0地址处,写入“a”这个字符
ch=read24c16(0x0); //读出0x600的内容
while(1);
}
发表时间:2006年12月19日14:55:43