导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→我的24C16A芯片读写不了,请指点一下,[newman0708]

 *第45187篇: 我的24C16A芯片读写不了,请指点一下,

  
楼 主:newman0708 2006年12月19日14:55
 我的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);
}

  
2楼:newman0708 2006年12月19日16:09
 我的24C16A芯片读写不了,请指点一下
我在本论坛问的问题好像一直都没人来回答呀,

好冷啊!

  
3楼:yi11111 2006年12月19日16:22
 同志协力
我也在写24CL16的程序,怎么都不对
我们可以讨论一下!
我QQ:15074535

>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:FTP下载和上传的账号和口令是什么呢?

[下一篇主题]:isp 下载线