导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→随便说说,没有原则性错误

* 65533: 菜鸟初次使用I2C总线.请大家请点!

   phh528 
phh528发表的帖子 

 随便说说,没有原则性错误
改了一点(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

  
回复该帖

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

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

  65534.[详细]非常感谢phh528!
摘要:请问是不是就少了延时.所以24C02不是很忙的时,读写就正常.若忙时,又没延时,所以,24C02就无就应答了.就不理采单片机的"启动","停止","等待应答"等命令了. ......(188字)
- [weigoat][924次] 2004年10月30日

[上一篇帖子]:非常感谢phh528!请问是不是就少了延时.所以24C02不是很忙的时,读写就正常.若忙时,又没延时
[下一篇帖子]:[灌水]哥们,自己做的吗?卖多少人民币?用的什么片子???做到什么程度了?文件架多级嵌套做了吗?