📄 i2c.c
字号:
#include "includes.h"
unsigned short I2CTemp1;
sreg unsigned char ErrIndication = 0;
unsigned char I2CTemp0;
const I2C_SLAVE_ADDR_ST g_stI2cSlaveAddr[I2C_DEV_BUTT] =
{
{ 0x64, 0x65 },
{ 0x90, 0x91 },
{ 0xa2, 0xa3 },
};
#ifdef _TEMPERATURE
signed char CurrentTemperature;
#endif
void I2cStart(void)
{
FRAM_SDA_OUT |= FRAM_SDA;
FRAM_SCL_OUT |= FRAM_SCL;
NOP();
FRAM_SDA_OUT &=~ (FRAM_SDA);
NOP();
FRAM_SCL_OUT &=~ (FRAM_SCL);
}
void I2cStop(void)
{
FRAM_SDA_OUT &=~ (FRAM_SDA);
FRAM_SCL_OUT |= FRAM_SCL;
NOP();
FRAM_SDA_OUT |= FRAM_SDA;
NOP();
FRAM_SCL_OUT &=~ (FRAM_SCL);
}
void I2cSck(void)
{
FRAM_SCL_OUT|=(FRAM_SCL);
Delay(2);
FRAM_SCL_OUT&=~(FRAM_SCL);
}
void I2cNoAck(void)
{
FRAM_SCL_OUT &=~ (FRAM_SCL);
FRAM_SDA_OUT |= FRAM_SDA;
FRAM_SCL_OUT |= FRAM_SCL;
FRAM_SCL_OUT &=~ (FRAM_SCL);
}
void I2cAck(void)
{
FRAM_SCL_OUT &=~ (FRAM_SCL);
FRAM_SDA_OUT &=~ (FRAM_SDA);
FRAM_SCL_OUT |= FRAM_SCL;
FRAM_SCL_OUT &=~ (FRAM_SCL);
}
unsigned char I2cReadByte(void)
{
unsigned char rdbyte=0,BitCounter=8;
FRAM_SDA_DIR|= (FRAM_SDA);
do{
rdbyte<<=1;
FRAM_SCL_OUT|=FRAM_SCL;
if(FRAM_SDA_IN&FRAM_SDA) rdbyte++;
FRAM_SCL_OUT&=~(FRAM_SCL);
}while(--BitCounter);
FRAM_SDA_DIR&=~(FRAM_SDA);
return(rdbyte);
}
void I2cWriteByte(unsigned char wrbyte)
{
unsigned short wait = 0;
unsigned char BitCounter = 8;
do
{
if(wrbyte&0x80) FRAM_SDA_OUT |= FRAM_SDA;
else FRAM_SDA_OUT &=~ FRAM_SDA;
I2cSck();
wrbyte<<=1;
}while(--BitCounter);
FRAM_SDA_DIR |= FRAM_SDA;
FRAM_SCL_OUT |= FRAM_SCL;
ClrWdt();
while( FRAM_SDA_IN & FRAM_SDA )
{
if( wait++ >= 1000 )
{
ErrIndication = 1;
break;
}
}
FRAM_SDA_DIR&=~(FRAM_SDA);
FRAM_SCL_OUT&=~(FRAM_SCL);
}
void FramRead(unsigned short addr,unsigned char *data,unsigned char len)
{
unsigned char temph,templ;
unsigned char i,j = 0;
if( len == 0 )return;
temph = (unsigned char)( addr / 256 );
templ = (unsigned char)( addr % 256 );
ReadRestar:
ErrIndication = 0;
I2cStart();
I2cWriteByte(g_stI2cSlaveAddr[I2C_DEV_FRAM].ucWrite);
I2cWriteByte(temph);
I2cWriteByte(templ);
I2cStart();
I2cWriteByte(g_stI2cSlaveAddr[I2C_DEV_FRAM].ucRead);
for( i = 0;i < len-1; i++ )
{
*(data+i) = I2cReadByte();
I2cAck();
}
*(data+i) = I2cReadByte();
I2cNoAck();
I2cStop();
FRAM_SCL_OUT |= FRAM_SCL;
FRAM_SDA_OUT |= FRAM_SDA;
if( ErrIndication )
{
j++;
if(j<3) goto ReadRestar;
}
}
void FramWrite(unsigned short addr,unsigned char *data,unsigned char len)
{
unsigned char temph,templ;
unsigned char i, j = 0;
if( len == 0 ) return;
temph = (unsigned char)( addr / 256 );
templ = (unsigned char )( addr % 256 );
WriteRestar:
ErrIndication = 0;
I2cStart();
I2cWriteByte(g_stI2cSlaveAddr[I2C_DEV_FRAM].ucWrite);
I2cWriteByte(temph);
I2cWriteByte(templ);
RTC_WP_OUT &=~ (RTC_WP);
for(i=0;i<len;i++)
{
I2cWriteByte(*(data+i));
}
I2cStop();
FRAM_WP_OUT |= FRAM_WP;
FRAM_SCL_OUT |= FRAM_SCL;
FRAM_SDA_OUT |= FRAM_SDA;
if( ErrIndication )
{
j++;
if(j<3) goto WriteRestar;
}
}
void RtcOperation(unsigned char addr,unsigned char *data,unsigned char len)
{
unsigned char i, mode, j = 0;
OperationRestart:
ErrIndication = 0;
mode = (addr & 0x01);
I2CTemp0 = (addr & 0xFE);
I2cStart();
I2cWriteByte(g_stI2cSlaveAddr[I2C_DEV_RTC].ucWrite);
I2cWriteByte(I2CTemp0);
for(i=0;i<len;i++)
{
if(mode)
{
data[i]= I2cReadByte();
if(i==len-1) I2cNoAck();
else I2cAck();
}
else
{
I2cWriteByte(data[i]);
}
}
I2cStop();
RTC_SCL_OUT |= RTC_SCL;
RTC_SDA_OUT |= RTC_SDA;
if( ErrIndication )
{
j++;
if(j<3) goto OperationRestart;
}
}
void ClearMinPwrInE2prom( void )
{
unsigned short ii;
unsigned char temp[MIN_PWR_REC_SIZE];
MemSetZero( &(temp[0]), MIN_PWR_REC_SIZE );
for( ii = 0; ii < MIN_PWR_REC_IN_E2PROM; ii++ )
{
FramWrite( ADDR_OF_MIN_BASE+ii*MIN_PWR_REC_SIZE, &(temp[0]), MIN_PWR_REC_SIZE);
}
}
#ifdef _TEMPERATURE
void TemperatureOperBegin(unsigned char addr)
{
I2CTemp0 = 0x90;
I2CTemp1 = addr;
I2cStart();
}
void TemperatureRead(unsigned char addr,unsigned char *data,unsigned char len)
{
unsigned char i,j = 0;
ReadRestart:
ErrIndication = 0;
I2cStart();
I2cWriteByte(g_stI2cSlaveAddr[I2C_DEV_TMP].ucWrite);
I2cWriteByte(addr);
I2cStop();
I2cStart();
I2cWriteByte(g_stI2cSlaveAddr[I2C_DEV_TMP].ucRead);
for(i=0;i<len;i++)
{
*(data+i)=I2cReadByte();
if(i==len-1)
{
I2cNoAck();
}
else
{
I2cAck();
}
}
I2cStop();
RTC_SCL_OUT |= RTC_SCL;
RTC_SDA_OUT |= RTC_SDA;
if( ErrIndication )
{
j++;
if(j<3) goto ReadRestart;
}
}
void TemperatureWrite(unsigned char addr,unsigned char *data,unsigned char len)
{
unsigned char i,j=0;
WriteRestart:
ErrIndication = 0;
I2cStart();
I2cWriteByte(g_stI2cSlaveAddr[I2C_DEV_TMP].ucWrite);
I2cWriteByte(addr);
for(i=0;i<len;i++)
{
I2cWriteByte(*(data+i));
}
I2cStop();
RTC_SCL_OUT |= RTC_SCL;
RTC_SDA_OUT |= RTC_SDA;
if( ErrIndication )
{
j++;
if(j<3) goto WriteRestart;
}
}
unsigned char TemperatureWriteDone(unsigned char data)
{
unsigned char times = 0, temp;
do{
TemperatureWrite( 0x01, &data, 1 );
Delay(250);
TemperatureRead( 0x01, &temp, 1 );
if( temp == data )
{
return OK;
}
}while( times++ < 3 );
return ERROR;
}
const unsigned char _RTCCaliVal[] =
{
0,
0,
0,
0,
0,
0,
2,
2,
2,
2,
2,
3,
3,
3,
4,
4,
4,
5,
5,
6,
6,
7,
7,
8,
8,
9,
9,
10,
11,
11,
12,
13,
13,
14,
15,
16,
17,
18,
18,
19,
20,
21,
22,
23,
24,
25,
26,
28,
29,
30,
31,
32,
33,
34,
36,
37,
38,
40,
41,
42,
44,
45,
47,
48,
49,
51,
52,
54,
56,
57,
59,
61,
62,
};
void GetTemperature(void)
{
signed char temperature[2];
unsigned char val;
if( TemperatureWriteDone(0x02) != OK )
{
return;
}
TemperatureRead( 0x00, (unsigned char *)&temperature[0], 2 );
CurrentTemperature = temperature[0];
TemperatureWriteDone(0x03);
val = (unsigned char)abs( CurrentTemperature-30 );
if( val >72 )
{
val = 63;
}
else
{
val = _RTCCaliVal[val];
}
val = 127-val;
RtcOperation( 0x70, (unsigned char *)&val, 1 );
}
#endif
void LcdPcf8576Init(void)
{
unsigned char j = 0;
ReInit:
ErrIndication = 0;
I2cStart();
I2cWriteByte(LCD_ADDR_PCF8576);
I2cWriteByte(LCD_PARTS_SELECT);
I2cWriteByte(LCD_DISPLAY_ON);
I2cWriteByte(LCD_FLASH_CON);
I2cStop();
FRAM_SCL_OUT |= FRAM_SCL;
FRAM_SDA_OUT |= FRAM_SDA;
if(ErrIndication)
{
j++;
if(j<3) goto ReInit;
}
}
void LcdOpenOrClose(uchar Flag)
{
unsigned char j = 0;
ReInit:
ErrIndication = 0;
I2cStart();
I2cWriteByte(LCD_ADDR_PCF8576);
I2cWriteByte(LCD_PARTS_SELECT);
I2cWriteByte(Flag);
I2cStop();
FRAM_SCL_OUT |= FRAM_SCL;
FRAM_SDA_OUT |= FRAM_SDA;
if(ErrIndication)
{
j++;
if(j<3) goto ReInit;
}
}
void LcdPcf8576Operation(unsigned char addr,unsigned char pos,unsigned char len)
{
unsigned char i, j = 0;
OperRestar:
ErrIndication = 0;
I2cStart();
I2cWriteByte(LCD_ADDR_PCF8576);
I2cWriteByte(LCD_PARTS_SELECT);
I2cWriteByte(addr&0x7F);
for( i = 0; i < len; i++ )
{
I2cWriteByte(*(LCDMEM+pos+i));
}
I2cStop();
Delay(100);
FRAM_SCL_OUT |= FRAM_SCL;
FRAM_SDA_OUT |= FRAM_SDA;
if(ErrIndication)
{
j++;
if(j<3) goto OperRestar;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -