⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e2prom_c.c

📁 E2PROM 24C02的驱动程序
💻 C
字号:
#include "config.h"#include "e2prom.h"#include "common.h"/*C51 standard include file.*/#include <reg52.h>#include <intrins.h>/***************************************************************************/#define WriteDeviceAddress 0xa0 /*MSB: 10100000*/#define ReadDviceAddress 0xa1 /*MSB: 10100001*/#define NOP5() _nop_();_nop_();_nop_();_nop_();_nop_()/***************************************************************************/sbit    Data = P1^0;sbit    CLK =  P1^1;/*Start is identified by a falling edge of Serial Data(Data) while Serial Clock (CLK) is stable in the    High state.*/void start24c02() {    Data=1;    NOP5();    CLK=1;    NOP5();    Data=0;    NOP5();    CLK=0;    NOP5();}/*Stop is identified by a rising edge of Serial Data(Data) while Serial Clock (CLK) is stable and driven    High.*/void stop24c02() {    Data=0;    NOP5();    CLK=1;    NOP5();    Data=1;    NOP5();    CLK=0;    NOP5();}/**/void ack() {    Data=0;    NOP5();    CLK=1;    NOP5();    CLK=0;    NOP5();    Data=1;}/***************************************************************************/void noAck(){    Data=1;    NOP5();    CLK=1;    NOP5();    CLK=0;    NOP5();}/***************************************************************************/bit checkAck(void){    bit ErrorBit;    Data = 1;    NOP5();    CLK = 1;    NOP5();    ErrorBit = Data;    NOP5();    CLK=0;    return(ErrorBit);}/*Write 8 bit data/instruction to I2C device.*/void write8Bit(unsigned char input) {    unsigned char temp;    for ( temp=8; temp > 0; temp--)    {        Data = (bit)(input&0x80);        NOP5();        CLK = 1;        NOP5();        CLK = 0;        NOP5();        input = input<<1;    }}/* return number of bytes written. */U8 e2promWrite(U8 offset, U8 *buf, U8 size){    U8 writtenNum = 0;    bit ackValue = 1;    selectClock(6);    start24c02();    write8Bit(WriteDeviceAddress);    ackValue = checkAck();    if ( ackValue != 0 )    {        return writtenNum;    }    write8Bit(offset);    ackValue = checkAck();    if ( ackValue != 0 )    {        return writtenNum;    }    for ( ; size > 0; size-- )    {        write8Bit(*buf);        ackValue = checkAck();        if ( ackValue != 0 )        {            return writtenNum;        }        writtenNum++;        buf++;    }    stop24c02();    return writtenNum;}/*Read 8 bit data from I2C device.*/unsigned char read8Bit(){    unsigned char temp, rbyte=0;    for ( temp=8; temp > 0; temp-- )    {        CLK = 1;        rbyte = rbyte << 1;        rbyte = rbyte|((unsigned char)(Data));        CLK=0;    }    return(rbyte);}/* return number of bytes written. */U8 e2promRead(U8 offset, U8 *buf, U8 size){    U8 readData = 0;    bit ackValue = 1;    selectClock(6);    start24c02();    write8Bit(WriteDeviceAddress);    ackValue = checkAck();    if ( ackValue != 0 )    {        return readData;    }    write8Bit(offset);    ackValue = checkAck();    if ( ackValue != 0 )    {        return readData;    }    start24c02();       write8Bit(ReadDviceAddress);    ackValue = checkAck();    if ( ackValue != 0 )    {        return readData;    }    while ( size > 1 )    {        *buf = read8Bit();        ack();        readData++;        buf++;        size--;    }    *buf = read8Bit();    noAck();    readData++;    stop24c02();    return readData;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -