标题: 24CXXXIIC的单片机驱动程序(原创可用) [打印本页]

作者: jizhongbiao    时间: 2020-1-8 11:24
标题: 24CXXXIIC的单片机驱动程序(原创可用)
/*********************************************************************
功能:产生IIC起始信号
备注:时钟数据线拉高进入空闲状态,然后再时钟线高电平情况下
        拉低数据局限进入起始状态,拉低时钟线钳位总线准备发送
wx:mcu6666(单片机项目交流合作)
***********************************************************************/
void IIC_Start(void)
{
        SDAH();
        SCLH();
        I2CWait();
           SDAL();
        I2CWait();
        SCLL();
}
/*********************************************************************
功能:产生停止信号
备注:  时钟高电平期间数据线向高电平方向跳变
***********************************************************************/
void IIC_Stop(void)
{
        SDAL();
        SCLL();
        I2CWait();
        SCLH();
        I2CWait();
        SDAH();
        I2CWait();
}
/********************************************************************
功能:检测应答信号
返回:1:失败
         0 :成功
备注:作为发送方的时候等待接收的应答信号
**********************************************************************/
unsigned char IIC_Wait_Ack(void)
{
        unsigned char flag;
        SDAH();
        I2CWait();
        SCLH();
        I2CWait();
        if(SDA)
                flag=1;
        else
                flag=0;
        SCLL();
        return flag;
}

/**********************************************************************
功能:产生应答信号
备注:数据线低电平应答
***********************************************************************/
void IIC_Ack(void)
{
        SCLL();
        SDAL();
        I2CWait();
        SCLH();
        I2CWait();
        SCLL();
}

#if 0
/***************************************************************************
功能:产生非应答信号
备注:数据线高电平非应答
***************************************************************************/
void IIC_NAck(void)
{
        SCLL();
        SDAH();
        I2CWait();
        SCLH();
        I2CWait();
        SCLL();
}
#endif

/****************************************************************************
功能:发送一个字节
入口:要发送的字节备注:
****************************************************************************/
void IIC_Send_Byte(unsigned    char txd)
{
        unsigned char t;
        SCLL();
        for(t=0;t<8;t++)
        {
                if((txd&0x80)>>7)//MSB:高位在前
            SDAH();
        else
                        SDAL();
                txd<<=1;
                I2CWait();
                SCLH();
                I2CWait();
                SCLL();
        }
}
/****************************************************************************
功能:读一个字节

备注:读成功发送ack信号
*****************************************************************************/
unsigned char  IIC_Read_Byte(void)
{
        unsigned char i,receive=0;
        for(i=0;i<8;i++ )
        {
                SCLL();
                I2CWait();
                SCLH();
                I2CWait();
                receive<<=1; //MSB:高位在前
                if(SDA)
                        {
                                receive += 1;
                        }
        }
        IIC_Ack(); //发送ACK
        return receive;
}

/******************************************************************************
功能:再eep中读出一个字节
入口:16字节的地址  
*******************************************************************************/
unsigned char AT24CXX_ReadOneByte(unsigned          int ReadAddr)
{
        unsigned char  temp;
        unsigned char  addrH,addrL;

        addrH=ReadAddr>>8;
        addrL=ReadAddr&0xff;

        IIC_Start();

        IIC_Send_Byte(0xa0); //进入写模式

        IIC_Wait_Ack();
        IIC_Send_Byte(addrH);   //发送高地址
        IIC_Wait_Ack();
           IIC_Send_Byte(addrL);   //发送低地址
        IIC_Wait_Ack();
        IIC_Start();
        IIC_Send_Byte(0xa1);   //进入读模式

        IIC_Wait_Ack();
        temp=        IIC_Read_Byte();
        IIC_Stop();//产生一个停止条件
        return temp;
}
/**************************************************************************
功能:向地址中写一个数据
入口:1,地址          2,数据
作者:jzb 2020年1月6日
备注:
******************************************************************************/
void AT24CXX_WriteOneByte(unsigned int        WriteAddr,unsigned char DataToWrite)
{
        unsigned char addrH,addrL;

        addrH=WriteAddr>>8;
        addrL=WriteAddr&0xff;

        IIC_Start();

        IIC_Send_Byte(0xa0);

        IIC_Wait_Ack();
        IIC_Send_Byte(addrH);   //发送高地址
        IIC_Wait_Ack();
        IIC_Send_Byte(addrL);   //发送低地址
        IIC_Wait_Ack();
        IIC_Send_Byte(DataToWrite);     //发送字节
        IIC_Wait_Ack();
        IIC_Stop();//产生一个停止条件
}






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1