www.pudn.com > GSM-M51.rar > I2C.c
/********************************** 函数名:I2C.c 功 能:AT24C32读写函数 **********************************/ #include#include #include "hal.h" #include "I2C.h" //I2C起始 void I2C_START(void) {I2C_SCL=1; _NOP(); I2C_SDA=1; _NOP(); I2C_SDA=0; _NOP(); I2C_SCL=0; _NOP(); } //I2C停止 void I2C_STOP(void) {I2C_SDA=0; _NOP(); I2C_SCL=1; _NOP(); I2C_SDA=1; _NOP(); } //等待I2C应答 void I2C_ACK(void) {uint i=0xffff; I2C_SDA=1; _NOP(); I2C_SCL=1; _NOP(); do{i--; if(I2C_SDA!=1) {I2C_SCL=0;i=0;} }while(i!=0); I2C_SCL=0; _NOP(); } //I2C写8位 void I2C_WRITE_8BIT(uchar dat) {uchar i; for(i=0;i<8;i++) {I2C_SDA=dat&0x80; _NOP(); I2C_SCL=1; _NOP(); I2C_SCL=0; _NOP(); dat<<=1; } I2C_ACK(); } //I2C读8位 uchar I2C_READ_8BIT(void) {uchar i,dat=0; I2C_SDA=1; for(i=0;i<8;i++) {I2C_SCL=1; _NOP(); if(I2C_SDA==1) {dat|=0x01;} I2C_SCL=0; if(i<7) {dat<<=1;} } return(dat); } //I2C读指定地址数据 uchar I2C_READ(uint addr) {uchar dat; I2C_START(); I2C_WRITE_8BIT(OP_WRITE); I2C_WRITE_8BIT((uchar)(addr/256)); I2C_WRITE_8BIT((uchar)(addr%256)); I2C_START(); I2C_WRITE_8BIT(OP_READ); dat=I2C_READ_8BIT(); I2C_STOP(); return(dat); } //I2C写数据到指定地址 void I2C_WRITE(uint addr,uchar dat) {I2C_START(); I2C_WRITE_8BIT(OP_WRITE); I2C_WRITE_8BIT((uchar)(addr/256)); I2C_WRITE_8BIT((uchar)(addr%256)); I2C_WRITE_8BIT(dat); I2C_STOP(); }