找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1879|回復(fù): 0
收起左側(cè)

24CXXXIIC的單片機(jī)驅(qū)動(dòng)程序(原創(chuàng)可用)

[復(fù)制鏈接]
ID:130230 發(fā)表于 2020-1-8 11:24 | 顯示全部樓層 |閱讀模式
/*********************************************************************
功能:產(chǎn)生IIC起始信號(hào)
備注:時(shí)鐘數(shù)據(jù)線拉高進(jìn)入空閑狀態(tài),然后再時(shí)鐘線高電平情況下
        拉低數(shù)據(jù)局限進(jìn)入起始狀態(tài),拉低時(shí)鐘線鉗位總線準(zhǔn)備發(fā)送
wx:mcu6666(單片機(jī)項(xiàng)目交流合作)
***********************************************************************/
void IIC_Start(void)
{
        SDAH();
        SCLH();
        I2CWait();
           SDAL();
        I2CWait();
        SCLL();
}
/*********************************************************************
功能:產(chǎn)生停止信號(hào)
備注:  時(shí)鐘高電平期間數(shù)據(jù)線向高電平方向跳變
***********************************************************************/
void IIC_Stop(void)
{
        SDAL();
        SCLL();
        I2CWait();
        SCLH();
        I2CWait();
        SDAH();
        I2CWait();
}
/********************************************************************
功能:檢測(cè)應(yīng)答信號(hào)
返回:1:失敗
         0 :成功
備注:作為發(fā)送方的時(shí)候等待接收的應(yīng)答信號(hào)
**********************************************************************/
unsigned char IIC_Wait_Ack(void)
{
        unsigned char flag;
        SDAH();
        I2CWait();
        SCLH();
        I2CWait();
        if(SDA)
                flag=1;
        else
                flag=0;
        SCLL();
        return flag;
}

/**********************************************************************
功能:產(chǎn)生應(yīng)答信號(hào)
備注:數(shù)據(jù)線低電平應(yīng)答
***********************************************************************/
void IIC_Ack(void)
{
        SCLL();
        SDAL();
        I2CWait();
        SCLH();
        I2CWait();
        SCLL();
}

#if 0
/***************************************************************************
功能:產(chǎn)生非應(yīng)答信號(hào)
備注:數(shù)據(jù)線高電平非應(yīng)答
***************************************************************************/
void IIC_NAck(void)
{
        SCLL();
        SDAH();
        I2CWait();
        SCLH();
        I2CWait();
        SCLL();
}
#endif

/****************************************************************************
功能:發(fā)送一個(gè)字節(jié)
入口:要發(fā)送的字節(jié)備注:
****************************************************************************/
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();
        }
}
/****************************************************************************
功能:讀一個(gè)字節(jié)

備注:讀成功發(fā)送ack信號(hào)
*****************************************************************************/
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(); //發(fā)送ACK
        return receive;
}

/******************************************************************************
功能:再eep中讀出一個(gè)字節(jié)
入口:16字節(jié)的地址  
*******************************************************************************/
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); //進(jìn)入寫模式

        IIC_Wait_Ack();
        IIC_Send_Byte(addrH);   //發(fā)送高地址
        IIC_Wait_Ack();
           IIC_Send_Byte(addrL);   //發(fā)送低地址
        IIC_Wait_Ack();
        IIC_Start();
        IIC_Send_Byte(0xa1);   //進(jìn)入讀模式

        IIC_Wait_Ack();
        temp=        IIC_Read_Byte();
        IIC_Stop();//產(chǎn)生一個(gè)停止條件
        return temp;
}
/**************************************************************************
功能:向地址中寫一個(gè)數(shù)據(jù)
入口:1,地址          2,數(shù)據(jù)
作者: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);   //發(fā)送高地址
        IIC_Wait_Ack();
        IIC_Send_Byte(addrL);   //發(fā)送低地址
        IIC_Wait_Ack();
        IIC_Send_Byte(DataToWrite);     //發(fā)送字節(jié)
        IIC_Wait_Ack();
        IIC_Stop();//產(chǎn)生一個(gè)停止條件
}

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表