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

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

   newman0708 
newman0708发表的帖子 

 我的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

  
回复该帖

本主题共有 3 帖,分页:>>>>>该主题的所有内容[3]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  100798.[详细]我的24C16A芯片读写不了,请指点一下
摘要:我在本论坛问的问题好像一直都没人来回答呀,  好冷啊!......(54字)
- [newman0708][1013次] 2006年12月19日

  100799.[详细]同志协力
摘要:我也在写24CL16的程序,怎么都不对 我们可以讨论一下! 我QQ:15074535 ......(69字)
- [yi11111][746次] 2006年12月19日

[上一篇帖子]:FTP下载和上传的账号和口令是什么呢?和论坛的账号、口令是一样的么?怎么登陆不上去,哪里有FTP的说
[下一篇帖子]:一一GPS发送数据的位宽是10位的,tmod应该设定为0x58,我已经改了,还是不行,protues