?? i2c.c
字號:
#include "includes.h"
unsigned char ErrIndication=0;
void AptoticE2promStart(void)
{
I2C_SCL_OUT &=~ I2C_SCL;
I2C_SDA_OUT |= I2C_SDA;
I2C_SCL_OUT |= I2C_SCL;
I2C_SDA_OUT &=~ I2C_SDA;
I2C_SCL_OUT &=~ I2C_SCL;
}
void AptoticE2promStop(void)
{
I2C_SCL_OUT &=~ I2C_SCL;
I2C_SDA_OUT &=~ I2C_SDA;
I2C_SCL_OUT |= I2C_SCL;
I2C_SDA_OUT |= I2C_SDA;
I2C_SCL_OUT &=~ I2C_SCL;
}
void AptoticE2promSck(void)
{
I2C_SCL_OUT |= I2C_SCL;
NOP();
NOP();
I2C_SCL_OUT &=~ I2C_SCL;
NOP();
NOP();
}
void AptoticE2promNoAck(void)
{
I2C_SCL_OUT &=~ I2C_SCL;
I2C_SDA_OUT |= I2C_SDA;
I2C_SCL_OUT |= I2C_SCL;
I2C_SCL_OUT &=~ I2C_SCL;
}
void AptoticE2promAck(void)
{
I2C_SCL_OUT &=~ I2C_SCL;
I2C_SDA_OUT &=~ I2C_SDA;
I2C_SCL_OUT |= I2C_SCL;
I2C_SCL_OUT &=~ I2C_SCL;
}
unsigned char AptoticE2promTestAck(void)
{
unsigned short i = 0;
unsigned char flag = OK;
I2C_SCL_OUT &=~ I2C_SCL;
I2C_SDA_OUT &=~ I2C_SDA;
I2C_SDA_DIR |= I2C_SDA;
I2C_SCL_OUT |= I2C_SCL;
while(I2C_SDA_IN & I2C_SDA)
{
if( i++ > 2000 )
{
flag = ERROR;
break;
}
}
I2C_SDA_DIR &=~ I2C_SDA;
I2C_SCL_OUT &=~ I2C_SCL;
return flag;
}
unsigned char AptoticE2promReadByte(void)
{
unsigned char rdbyte = 0, BitCounter = 8;
I2C_SDA_DIR |= I2C_SDA;
do{
rdbyte <<= 1;
I2C_SCL_OUT |= I2C_SCL;
if( I2C_SDA_IN & I2C_SDA ) rdbyte++;
I2C_SCL_OUT &=~ I2C_SCL;
}while( --BitCounter );
I2C_SDA_DIR &=~ I2C_SDA;
return( rdbyte );
}
void AptoticE2promWriteByte(unsigned char wrbyte)
{
unsigned short wait = 0;
unsigned char BitCounter = 8;
do
{
if(wrbyte&0x80) I2C_SDA_OUT |= I2C_SDA;
else I2C_SDA_OUT &=~ I2C_SDA;
AptoticE2promSck();
wrbyte<<=1;
}while(--BitCounter);
I2C_SDA_DIR |= I2C_SDA;
I2C_SCL_OUT |= I2C_SCL;
clr_wdt();
while( I2C_SDA_IN & I2C_SDA )
{
if( wait++ >= 1000 )
{
ErrIndication=1;
break;
}
}
I2C_SDA_DIR &=~ I2C_SDA;
I2C_SCL_OUT &=~ I2C_SCL;
}
void E2promRead(unsigned short addr,unsigned char *data,unsigned char len)
{
unsigned char temph,templ;
unsigned char i,j=0;
temph = (unsigned char)(addr/256);
templ = (unsigned char)(addr%256);
ReadRestart:
ErrIndication = 0;
AptoticE2promStart();
AptoticE2promWriteByte(0xA0);
AptoticE2promWriteByte(temph);
AptoticE2promWriteByte(templ);
AptoticE2promStart();
AptoticE2promWriteByte(0xA1);
for( i = 0; i < len-1; i++ )
{
*(data+i) = AptoticE2promReadByte();
AptoticE2promAck();
}
*(data+len-1)=AptoticE2promReadByte();
AptoticE2promNoAck();
AptoticE2promStop();
I2C_SCL_OUT |= I2C_SCL;
I2C_SDA_OUT |= I2C_SDA;
if( ErrIndication )
{
j++;
if( j < 3 ) goto ReadRestart;
}
}
void E2promWrite(unsigned short addr,unsigned char *data,unsigned char len)
{
unsigned char temph,templ;
unsigned char i, j = 0;
temph = (unsigned char)(addr/256);
templ = (unsigned char )(addr%256);
WriteRestart:
ErrIndication = 0;
AptoticE2promStart();
AptoticE2promWriteByte(0xA0);
AptoticE2promWriteByte(temph);
AptoticE2promWriteByte(templ);
I2C_WP_OUT &=~ (I2C_WP);
for(i=0;i<len;i++)
{
AptoticE2promWriteByte(*(data+i));
}
AptoticE2promStop();
I2C_WP_OUT |= I2C_WP;
I2C_SCL_OUT |= I2C_SCL;
I2C_SDA_OUT |= I2C_SDA;
if( ErrIndication )
{
j++;
if( j < 3 ) goto WriteRestart;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -