📄 i2c_con.c
字号:
#include "def.h"
#include "2410ADDR.h"
#include "Audio_def.h"
#define Addr_PCA9554 0x20
#define Addr_PCA9554test 0x21
#define Addr_TMP75 0x49
#define M_N_PCA9554 0
#define M_P_PCA9554 1
#define GPS_Power_PCA9554 2
//#define DVD_LED_PCA9554 3
#define ACC_PCA9554 3
#define ST_By_PCA9554 4
#define MUTE_PCA9554 5
#define ANT_PCA9554 7
#define Addr_M52795 0x48
#define Radio_M52795 0
#define DVD_M52795 1
#define CDC_M52795 2
#define AUX_M52795 3
void MUTE_Lc75412_M52795(U8 statu);
static char M52795_DATA[2]={0x31,0x31};//初始状态,选通通道2到输出口,附加I/O控制信号设为1.
static char PCA9554_DATA=0x00;
extern unsigned short car_MainVolume;
void AudioMUTE_out1_M52795(U8 statu);
void AudioMUTE_ALL_M52795(U8 statu);
U8 G_ShowI2C_Info = 0;
BOOL WriteI2C_NULLSubAddr(char *Pdata0,U16 len,U8 ChipAddr)
{U16 i,j=0;
BOOL I2C_ACK;
U16 statu=1;
char *Pdata;
if(len==0)return;
do { statu=1;
Pdata=Pdata0;
SDA_H;
Delay10clk();
SCL_H;
Delay10clk();
SDA_L;
Delay10clk();
SCL_L;//Start I2C
Delay10clk();
if(!WriteI2C_bus( (char)((ChipAddr<<1)&0xfe) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30) continue;
}
for(i=0;i<len;i++)
{//WriteI2C_bus( *Pdata++ );
if(!WriteI2C_bus( *Pdata++ ))
{statu=0;j++;
if(j<30)break;
}
}
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
//hexbcd(640,280,statu,0x0000,0xffff);
}while(statu==0&&j<30);
if(statu==0)
{
if(G_ShowI2C_Info){
hexbcd(640,300,j,0x0000,0xffff);
lcdprinth(300,280,"I2C write failed!",0x0000,0xffff);}
return FALSE;
}
else
{
if(G_ShowI2C_Info)
lcdprinth(300,280,"I2C write success!",0xffff,0x0000);
return TRUE;
}
}
BOOL WriteI2C_SubAddrU8(char *Pdata0,U16 len,U8 subAddr,U8 ChipAddr)
{U16 i,j=0;
BOOL I2C_ACK;
U16 statu=1;
char *Pdata;
if(len==0)return;
do { statu=1;
Pdata=Pdata0;
SDA_H;
Delay10clk();
SCL_H;
Delay10clk();
SDA_L;
Delay10clk();
SCL_L;//Start I2C
Delay10clk();
if(!WriteI2C_bus( (char)((ChipAddr<<1)&0xfe) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30) continue;
}
if(!WriteI2C_bus(subAddr))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
continue;
}
for(i=0;i<len;i++)
{//WriteI2C_bus( *Pdata++ );
if(!WriteI2C_bus( *Pdata++ ))
{statu=0;j++;
if(j<30)break;
}
}
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
//hexbcd(640,280,statu,0x0000,0xffff);
}while(statu==0&&j<30);
if(statu==0)
{
if(G_ShowI2C_Info){
hexbcd(640,300,j,0x0000,0xffff);
lcdprinth(300,280,"I2C write failed!",0x0000,0xffff);}
return FALSE;
}
else
{
if(G_ShowI2C_Info)
lcdprinth(300,280,"I2C write success!",0xffff,0x0000);
return TRUE;
}
}
BOOL WriteI2C_SubAddrU16(char *Pdata0,U16 len,U16 subAddr,U8 ChipAddr)
{U16 i,j=0;
BOOL I2C_ACK;
U16 statu=1;
char *Pdata;
if(len==0)return;
do { statu=1;
Pdata=Pdata0;
SDA_H;
Delay10clk();
SCL_H;
Delay10clk();
SDA_L;
Delay10clk();
SCL_L;//Start I2C
Delay10clk();
if(!WriteI2C_bus( (char)((ChipAddr<<1)&0xfe) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30) continue;
}
if(!WriteI2C_bus((char)(subAddr>>8)))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30)continue;
}
if(!WriteI2C_bus((char)(subAddr)))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30)continue;
}
for(i=0;i<len;i++)
{//WriteI2C_bus( *Pdata++ );
if(!WriteI2C_bus( *Pdata++ ))
{statu=0;j++;
if(j<30)break;
}
}
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
//hexbcd(640,280,statu,0x0000,0xffff);
}while(statu==0&&j<30);
if(statu==0)
{
if(G_ShowI2C_Info){
hexbcd(640,300,j,0x0000,0xffff);
lcdprinth(300,280,"I2C write failed!",0x0000,0xffff);}
return FALSE;
}
else
{
if(G_ShowI2C_Info)
lcdprinth(300,280,"I2C write success!",0xffff,0x0000);
return TRUE;
}
}
BOOL ReadI2C_NULLSubAddr(char *Pdata0,U16 len,U8 ChipAddr)
{U16 i,j=0;U16 statu;
char *Pdata;
if(len==0)return;
do{statu=1;
Pdata=Pdata0;
SDA_H;
Delay10clk();
SCL_H;
Delay10clk();
SDA_L;
Delay10clk();
SCL_L;//Start I2C
Delay10clk();
if(!WriteI2C_bus( (char)((ChipAddr<<1)|0x01) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30) continue;
}
for(i=0;i<len;i++)
ReadI2C_bus( Pdata++ );
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H; Delay10clk();
}while(statu==0&&j<30);
if(statu==0)
{
if(G_ShowI2C_Info)
lcdprinth(200,300,"I2C reading failed!",0x0000,0xffff);
return FALSE;
}
else
{
if(G_ShowI2C_Info)
lcdprinth(200,300,"I2C reading success!",0xffff,0x0000);
return TRUE;
}
}
BOOL ReadI2C_SubAddrU8(char *Pdata0,U16 len,U8 subAddr,U8 ChipAddr)
{U16 i,j=0;U16 statu;
char *Pdata;
#if DebugInf_On
lcdprinth(200,300,"I2C reading start! ",0xffff,0x0000);
#endif
if(len==0)return;
do{statu=1;
Pdata=Pdata0;
SDA_H;
Delay10clk();
SCL_H;
Delay10clk();
SDA_L;
Delay10clk();
SCL_L;//Start I2C
Delay10clk();
if(!WriteI2C_bus( (char)((ChipAddr<<1)&0xfe) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30) continue;
}
if(!WriteI2C_bus(subAddr))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30)continue;
}
SDA_H;
Delay10clk();
SCL_H;
Delay10clk();
SDA_L;
Delay10clk();
SCL_L;//ReStart I2C
Delay10clk();
if(!WriteI2C_bus( (char)((ChipAddr<<1)|0x01) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30)continue;
}
for(i=0;i<len;i++)
ReadI2C_bus( Pdata++ );
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H; Delay10clk();
}while(statu==0&&j<30);
if(statu==0)
{
if(G_ShowI2C_Info)
lcdprinth(200,300,"I2C reading failed!",0x0000,0xffff);
return FALSE;
}
else
{
if(G_ShowI2C_Info)
lcdprinth(200,300,"I2C reading success!",0xffff,0x0000);
return TRUE;
}
}
BOOL ReadI2C_SubAddrU16(char *Pdata0,U16 len,U16 subAddr,U8 ChipAddr)
{U16 i,j=0;U16 statu;
char *Pdata;
if(len==0)return;
do{statu=1;
Pdata=Pdata0;
SDA_H;
Delay10clk();
SCL_H;
Delay10clk();
SDA_L;
Delay10clk();
SCL_L;//Start I2C
Delay10clk();
if(!WriteI2C_bus( (char)((ChipAddr<<1)&0xfe) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30)continue;
}
if(!WriteI2C_bus( (char)(subAddr>>8) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30)continue;
}
if(!WriteI2C_bus( (char)(subAddr) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30)continue;
}
SDA_H;
Delay10clk();
SCL_H;
Delay10clk();
SDA_L;
Delay10clk();
SCL_L;//ReStart I2C
Delay10clk();
if(!WriteI2C_bus( (char)((ChipAddr<<1)|0x01) ))
{statu=0;j++;
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H;
Delay10clk();
if(j<30)continue;
}
for(i=0;i<len;i++)
ReadI2C_bus( Pdata++ );
SDA_L;//Stop I2C
Delay10clk();
SCL_H;
Delay10clk();
SDA_H; Delay10clk();
}while(statu==0&&j<30);
if(statu==0)
{
if(G_ShowI2C_Info)
lcdprinth(200,300,"I2C reading failed!",0x0000,0xffff);
return FALSE;
}
else
{
if(G_ShowI2C_Info)
lcdprinth(200,300,"I2C reading success!",0xffff,0x0000);
return TRUE;
}
}
/****************************************************/
void Init_PCA9554(void)
{
char buf[2];
//configure OutputReg
buf[0]=0x01;//命令字节.
buf[1]=PCA9554_DATA;
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
//configure I/O_configureReg]
buf[0]=0x3;
buf[1]=0x00;
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
// Uart_Printf("PCA9554 init over");
}
void DVD_MotorCtrl_PCA9554(U8 statu)
{char buf[2];
if(statu==0)//M+ 0; M- 0
PCA9554_DATA&=0xfc;
else if(statu==1)//M+ 1; M- 0
{PCA9554_DATA&=0xfc;PCA9554_DATA|=0x2;}
else if(statu==2)//M+ 0; M- 1
{PCA9554_DATA&=0xfc;PCA9554_DATA|=0x1;}
buf[0]=0x01;//命令字节.
buf[1]=PCA9554_DATA;
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
}
void GPS_PowerCtrl_PCA9554(U8 statu)//假定输出为1时上电..
{char buf[2];
if(statu==0)
PCA9554_DATA&=~(1<<GPS_Power_PCA9554);
else if(statu==1)
{PCA9554_DATA|=(1<<GPS_Power_PCA9554);}
buf[0]=0x01;//命令字节.
buf[1]=PCA9554_DATA;
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
}
/*void DVD_LoadLED_Ctrl_PCA9554(U8 statu)
{char buf[2];
if(statu==0)
PCA9554_DATA&=~(1<<DVD_LED_PCA9554);//三极管导通.
else if(statu==1)
{PCA9554_DATA|=(1<<DVD_LED_PCA9554);}//三极管截止.
buf[0]=0x01;//命令字节.
buf[1]=PCA9554_DATA;
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554);
WriteI2C_NULLSubAddr(buf,2,Addr_PCA9554test);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -