📄 lib.c
字号:
/*********************************************************
Project: ST FST(TDA7540)
File name: Lib.c
Description:
Write/Modify: Perry
Time: 2005-11-22- 11:07:07
*********************************************************/
#include "public.h"
/*********************************************
Function: I2CStart
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:14:50
*********************************************/
void I2CStart(void)
{
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
Pin_SW_I2CData=1;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CData=0;
M_WAIT;
Pin_SW_I2CClk=0;
M_WAIT;
}
/*********************************************
Function: I2CStop
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:14:54
*********************************************/
void I2CStop(void)
{
unsigned char i;
PD_SW_I2CClk=0;
Pin_SW_I2CClk=1;
//while(!Pin(Pin_I2CClk, PIN_READ));
for(i=0;(i<20)&&(!PinIn_SW_I2CClk);i++)Wait10us(1);
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
Pin_SW_I2CData=0;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CData=1;
M_WAIT;
}
//zengdm add for touch panel.
void init_I2C(void)
{
unsigned char i;
Pin_SW_I2CClk = 1;
Pin_SW_I2CData = 1;
I2CStop();
}
/*********************************************
Function: I2COut8Bit
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:14:59
*********************************************/
unsigned char I2COut8Bit(unsigned char outbyte)
{
unsigned char i;
unsigned int j;
UCharField temp;
temp.byte=outbyte;
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
#if 1
for(i=0x80;i>0;i>>=1)
{
Pin_SW_I2CClk=0;
M_WAIT;
if(outbyte&i)
Pin_SW_I2CData=1;
else
Pin_SW_I2CData=0;
M_WAIT;
M_WAIT;
M_WAIT;
/*if(i==0x80)
{
PD_SW_I2CClk=0;
for(j=0;((j<1) && (!Pin_SW_I2CClk));j++);
PD_SW_I2CClk=1;
}*/
Pin_SW_I2CClk=1;
M_WAIT;
}
#else
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B7;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B6;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B5;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B4;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B3;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B2;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B1;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
Pin_SW_I2CData=temp.field.B0;
Pin_SW_I2CClk=1;
M_WAIT;
#endif
Pin_SW_I2CClk=0;
PD_SW_I2CData=0;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
if(Pin_SW_I2CData)
i=0;
else
i=1;
Pin_SW_I2CClk=0;
M_WAIT;
return(i);
}
/*********************************************
Function: I2CIn8Bit
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:15:02
*********************************************/
unsigned char I2CIn8Bit(void)
{
unsigned char i,inbyte=0;
PD_SW_I2CClk=0;
Pin_SW_I2CClk=1;
//while(!Pin(Pin_I2CClk, PIN_READ));
for(i=0;(i<20)&&(!PinIn_SW_I2CClk);i++)Wait10us(1);
PD_SW_I2CClk=1;
PD_SW_I2CData=0;
for(i=0x80;i>0;i>>=1)
{
Pin_SW_I2CClk=1;
M_WAIT;
if(PinIn_SW_I2CData)
inbyte|=i;
Pin_SW_I2CClk=0;
M_WAIT;
}
return (inbyte);
}
//zengdm add for touch panel.
int I2CIn16Bit(void)
{
unsigned char i;
int inbyte=0;
PD_SW_I2CClk=0;
Pin_SW_I2CClk=1;
//while(!Pin(Pin_I2CClk, PIN_READ));
for(i=0;(i<20)&&(!PinIn_SW_I2CClk);i++)Wait10us(1);
PD_SW_I2CClk=1;
PD_SW_I2CData=0;
for(i=0x8000;i>0;i>>=1)
{
Pin_SW_I2CClk=1;
M_WAIT;
if(PinIn_SW_I2CData)
inbyte|=i;
Pin_SW_I2CClk=0;
M_WAIT;
}
return (inbyte);
}
/*********************************************
Function: I2CAck
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:15:04
*********************************************/
void I2CAck(void)
{
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
Pin_SW_I2CData=0;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
PD_SW_I2CData=0;
M_WAIT;
}
/*********************************************
Function: I2CNAck
Description:
Write/Modify: Perry.Liang
Time: 2004-11-11- 12:15:05
*********************************************/
void I2CNAck(void)
{
PD_SW_I2CClk=1;
PD_SW_I2CData=1;
Pin_SW_I2CData=1;
M_WAIT;
Pin_SW_I2CClk=1;
M_WAIT;
Pin_SW_I2CClk=0;
PD_SW_I2CData=0;
M_WAIT;
}
/*********************************************
Function: I2C2Start
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:06
*********************************************/
void I2C2Start(void)
{
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
Pin_SW2_I2CData=1;
M_WAIT;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CData=0;
M_WAIT;
Pin_SW2_I2CClk=0;
M_WAIT;
}
/*********************************************
Function: I2C2Stop
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:05
*********************************************/
void I2C2Stop(void)
{
unsigned char i;
PD_SW2_I2CClk=0;
Pin_SW2_I2CClk=1;
for(i=0;(i<20)&&(!PinIn_SW2_I2CClk);i++)Wait10us(1);
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
Pin_SW2_I2CData=0;
M_WAIT;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CData=1;
M_WAIT;
}
/*********************************************
Function: I2C2Out8Bit
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:03
*********************************************/
unsigned char I2C2Out8Bit(unsigned char outbyte)
{
unsigned char i;
unsigned int j;
UCharField temp;
temp.byte=outbyte;
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
#if 1
for(i=0x80;i>0;i>>=1)
{
Pin_SW2_I2CClk=0;
if(outbyte&i)
Pin_SW2_I2CData=1;
else
Pin_SW2_I2CData=0;
M_WAIT;
/*if(i==0x80)
{
PD_SW_I2CClk=0;
for(j=0;((j<1) && (!Pin_SW_I2CClk));j++);
PD_SW_I2CClk=1;
}*/
Pin_SW2_I2CClk=1;
M_WAIT;
}
#else
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B7;
/*PD_SW2_I2CClk=0;
Pin_SW2_I2CClk=1;
for(i=0;(i<20)&&(!PinIn_SW2_I2CClk);i++)Wait10us(1);
PD_SW2_I2CClk=1;*/
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B6;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B5;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B4;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B3;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B2;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B1;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
Pin_SW2_I2CData=temp.field.B0;
Pin_SW2_I2CClk=1;
M_WAIT;
#endif
Pin_SW2_I2CClk=0;
PD_SW2_I2CData=0;
M_WAIT;
Pin_SW2_I2CClk=1;
M_WAIT;
if(PinIn_SW2_I2CData)
i=0;
else
i=1;
Pin_SW2_I2CClk=0;
M_WAIT;
return(i);
}
/*********************************************
Function: I2C2In8Bit
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:02
*********************************************/
unsigned char I2C2In8Bit(void)
{
unsigned char i,inbyte=0;
PD_SW2_I2CClk=0;
Pin_SW2_I2CClk=1;
for(i=0;(i<20)&&(!PinIn_SW2_I2CClk);i++)Wait10us(1);
PD_SW2_I2CClk=1;
PD_SW2_I2CData=0;
for(i=0x80;i>0;i>>=1)
{
Pin_SW2_I2CClk=1;
M_WAIT;
if(PinIn_SW2_I2CData)
inbyte|=i;
Pin_SW2_I2CClk=0;
M_WAIT;
}
return (inbyte);
}
/*********************************************
Function: I2C2Ack
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:01:00
*********************************************/
void I2C2Ack(void)
{
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
Pin_SW2_I2CData=0;
M_WAIT;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
PD_SW2_I2CData=0;
M_WAIT;
}
/*********************************************
Function: I2C2NAck
Description:
Write/Modify: Perry.Liang
Time: 2006-8-4- 10:00:56
*********************************************/
void I2C2NAck(void)
{
PD_SW2_I2CClk=1;
PD_SW2_I2CData=1;
Pin_SW2_I2CData=1;
M_WAIT;
Pin_SW2_I2CClk=1;
M_WAIT;
Pin_SW2_I2CClk=0;
PD_SW2_I2CData=0;
M_WAIT;
}
#ifdef D_STORE_DATA_IN_EEPROM
void Input(unsigned char val)
{
unsigned char i;
for(i = 0; i< 8;i++)
{
if(val & (0x01 << (7-i)))
Pin_SW_I2CData = 1;
else
Pin_SW_I2CData = 0;
M_WAIT;
Pin_SW_I2CClk = 1;
M_WAIT;
Pin_SW_I2CClk = 0;
M_WAIT;
}
Pin_SW_I2CData = 0;
M_WAIT;
Pin_SW_I2CClk = 1;
M_WAIT;
Pin_SW_I2CClk = 0;
M_WAIT;
}
unsigned char Output(void )
{
unsigned char i;
unsigned char ret;
PD_SW_I2CData = 0;
Wait10us(10);
for(i = 0; i< 8;i++)
{
Pin_SW_I2CClk = 0;
Wait10us(10);
Pin_SW_I2CClk = 1;
if(PinIn_SW_I2CData)
ret |= (0x01 << (7 - i));
else
ret &= ~(0x01 << (7 -i));
Wait10us(10);
}
return ret;
}
void EepromByteWrite(unsigned char addr,unsigned char subaddr,unsigned char datas)
{
I2CStart();
Input(addr);
Input(subaddr);
Input(datas);
I2CStop();
}
void EepromByteRead(unsigned char addr,unsigned char subaddr,unsigned char *p)
{
I2CStart();
Input(addr);
Input(subaddr);
I2CStart();
Input(addr+1);
*p = Output();
I2CNAck();
I2CStop();
}
#if 0
void EepromByteWrite(unsigned char addr,unsigned char subaddr,unsigned char datas)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -