📄 i2c.c
字号:
#include "msp430x41x.h"
#include "general.h"
unsigned char I2CTemp0;
unsigned short I2CTemp1;
unsigned char ErrIndication=0;
void I2CSCLHighToLow(void)
{
I2C_SCL_OUT|=I2C_SCL;
I2C_SCL_OUT&=~(I2C_SCL);
}
void I2CStart(void)
{
_DINT();
I2C_SDA_OUT|=I2C_SDA;
I2C_SCL_OUT|=I2C_SCL;
I2C_SDA_OUT&=~(I2C_SDA);
I2C_SCL_OUT&=~(I2C_SCL);
}
void I2CStop(void)
{
I2C_SDA_OUT&=~(I2C_SDA);
I2C_SCL_OUT|=I2C_SCL;
I2C_SDA_OUT|=I2C_SDA;
_EINT();
ClrWDT();
}
void I2CAck(void)
{
I2C_SDA_OUT&=~(I2C_SDA);
I2CSCLHighToLow();
}
void I2CNoAck(void)
{
I2C_SDA_OUT|=I2C_SDA;
I2CSCLHighToLow();
}
unsigned char I2CReadByte(void)
{
unsigned char temp=0,BitCounter=8;
I2C_SDA_DIR&=~(I2C_SDA);
do
{
temp<<=1;
I2C_SCL_OUT|=I2C_SCL;
if(I2C_SDA_IN&I2C_SDA) temp++;
I2C_SCL_OUT&=~(I2C_SCL);
}while(--BitCounter);
I2C_SDA_DIR|=I2C_SDA;
return(temp);
}
void I2CSendByte(unsigned char data)
{
unsigned char BitCounter=8;
unsigned char wait=0;
do
{
if(data&0x80) I2C_SDA_OUT|=I2C_SDA;
else I2C_SDA_OUT&=~(I2C_SDA);
I2CSCLHighToLow();
data<<=1;
}while(--BitCounter);
// 将WAITACK放入SENDBYTE又省空间又有效率
I2C_SDA_DIR&=~(I2C_SDA);
I2C_SCL_OUT|=I2C_SCL;
while(I2C_SDA_IN&I2C_SDA) // 循环等待ACK信号255次循环
{
wait++;
if(!wait)
{
ErrIndication=1;
break;
}
};
I2C_SCL_OUT&=~(I2C_SCL);
I2C_SDA_DIR|=I2C_SDA;
}
void E2promBegin()
{
for(;I2CTemp1>=0x100;I2CTemp1-=0x100)
{
I2CTemp0+=2;
}
I2CStart();
I2CSendByte(I2CTemp0);
I2CSendByte(I2CTemp1);
}
void E2promRead(unsigned short addr,unsigned char *data,unsigned char len)
{
unsigned char i,j=0;
ReadRestar:
ErrIndication=0;
I2CTemp0=0xA0;
I2CTemp1=addr;
for(i=0;i<len;i++,I2CTemp1++)
{
E2promBegin();
I2CStart();
I2CSendByte(I2CTemp0+1);
data[i]=I2CReadByte();
I2CNoAck();
I2CStop();
}
if(ErrIndication)
{
j++;
if(j<3) goto ReadRestar;
}
}
void E2promWrite(unsigned short addr,unsigned char *data,unsigned char len)
{
unsigned char i,j=0;
#ifdef TEST_COURSE
LcdLightOn(1);
#endif
WriteRestar:
ErrIndication=0;
I2CTemp0=0xA0;
I2CTemp1=addr;
E2PROM_WP_OUT&=~(E2PROM_WP);
for(i=0;i<len;i++,I2CTemp1++)
{
E2promBegin();
I2CSendByte(data[i]);
I2CStop();
Delay(800);
}
E2PROM_WP_OUT|=E2PROM_WP;
if(ErrIndication)
{
j++;
if(j<3) goto WriteRestar;
}
}
#ifdef _HARDWARE_RTC
void RealtimeOper(unsigned char addr,unsigned char *data,unsigned char len)
{
unsigned char i,j=0,mode;
OperRestar:
ErrIndication=0;
mode=addr&0x01;
I2CTemp0=addr&0xFE;
I2CStart();
I2CSendByte(0x64);
I2CSendByte(I2CTemp0);
for(i=0;i<len;i++)
{
if(mode)
{
data[i]=I2CReadByte();
if(i==len-1) I2CNoAck();
else I2CAck();
}
else
{
I2CSendByte(data[i]);
}
}
I2CStop();
if(ErrIndication)
{
j++;
if(j<3) goto OperRestar;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -