i2c.c

来自「CS8955控制TV软件。用MCU做模拟电视的控制。」· C语言 代码 · 共 446 行

C
446
字号
/******************************************************************************\
     Project Version:   MTKCARDVD()
********************************************************************************
     Filename:          I2c.c

     Author:            Alan Chan

     Company:           CoreTek/ACT Company

********************************************************************************
     File Version:      1.01
     File Created:      July 2007

     Compiled Using:    keil uVision2 Version 2.23 

********************************************************************************
     Files Required:

********************************************************************************
     File Description:

********************************************************************************
     File History:

--------------------------------------------------------------------------------
  Date         Name           Description
--------------------------------------------------------------------------------
  Mar. 2007    Alan Chan    File Created
  
\******************************************************************************/
#include "global.h"

/****************************************************************************/
void Delay1us(WORD Time)             // delay
{
    for (;Time>0;Time--)
    {
      _nop_();_nop_();
    }	  

}

void Delay1ms(WORD Time)             // delay   1ms
{
	BYTE Counter;
   
	for(; Time > 0;   Time --)
	{
		Counter   = 250;
		while(--Counter)
			_nop_();
		Counter   = 250;
		while(--Counter)
			_nop_();
	}
}

/****************************************************************************/
//                                     Software IIC
/****************************************************************************/
//---------------------------------------------------------------------------
void IIC_Start(BIT ch)
{
    if (!ch)
    {
	ResSDA1;
	ResSCL1;
    }	
    else
    {
	ResSDA2;
	ResSCL2;
    }
}

//---------------------------------------------------------------------------
void IIC_Stop(BIT ch)
{
    if (!ch)
    {
	SetSDA1;
	ResSDA1;
	SetSCL1;
	while(!GetSCL1);
	SetSDA1;
    }
    else 
    {
	SetSDA2;
	ResSDA2;
	SetSCL2;
	while(!GetSCL2);
	SetSDA2;
    }
}

//---------------------------------------------------------------------------
void IIC_Send1Byte(BIT ch, BYTE senddata)
{
	BYTE i;

    if (!ch)
    {
	for(i = 0; i < 8; i++)
	{
		if(senddata & 0x80)
		{
	              SetSDA1;
		}	
		else
		{
 	    		ResSDA1;
		}	
		
		senddata <<=1;		

		SetSCL1;
        while(!GetSCL1);
		ResSCL1;	  
	}
	
	ResSCL1;
	SetSDA1;
	SetSCL1;
       while(!GetSCL1);

	if (GetSDA1)
	{
		bNoAck = 1;
	}	
	else
		bNoAck = 0;
	ResSCL1;
    }
    else
    {
	for(i = 0; i < 8; i++)
	{
		if(senddata & 0x80)
		{
	              SetSDA2;
		}	
		else
		{
 	    		ResSDA2;
		}	
		
		senddata <<=1;		

		SetSCL2;
              while(!GetSCL2);
		ResSCL2;	  
	}
	
	ResSCL2;
	SetSDA2;
	SetSCL2;
       while(!GetSCL2);

	if (GetSDA2)
		bNoAck = 1;
	else
		bNoAck = 0;
	ResSCL2;
    }
}

//---------------------------------------------------------------------------
BYTE IIC_Read1Byte(BIT ch, BIT noack)
{
	BYTE i,readdata=0;

    if (!ch)
    {
	for(i = 0; i < 8; i++)
	{
		readdata <<= 1;

		SetSDA1;
		SetSCL1;
		while(!GetSCL1);
//              Delay1us(1);

		if(GetSDA1)
			readdata |= 0x01;
		ResSCL1;
	}	
	if(noack)
	{
		SetSDA1;
	}	
	else
	{
		ResSDA1;
	}	

	SetSCL1;
// lun hahaha
      while(!GetSCL1);
	ResSCL1;
// lun hahaha
	if(!noack)
	{
		SetSDA1;
	}	
    }
    else
    {
	for(i = 0; i < 8; i++)
	{
		readdata <<= 1;

		SetSDA2;
		SetSCL2;
		while(!GetSCL2);
		
		if(GetSDA2)
			readdata |= 0x01;
		ResSCL2;
	}	
	if(noack)
	{
		SetSDA2;
	}	
	else
	{
		ResSDA2;
	}	

	SetSCL2;
      while(!GetSCL2);
	ResSCL2;
	if(!noack)
	{
		SetSDA2;
	}	
    }
	
    return readdata;

}

// lun hahaha
//---------------------------------------------------------------------------
BYTE IIC_ReadByte(BIT ch, BIT noack)
{
	BYTE i,readdata=0;

    if (!ch)
    {
	for(i = 0; i < 8; i++)
	{
		readdata <<= 1;

		SetSDA1;
		SetSCL1;
		while(!GetSCL1);
              Delay1us(1);

		if(GetSDA1)
			readdata |= 0x01;
		ResSCL1;
	}	
	if(noack)
	{
		SetSDA1;
	}	
	else
	{
		ResSDA1;
	}	

	SetSCL1;
    }

    return readdata;

}

/****************************************************************************/
//	IIC write address
/****************************************************************************/
void IICSW_Write(BIT ch, BYTE id,BOOL boolSubAddr,BYTE addr,BYTE *databuf,WORD number)
{
	int  i;
	BYTE  count = 0;

    do
    {
	count++;
  	// Stop
	IIC_Stop(ch);
    Delay1us(20);
	// Start
	IIC_Start(ch);
       // Slave ID	 
	IIC_Send1Byte(ch,id); 
       if (bNoAck)
       {
	    continue;
       }	
       // Address
       if(boolSubAddr)
       {
	    IIC_Send1Byte(ch,addr);
           if (bNoAck)
	        continue;
       } 
       // data
	for(i = 0; i < number; i++)
	{
		IIC_Send1Byte(ch,databuf[i]);
		if (bNoAck)
			break;
	}
       if (bNoAck)
	    continue;
    // Stop
	IIC_Stop(ch);
    }
    while(bNoAck && (count<10));
}

/****************************************************************************/
//	IIC Read address
/****************************************************************************/
void IICSW_Read(BIT ch, BYTE id,BOOL boolSubAddr,BYTE addr,BYTE *databuf,WORD number)
{
	int  i;
	BYTE  count = 0;

    do
    {
	count++;
       // Stop
	IIC_Stop(ch);
       Delay1us(20);
       // Start
       if(boolSubAddr)
       {
	    IIC_Start(ch);
           // Slave ID	
   	    IIC_Send1Byte(ch,id); 
           if (bNoAck)
	        continue;
           // Address
	    IIC_Send1Byte(ch,addr);
           if (bNoAck)
   	        continue;
	    if (!ch)
	    {
               SetSDA1;
               SetSCL1;
               while(!GetSCL1);
	    }
	    else
	    {
               SetSDA2;
               SetSCL2;
               while(!GetSCL2);
	    }
       }
	IIC_Start(ch);
       // Slave ID 
	IIC_Send1Byte(ch, (id | 0x01));
         if (bNoAck)
	    continue;
       // data
       if(boolSubAddr)
       {
	    for(i = 0; i < number-1; i++)
	    {
		databuf[i] = IIC_Read1Byte(ch,0);
	    }
	    databuf[i] = IIC_Read1Byte(ch,1);
       }
       else
	    databuf[0] = IIC_Read1Byte(ch,1);
 
       // Stop
	IIC_Stop(ch);
    }
    while(bNoAck && count < 10);
}

void IICSW_WriteTest(void)  //test martin 28May08
 {
/*
    	mSetDvdIr();
       Delay1ms(100);
		 mClrDvdIr();
        Delay1ms(100);
*/
                SetSCL1;
                SetSDA1;
		   
                mSetDvdIr();
				
          //      Delay1ms(100);
	//	Delay1ms(100);
	//     Delay1ms(20);
		 
			   ResSDA1;
			   ResSCL1;
			   mClrDvdIr();
		//	    Delay1ms(100);
		//	   Delay1ms(100);
		//	   Delay1ms(20);

			 SetSCL1;
                SetSDA1;
		   
                mSetDvdIr();
				
          //      Delay1ms(100);
	//	Delay1ms(100);
	//     Delay1ms(20);
			   ResSDA1;
			   ResSCL1;
			   mClrDvdIr();
		//	    Delay1ms(100);
		//	   Delay1ms(100);
		//	   Delay1ms(20);


			   SetSCL1;
                SetSDA1;
		   
                mSetDvdIr();
				
            //    Delay1ms(100);
	//	Delay1ms(100);
	//     Delay1ms(20);
			   ResSDA1;
			   ResSCL1;
			   mClrDvdIr();
		//	    Delay1ms(100);
		//	   Delay1ms(100);
		//	   Delay1ms(20); 

			  
}



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?