打印

实用的程序 --- IIC(全型号读取写入)

[复制链接]
1715|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雁舞白沙|  楼主 | 2007-2-1 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
作者:雁舞白沙

声明:未经本人同意禁止任何形式的转载

信箱:buaijun@yahoo.com.cn

博客:redbug.21ic.org

更多程序请参见博客...

#include <REG932.h>
#include <Define.h>
#include <Stdio.h>
#include <Intrins.h>
//起始信号
//延时等候
void IicWait(void)
{
    _nop_();//01
    _nop_();//02
    _nop_();//03
    _nop_();//04
    _nop_();//05
    _nop_();//06
    _nop_();//07
    _nop_();//08
    _nop_();//09
    _nop_();//10
    _nop_();//11
    _nop_();//12
    _nop_();//13
    _nop_();//14
    _nop_();//15
    _nop_();//16
    _nop_();//17
    _nop_();//18
    _nop_();//19
    _nop_();//20
    _nop_();//21
    _nop_();//22
    _nop_();//23
    _nop_();//24
    _nop_();//25
}
void IicStart(void)                                                        
{
    IicSda=1;
    IicWait();
    IicScl=1;
    IicWait();
    IicSda=0;
    IicWait();
    IicScl=0;
    IicWait();
}
//停止信号
void IicStop(void)                                                        
{
    IicSda=0;
    IicWait();
    IicScl=1;
    IicWait();                                                        
    IicSda=1;
    IicWait();
}

//应答信号
void SendAcknowledge(bit ack)                                                
{
    IicSda=ack;
    IicScl=1;
    IicWait();
    IicScl=0;
    IicWait();
}             
//从slave端读取一个数据*/
unsigned char IicReceiveByte(void)
{
    unsigned char data i;
    unsigned char data bytedata=0;
    IicSda=1;
    for(i=0;i<8;i++)
    {
        IicScl=1;
        IicWait();
        bytedata<<=1;
        if (IicSda) bytedata |=0x01;
        IicScl=0;
        IicWait();
    }
    return bytedata;
}
//传送一个 Byte 数据到 slave */
bit IicSentByte(unsigned char DataByte)                                    
{
    unsigned char data i;
    bit ack;
    for(i=0;i<8;i++)
    {
        if(DataByte & 0x80)
        {
            IicSda=1;
        }
        else
        {
            IicSda=0;
        }
        DataByte <<=1;
        IicWait();
        IicScl=1;
        IicWait();
        IicScl=0;
        IicWait();
    }
    IicSda=1;
    IicWait();
    IicScl=1;
    IicWait();
    ack=IicSda;
    IicScl=0;
    IicWait();
    return ack;
}

unsigned char FgTimeout;
//无扇区读---单字节
//读取指定器件无扇区指定地址单字节的数据
//Device=器件地址---单字节
//DataAdd=字节地址---单字节
unsigned char IicByteRead(unsigned char Device,unsigned char DataAdd)      
{
    unsigned char data bytedata;
    EA=0;
    IicStart();
    IicSentByte(Device);
    IicSentByte(DataAdd);
    IicStart();
    IicSentByte(Device|0x01);
    bytedata=IicReceiveByte();
    SendAcknowledge(1);
    IicStop();
    EA=1;
      return bytedata;
}
//无扇区读---多字节
//读取指定器件无扇区指定地址多字节数据到指定地址
//Device=器件地址---单字节 
//DataAdd=字节地址---单字节
void IicMuchByteRead(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char data i;
    EA=0;
    IicStart();
    IicSentByte(Device);
    IicSentByte(DataAdd);
    IicStart();
    IicSentByte(Device|0x01);
    for(i=0;i<DataLend-1;i++)
    {
        *DataDptr=IicReceiveByte();
        DataDptr++;
        SendAcknowledge(0);
    }
    *DataDptr=IicReceiveByte();
    SendAcknowledge(1);
    IicStop();
    EA=1;
}
/*
//有扇区读---单字节
//读取指定器件有扇区指定地址中单字节的数据
//Device=器件地址---单字节 
//DataPage=扇区地址---单字节 
//DataAdd=字节地址---双字节)
unsigned char IicPageByteRead(unsigned char Device,unsigned char DataPage,unsigned char DataAdd)
{
    unsigned char data bytedata;
    ET1=0;
    IicStart();
    IicSentByte(Device);
    IicSentByte(DataPage);
    IicSentByte(DataAdd);
    IicStart();
    IicSentByte(Device|0x01);
    bytedata=IicReceiveByte();
    SendAcknowledge(1);
    IicStop();
    ET1=1;
      return bytedata;
}
//有扇区读---多字节
//读取指定器件有扇区指定地址中的多字节数据
//Device=器件地址---单字节 
//DataPage=扇区地址---单字节 
//DataAdd=字节地址---双字节)
void IicPageMuchByteRead(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned char DataLend)           //读取指定器件指定地址中的数据
{
    unsigned char i;
    ET1=0;
    IicStart();
    IicSentByte(Device);
    IicSentByte(DataPage);
    IicSentByte(DataAdd);
    IicStart();
    IicSentByte(Device|0x01);
    for(i=0;i<DataLend-1;i++)
    {
        IIcBuf=IicReceiveByte();
        SendAcknowledge(0);
    }
    IIcBuf=IicReceiveByte();
    SendAcknowledge(1);
    IicStop();
    ET1=1;
}
*/
//无扇区写---单字节
//写入指定器件无扇区指定地址中的单字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
void IicByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char DataByte)
{
    unsigned char data i;
    bit ack;
    EA=0;
    IicWp=0;
    Delay(50);
    for(i=0;i<3;i++)
    {
        IicStart();
        ack=IicSentByte(Device);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataByte);if(ack==1){IicStop();continue;}
        IicStop();
        if(ack==0)break;
    }
    IicWp=1;
    EA=1;
    Delay(500);
}
//无扇区写---多字节
//写入指定器件无扇区指定地址中的多字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
//DataByte=被存放数据的地址
//DataLend=被存放数据的长度
void IicMuchByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)
{
    unsigned char data i,j;
    bit ack;
    EA=0;
    IicWp=0;
    for(i=0;i<3;i++)
    {
        IicStart();
        ack=IicSentByte(Device);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}
        for(j=0;j<DataLend;j++)
        {
            ack=IicSentByte(*DataDptr);if(ack==1){IicStop();continue;} 
            DataDptr++;
        }
        IicStop();
        if(ack==0)break;
    }
    IicWp=1;
    EA=1;
    Delay(500);
}
/*
//有扇区写---单字节
//写入指定器件有扇区指定地址中的单字节数据
//Device=器件地址---单字节
//DataPage=扇区地址---单字节
//DataAdd=字节地址---双字节
void IicPageByteWrite(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned char DataByte)
{
    unsigned char data i;
    bit ack;
    ET1=0;
    FgTimeout=1;
    IicWp=0;
    for(i=0;i<3;i++)
    {
        IicStart();
        ack=IicSentByte(Device);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataPage);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataByte); if(ack==1){IicStop();continue;}
        IicStop();
        FgTimeout=0;
        if(ack==0)break;
    }
    Delay(50);
    IicWp=1;
    ET1=1;
}  
//有扇区写---多字节
//写入指定器件有扇区指定地址中的多字节数据
//Device=器件地址---单字节
//DataPage=扇区地址---单字节
//DataAdd=字节地址---双字节
//DataByte=被存放数据的地址
//DataLend=被存放数据的长度
void IicPageMuchByteWrite(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned int *DataDptr,unsigned char DataLend)
{
    unsigned char data i,j;
    bit ack;
    ET1=0;
    FgTimeout=1;
    IicWp=0;
    for(i=0;i<3;i++)
    {
        IicStart();
        ack=IicSentByte(Device);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataPage);if(ack==1){IicStop();continue;}
        ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;}
        for(j=0;j<DataLend;j++)
        {
            ack=IicSentByte(*DataDptr); if(ack==1){IicStop();continue;} 
            DataDptr++;
        }
        IicStop();
        FgTimeout=0;
        if(ack==0)break;
    }
    Delay(50);
    IicWp=1;
    ET1=1;
}
*/
相关链接:http://redbug.21ic.org

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

789

帖子

243

粉丝