📄 iic.c
字号:
void Delay_Wmax(void)
{
int i;
for(i=0;i<800;i++);
_NOP();
}
void RW_I2C_Start(void)
{
#ifdef EE_IO_COM
EE_CON_OUT |= (EE_SDA_BIT+EE_SCL_BIT);
EE_CON_DIR |= (EE_SDA_BIT+EE_SCL_BIT);
#else
EE_SCL_OUT &= ~EE_SCL_BIT;
EE_SCL_DIR |= EE_SCL_BIT;
EE_SDA_OUT &= ~EE_SDA_BIT;
EE_SDA_DIR |= EE_SDA_BIT;
#endif
_NOP();
_NOP();
EE_SDA_OUT &= ~EE_SDA_BIT;
_NOP();
_NOP();
EE_SCL_OUT &= ~EE_SCL_BIT;
}
void RW_I2C_Stop(void)
{
EE_SDA_DIR |= EE_SDA_BIT;
EE_SDA_OUT &= ~EE_SDA_BIT;
_NOP();
_NOP();
EE_SCL_OUT |= EE_SCL_BIT;
_NOP();
_NOP();
EE_SDA_OUT |= EE_SDA_BIT;
}
unsigned char W_I2C_Byte( unsigned char data ) //read or write command (0xAF read; OxAE write)
{ //start + 1010xxx (read or write start)
#define TESTASKTIME 2
unsigned char i;
unsigned char testask=0;
EE_SDA_DIR |= EE_SDA_BIT;
for(i=1;i<=8;i++)
{
if ((data&0x80)==0x80) EE_SDA_OUT |= EE_SDA_BIT;
else EE_SDA_OUT &= ~EE_SDA_BIT;
data <<=1;
_NOP();
_NOP();
EE_SCL_OUT |= EE_SCL_BIT;
_NOP();
_NOP();
EE_SCL_OUT &= ~EE_SCL_BIT;
_NOP();
_NOP();
}
EE_SDA_DIR &= ~EE_SDA_BIT;
EE_SCL_OUT |= EE_SCL_BIT;
i=TESTASKTIME;
while(i)
{
if((EE_SDA_IN&EE_SDA_BIT)!=EE_SDA_BIT){testask=1;break;}
else testask=0;
i--;
}
EE_SCL_OUT &= ~EE_SCL_BIT;
return testask;
}
unsigned char R_I2C_Ryte(unsigned char ackto )
{
unsigned char i;
unsigned char data=0;
EE_SDA_DIR &= ~EE_SDA_BIT;
for(i=1;i<=8;i++)
{
EE_SCL_OUT |= EE_SCL_BIT;
data <<=1;
if ((EE_SDA_IN&EE_SDA_BIT)==EE_SDA_BIT) data |=0x01;
EE_SCL_OUT &= ~EE_SCL_BIT;
_NOP();
}
if(ackto) EE_SDA_OUT &= ~EE_SDA_BIT;
else EE_SDA_OUT |= EE_SDA_BIT;
EE_SDA_DIR |= EE_SDA_BIT;
_NOP();
_NOP();
EE_SCL_OUT |= EE_SCL_BIT;
_NOP();
_NOP();
EE_SCL_OUT &= ~EE_SCL_BIT;
return data;
}
void W_I2C_Bytes( unsigned char *Ram_Addr, unsigned char I2C_Addr1, unsigned int I2C_Addr2,
unsigned char nLen)
{
//unsigned int HighAdress;
//RW_I2C_Start();
RW_I2C_Start();
W_I2C_Byte( I2C_Addr1 );
W_I2C_Byte( I2C_Addr2 );
for( ; nLen>0; nLen-- )
{
W_I2C_Byte( *Ram_Addr );
Ram_Addr++;
}
RW_I2C_Stop();
do
{
RW_I2C_Start();
}
while(!(W_I2C_Byte( I2C_Addr1 )));
RW_I2C_Stop();
}
void R_I2C_Bytes( unsigned char *Ram_Addr, unsigned char I2C_Addr1, unsigned int I2C_Addr2,
unsigned int nLen)
{
RW_I2C_Start();
W_I2C_Byte( I2C_Addr1 );
W_I2C_Byte( I2C_Addr2 );
RW_I2C_Start();
W_I2C_Byte( I2C_Addr1 |0x01);
for( ; nLen>0; nLen-- )
{
*Ram_Addr = R_I2C_Ryte(nLen-1);
Ram_Addr++;
}
RW_I2C_Stop();
}
void W_Bytes( unsigned char *Ram_Addr, unsigned char I2C_Addr1, unsigned int I2C_Addr2,
unsigned int nLen)
{
for( ; nLen>0; nLen-- )
{
RW_I2C_Start();
W_I2C_Byte( I2C_Addr1 );
W_I2C_Byte( I2C_Addr2 );
W_I2C_Byte( *Ram_Addr );
RW_I2C_Stop();
I2C_Addr2++;
if(I2C_Addr2>0x00ff){I2C_Addr2=0x00;I2C_Addr1 += 2;}
Ram_Addr++;
do
{
RW_I2C_Start();
}
while(!(W_I2C_Byte( I2C_Addr1 )));
RW_I2C_Stop();
}
}
void R_Bytes( unsigned char *Ram_Addr, unsigned char I2C_Addr1, unsigned int I2C_Addr2,
unsigned int nLen)
{
RW_I2C_Start();
for( ; nLen>0; nLen-- )
{
RW_I2C_Start();
W_I2C_Byte( I2C_Addr1 );
W_I2C_Byte( I2C_Addr2 );
RW_I2C_Start();
W_I2C_Byte( I2C_Addr1 |0x01);
*Ram_Addr = R_I2C_Ryte(0);
RW_I2C_Stop();
I2C_Addr2++;
if(I2C_Addr2>0x00ff){I2C_Addr2=0x0000,I2C_Addr1 += 2;}
Ram_Addr++;
}
}
void New_E2prom_Ini(void)
{
}
void Old_E2prom_Ini(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -