导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[weigoat]菜鸟初次使用I2C总线.请大家请点!



No.65530
作者:weigoat
邮件:weigoat@sina.com
ID:25296
登陆:7次
文章数:3篇
最后登陆IP:221.4.230.146
最后登陆:2010/8/12 18:27:51
注册:2004/9/5 16:56:18
财富:128
发帖时间:2004/10/30 19:49:21
发贴者IP:218.18.28.154
标题:weigoat:菜鸟初次使用I2C总线.请大家请点!
摘要:No.65530菜鸟初次使用I2C总线.请大家请点! 我在用24C02时。读写操作,有时正确,有时不正确。搞不清什么原因。请各位帮忙分析下
我的程序。先谢谢各位。以下是程序:
#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;
    if(SDA==1)
    {
        SDA=0;  SomeNOP();
        SCL=0;  SomeNOP();
        SDA=1;
        return TRUE;
    }
    else
        return FALSE;
}
/*------------------------------------------*/
/*功能:停止总线
/*------------------------------------------*/
void StopI2C()
{
    SDA=0;    SomeNOP();
    SCL=1;    SomeNOP();
    SDA=1;    SomeNOP();
    SCL=0;

}
/*------------------------------------------*/
/*功能:单片机送应答位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;SomeNOP();

    if(SDA==1)
    {
        SCL=0;
        return FALSE;
    }
    else
    {
        SCL=0;
        return TRUE;
    }
}
/*------------------------------------------*/
/*功能:单片机写8位数据到总线
/*------------------------------------------*/
Write8Bit(unsigned char input)
{
    unsigned char temp;
    for(temp=8;temp!=0;temp--)
    {
        SCL=0;SomeNOP();
        SDA=(bit)(input&0x80);
        input=input  <  <1;
        SomeNOP();   
        SCL=1;
        SomeNOP();   
    }
    SCL=0;           
    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;  
        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  ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:7276毫秒 查询6次