📄 e2prom_c.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 + -