|
//Name: I2C standard program //Author: Ares //Date: 2005.11.4 #i nclude <AT89X52.H> #i nclude <intrins.h> sbit SDA=P2^5; sbit SCL=P1^0; #define uchar unsigned char #define uint unsigned int #define byte unsigned char void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } void delayms (uint x) { byte j; while(x--){ for(j=0;j<125;j++){;} } }
void I2C_Start() //I2C START { SDA=1; _nop_(); SCL=1; delay(); SDA=0; delay(); SCL=0; _nop_(); } void I2C_Stop() //I2C STOP { SDA=0; _nop_(); SCL=1; delay(); SDA=1; delay(); } bit I2C_ReceiveAck() { bit ck; SDA=1; //THE HOST RELEASE THE BUS _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); ck=SDA; _nop_(); _nop_(); SCL=0; _nop_(); return(ck); } void I2C_SendAck()
{ SDA=0; _nop_(); _nop_(); SCL=1; delay(); //remain SCL=0; _nop_(); _nop_(); } void I2C_SendNoAck() { SDA=1; _nop_(); _nop_(); SCL=1; delay(); //remain SCL=0; _nop_(); _nop_(); } void I2C_SendByte(byte SData) {uchar i; for(i=0;i<8;i++) { SDA=(bit)(SData&0x80); SData=SData<<1; SCL=1; delay(); SCL=0; } } byte I2C_ReceiveByte() {uchar i; byte RData; RData=0; for(i=0;i<8;i++) { SDA=1; _nop_(); SCL=1; _nop_(); _nop_(); RData=RData<<1; RData=RData|SDA; _nop_(); _nop_(); SCL=0; } return(RData); } void I2C_SendToSubAddress(byte SlaveAddress,byte SubAddress,byte *pSData,uchar N) {uchar i; I2C_Start(); I2C_SendByte(SlaveAddress); //send slave address(write device) I2C_ReceiveAck(); I2C_SendByte(SubAddress); //send sub address I2C_ReceiveAck(); for(i=0;i<N;i++) { I2C_SendByte(pSData[i]); I2C_ReceiveAck(); } I2C_Stop(); } void I2C_ReceiveFromSubAddress(byte SlaveAddress,byte SubAddress,byte *pRData,uchar N) {uchar i; I2C_Start(); I2C_SendByte(SlaveAddress); //send slave address(write device) I2C_ReceiveAck(); I2C_SendByte(SubAddress); //send sub address I2C_ReceiveAck(); I2C_Start(); //I2C Start Again! I2C_SendByte(SlaveAddress+1); //send slave address(read device) I2C_ReceiveAck(); for(i=0;i<N-1;i++) { pRData[i]=I2C_ReceiveByte(); I2C_SendAck(); } pRData[i]=I2C_ReceiveByte(); I2C_SendNoAck(); I2C_Stop(); } main() {byte *pData; byte a[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; pData=a; I2C_ReceiveFromSubAddress(0xA0,0x20,pData,16); I2C_SendToSubAddress(0xA0,0,pData,16); }
|