⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_con.c

📁 美上美fea397 FM/AM车载收音模块(tda7540芯片)控制源码
💻 C
📖 第 1 页 / 共 2 页
字号:

#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 + -