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

📄 i2c.c

📁 dsp在音频处理中的运用
💻 C
字号:

#include <soc.h>
#include <csl_i2c.h>
#include <Osk5912.h>
#include <stdio.h>
#define  OSK5912_POWER_I2C_ADDR  0x48
//#define  I2C_DATA   *( volatile unsigned short * )0xFFFB381C
#define  OSK5912_I2C_MODE_SADP       3   // (S)tart..(A)ddr..(D)ata..(n)..sto(P)
//#define  OSK5912_I2C_MODE_SADD       2   // (S)tart..(A)ddr..(D)ata..(n)..(D)ata
//#define  CMD(ENABLE) (CSL_I2C_CMD_##ENABLE)
CSL_I2cObj      i2cObj;
void sI2c_init(CSL_I2cHandle* shI2c);
void    I2C_init(CSL_I2cHandle   hI2c);
/*Int16   OSK5912_LED(Uint8 regnum,Uint8 regval);*/
void    OSK5912_LED_on(CSL_I2cHandle   hI2c);
void    OSK5912_LED_off(CSL_I2cHandle   hI2c);
Int16   OSK5912_POWER_rget(CSL_I2cHandle   hI2c, Uint8 regnum, Uint8 *regval );
Int16   OSK5912_POWER_rset(CSL_I2cHandle   hI2c, Uint8 regnum, Uint8 regval );
void    OSK5912_LED_toggle(CSL_I2cHandle   hI2c);
Uint16  OSK5912_I2C_write(CSL_I2cHandle hI2c,Uint16 slave_addr,Uint8* data,Uint16 length);
Uint16  OSK5912_I2C_read(CSL_I2cHandle hI2c,Uint16 slave_addr,Uint8* data,Uint16 length);

//CSL_I2cHandle   hI2c;
//CSL_I2cObj      i2cObj;

//CSL_Status          status;

void I2C_test()
{  Uint16 i,j,b;
    CSL_I2cHandle   hI2c;
	sI2c_init(&hI2c);
   //CSL_I2cObj      i2cObj;
   //CSL_Status          status;
   //CSL_i2cInit(NULL);
   //hI2c = CSL_i2cOpen(&i2cObj, CSL_I2C_1, NULL, &status);
   
   I2C_init(hI2c);
   //OSK5912_LED(0x10,0x22);/*shut on D3*/
   OSK5912_LED_off(hI2c);
   //OSK5912_LED(0x10,0x20);
   for(b=0;b<=100;b++)
   {
    OSK5912_LED_toggle(hI2c);
    
	for(i=0;i<=1000;i++)
	   for(j=0;j<=500;j++)
	   {
	   }
   }
   CSL_i2cClose(hI2c);
}



void I2C_init(CSL_I2cHandle   hI2c)
{   
    CSL_I2cHwSetup      i2csetup;
    CSL_I2cClkSetup     clksetup;
	
    
    Uint16    response = 0x0;
    i2csetup.mode = CSL_I2C_MODE_MASTER;
	i2csetup.dir = CSL_I2C_DIR_TRANSMIT;
	i2csetup.addrMode = CSL_I2C_ADDRSZ_SEVEN;
	i2csetup.endianess = CSL_I2C_ENDIAN_LITTLE;
	i2csetup.sttbyteen = CSL_I2C_STB_DISABLE;
	i2csetup.ownaddr = 0xcc;
	i2csetup.txdmaen = CSL_I2C_TX_DMA_DISABLE;
	i2csetup.rxdmaen = CSL_I2C_RX_DMA_DISABLE;
	i2csetup.inten = 0x00;
	clksetup.prescalar = 0;
	clksetup.clklowdiv = 9;
	clksetup.clkhighdiv = 9;
    i2csetup.clksetup = &clksetup;
    
    *(Uint32 *) 0xFFFECE08 |= 0x6; /*ARM_IDLECT2 ARMXOR Clk */
    //CSL_i2cInit(NULL);
    //sI2c_init(&hI2c);
    /* Open the peripheral */
    //hI2c = CSL_i2cOpen(&i2cObj, CSL_I2C_1, NULL, &status);
    
    CSL_i2cHwControl(hI2c,CSL_I2C_CMD_RESET ,NULL);
       

	/* Enable I2c */
   CSL_i2cHwControl(hI2c,CSL_I2C_CMD_ENABLE,NULL); 

    /* Wait for the reset completion */
    
    do {
	    if (CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_RDONE, &response) != CSL_SOK){
            printf("Error reading the status\n");
            return ;
        }
    }while(response != CSL_I2C_RESET_DONE);

	/* Setup the I2C module */
	CSL_i2cHwSetup(hI2c, &i2csetup); 
	CSL_i2cHwControl(hI2c,CSL_I2C_CMD_ENABLE,NULL);
   //CSL_i2cClose(hI2c);
}

void sI2c_init(CSL_I2cHandle* shI2c)
{ CSL_Status          status;
   CSL_i2cInit(NULL);
  * shI2c=CSL_i2cOpen(&i2cObj, CSL_I2C_1, NULL, &status);

}
void OSK5912_LED_off(CSL_I2cHandle   hI2c)
{
    Uint8 regval;

    /* Turn D3 - OFF * TPS65010 GPIO2 control*/
    
   
        OSK5912_POWER_rget(hI2c, 0x10, &regval );
        OSK5912_POWER_rset(hI2c, 0x10, 0xDD & regval );

}


void OSK5912_LED_on(CSL_I2cHandle   hI2c)
{
    Uint8 regval;

    /* Turn D3 - ON */
    
    
     OSK5912_POWER_rget(hI2c, 0x10, &regval );
     OSK5912_POWER_rset(hI2c, 0x10, 0x22 | regval );
    
   
}


Int16 OSK5912_POWER_rget(CSL_I2cHandle   hI2c, Uint8 regnum, Uint8 *regval )
{
    Uint16 status = 0;
    Uint8 buffer8[1];

    buffer8[0] = regnum;

    status |= OSK5912_I2C_write(hI2c, OSK5912_POWER_I2C_ADDR, buffer8, 1 );
    status |= OSK5912_I2C_read(hI2c,OSK5912_POWER_I2C_ADDR, buffer8, 1 );

    *regval = buffer8[0];

    return status;
}

Int16 OSK5912_POWER_rset(CSL_I2cHandle   hI2c, Uint8 regnum, Uint8 regval )
{
    Uint8 buffer8[2];
    buffer8[0] = regnum;
    buffer8[1] = regval;

    return OSK5912_I2C_write(hI2c, OSK5912_POWER_I2C_ADDR, buffer8, 2 );
}

/*Int16 OSK5912_LED(Uint8 regnum,Uint8 regval)
{  Uint8 buffer[2];
   buffer[0]=regnum;
   buffer[1]=regval;
   return OSK5912_I2C_write(OSK5912_POWER_I2C_ADDR,buffer,2);
}*/


void OSK5912_LED_toggle(CSL_I2cHandle   hI2c)
{  /*Uint8 regval;*/
   /*OSK5912_POWER_rget(0x10,&regval);*/
  /* Uint8 buffer[1];
   buffer[0]=0x10;
   OSK5912_I2C_write(OSK5912_POWER_I2C_ADDR,buffer,1);
   OSK5912_I2C_read(OSK5912_POWER_I2C_ADDR,buffer,1);
   regval=buffer[0];
   if(regval&0x02==0)*/
        /*OSK5912_LED(0x10,0x22);*/  /*shut on D3*/
   /*else OSK5912_LED(0x10,0x20);*/ /*shut off d3*/
  
  
  
    Uint8 regval; 
	OSK5912_POWER_rget(hI2c, 0x10, &regval );
        if ( ( ( regval & 0x20 ) == 0 ) || ( ( regval & 0x02 ) == 0 ) )
            OSK5912_LED_on(hI2c);
        else
            OSK5912_LED_off(hI2c);

}


Uint16 OSK5912_I2C_write(CSL_I2cHandle hI2c,Uint16 slave_addr,Uint8* data,Uint16 length)
{  	
    //CSL_I2cHandle   hI2c;
	//CSL_I2cObj      i2cObj;
    Uint16 *pdata =(Uint16*)data;    //saaddr=0x48;
    Uint16 last_byte=(data[length-1]&0xFF);
	//Uint16 status;
	Int16  i, timecount,timeout=0x1000;
	Uint16 response;
	Uint16 cmdclear;
	//Uint16 cmden;
	//CSL_i2cInit(NULL);
	//hI2c = CSL_i2cOpen(&i2cObj, CSL_I2C_1, NULL, NULL);
    CSL_i2cHwControl(hI2c,CSL_I2C_CMD_SET_SLAVE_ADDR,(Uint16*)&slave_addr);
    //I2C_SA = slave_addr; 

 
    CSL_i2cHwControl(hI2c,CSL_I2C_CMD_SET_DATA_COUNT,(Uint16*)&length); 
    //I2C_CNT = length;
   
	/* Wait for the transfer to start */
   do{
        if (CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_BUS_BUSY, &response) != CSL_SOK){
            printf("Error reading bus busy status\n");
            return 0;
        }
    }while(response == CSL_I2C_BUS_BUSY);
    //CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_BUS_BUSY, &response);

	/*for ( i = 0 ; respon == CSL_I2C_BUS_BUSY ; i++ )
	  { CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_BUS_BUSY, &response);
        if ( i > timeout )
		   { CSL_i2cClose(hI2c);
            return 2001;
			}
      }*/
     /*for ( i = 0 ; I2C_STAT & I2C_STAT_BB ; i++ )
        if ( i > timeout )
            return 2001;*/
	//cmden=CMD(ENABLE)|CMD(MODE_MASTER)|CMD(DIR_TRANSMIT);
	//CSL_i2cHwControl(hI2c,cmden,NULL);
	//I2C_CON = 0;
	printf("succss\n");
	CSL_i2cHwControl(hI2c,CSL_I2C_CMD_ENABLE,NULL);
	CSL_i2cHwControl(hI2c,CSL_I2C_CMD_MODE_MASTER,NULL);
    CSL_i2cHwControl(hI2c,CSL_I2C_CMD_DIR_TRANSMIT,NULL);
	/*I2C_CON = 0
             |I2C_CON_I2C_EN    // I2C Enable
             |I2C_CON_MST       // Master Mode
             |I2C_CON_TX        // Transmit Mode
             ;*/
	CSL_i2cHwControl(hI2c,CSL_I2C_CMD_START,NULL);
	CSL_i2cHwControl(hI2c,CSL_I2C_CMD_STOP,NULL);
	//I2C_CON |= OSK5912_I2C_MODE_SADP;


	 for ( timecount = 0 ; timecount < timeout ; timecount++ )
    {
        /* Read I2C Status register */
       // status = I2C_STAT;
          
        /* Check for NACK */
		CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_NACK, &response);
		//status = I2C_STAT;
        if ( response != 0x0001 )
		//if(( status & I2C_STAT_NACK ) != I2C_STAT_NACK)
        {
            /* Check for ARDY */
            CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);
			
            if ( response != CSL_I2C_ACS_READY )
			//if(( status & I2C_STAT_ARDY ) != I2C_STAT_ARDY)
            {
                /* Check for XRDY */
				CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_TX_RDY, &response);
                if ( response == CSL_I2C_TX_READY )
				//if(( status & I2C_STAT_XRDY ) == I2C_STAT_XRDY)
                {
                                   /* Send Data */
                    if ( length == 1 )
                    {
                        //I2C_DATA = last_byte;
						CSL_i2cWrite(hI2c, &last_byte);
                        length--;
                    }
                    else
                    {
                        CSL_i2cWrite(hI2c,pdata) ;
						//I2C_DATA = *pdata++;
						pdata++;
                        length -= 2;
                    }

                    /* Clear Transmit Ready field */
                    //I2C_STAT &= I2C_STAT_XRDY;
					do{cmdclear=CSL_I2C_CLEAR_XRDY;
					   CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmdclear);
					   CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_TX_RDY, &response);
                       }
					while(response==CSL_I2C_TX_READY);
                }
            }

            /* Check for Errors - refresh status register */
            //status = I2C_STAT;

            /* Check for Arbitration Lost */
			//status = I2C_STAT;
			CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_AL, &response);
            if ( response == CSL_I2C_ARBITRATION_LOST  )
			//if(( status  & I2C_STAT_AL ) == I2C_STAT_AL)
            {   //CSL_i2cClose(hI2c);
                //I2C_STAT &= I2C_STAT_AL;
                return 1001;
            }

            /* Check for NACK */
			CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_NACK, &response);
            if ( CSL_I2C_QUERY_NACK == 0x0001 )
			//if(( status & I2C_STAT_NACK ) == I2C_STAT_NACK)
            {   //CSL_i2cClose(hI2c);
                //I2C_STAT &= I2C_STAT_NACK;
                return 1002;
            }

            /* Check for Register Access Ready - Good Condition */
            CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);
            if ( response == CSL_I2C_ACS_READY )
            {   do{cmdclear=CSL_I2C_CLEAR_ARDY;
			       CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmdclear);
				   CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);}
				   while(response==CSL_I2C_ACS_READY);
                //CSL_i2cClose(hI2c);
                //I2C_STAT &= I2C_STAT_ARDY;
                return 0;
            }
			/*if ( ( I2C_STAT & I2C_STAT_ARDY ) == I2C_STAT_ARDY )
            {
                I2C_STAT &= I2C_STAT_ARDY;
                return 0;
            }*/
        }
    }
    //CSL_i2cClose(hI2c);
    /* I2C Timeout */
    return 2002;
}

Uint16 OSK5912_I2C_read(CSL_I2cHandle hI2c, Uint16 slave_addr, Uint8* data, Uint16 length )
{
    Uint16 *pdata = ( Uint16 * )data;
    //Uint16 status;
    Int16 i, timecount, timeout = 0x1000;
    Uint16 response;
    Uint16 cmdclear;
    /* Set slave address */
    //I2C_SA = slave_addr;
    CSL_i2cHwControl(hI2c,CSL_I2C_CMD_SET_SLAVE_ADDR,&slave_addr);
    /* Set data count */
    //I2C_CNT = length;
   CSL_i2cHwControl(hI2c,CSL_I2C_CMD_SET_DATA_COUNT,&length);
    /* Poll BB field on I2C_STAT - Wait for bus to become free */
    /*for ( i = 0 ; I2C_STAT & I2C_STAT_BB ; i++ )
        if ( i > timeout )
            return 2001;*/
    do{
        if (CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_BUS_BUSY, &response) != CSL_SOK){
            printf("Error reading bus busy status\n");
            return 0;
        }
    }while(response == CSL_I2C_BUS_BUSY);

    /* Configure Options for Receiving - Master Reciever mode */
    /*I2C_CON = 0
            | I2C_CON_I2C_EN    // I2C Enable
            | I2C_CON_MST       // Master Mode
            | I2C_CON_RX        // Receive Mode
            ;*/
	 CSL_i2cHwControl(hI2c,CSL_I2C_CMD_ENABLE,NULL);
     CSL_i2cHwControl(hI2c,CSL_I2C_CMD_MODE_MASTER,NULL);
     CSL_i2cHwControl(hI2c,CSL_I2C_CMD_DIR_RECEIVE,NULL);

    /*  Set mode:
     *  OSK5912_I2C_MODE_SADP // (S)tart..(A)ddr..(D)ata..(n)..sto(P)
     *  OSK5912_I2C_MODE_SADD // (S)tart..(A)ddr..(D)ata..(n)..(D)ata */
    //I2C_CON |= OSK5912_I2C_MODE_SADP;
	CSL_i2cHwControl(hI2c,CSL_I2C_CMD_START,NULL);
	CSL_i2cHwControl(hI2c,CSL_I2C_CMD_STOP,NULL);


    /* Poll until complete */
    for ( timecount = 0 ; timecount < timeout ; timecount++ )
    {
        /* Read I2C Status register */
        //status = I2C_STAT;

        /* Check for NACK */
		CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_NACK, &response);
        //if ( ( status & I2C_STAT_NACK ) != I2C_STAT_NACK )
		if ( response != 0x0001 )
        {
            /* Check for ARDY */

            //if ( ( status & I2C_STAT_ARDY ) != I2C_STAT_ARDY )
			CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);
			if ( response != CSL_I2C_ACS_READY )
            {
                /* Check for RRDY */
                //if ( ( status & I2C_STAT_RRDY ) == I2C_STAT_RRDY )
				CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_RX_RDY, &response);
                if ( response == CSL_I2C_RX_READY )
                {
                    /* Read Data */
                    if ( length == 1 )
                    {
                        //*pdata = I2C_DATA & 0xFF;
						CSL_i2cRead(hI2c,pdata);
						*pdata=*pdata&0xFF;
                        length--;
                    }
                    else
                    {
                        //*pdata++ = I2C_DATA;
						CSL_i2cRead(hI2c,pdata);
						pdata++;
                        length -= 2;
                    }

                    /* Clear Receive Ready field */
                    //I2C_STAT &= I2C_STAT_RRDY;
				do{cmdclear=CSL_I2C_CLEAR_RRDY;
				   CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmdclear);
				   CSL_i2cGetHwStatus(hI2c, CSL_I2C_QUERY_RX_RDY, &response);}
				   while(response==CSL_I2C_RX_READY);
                }
            }

            /* Check for Errors - refresh status register */
            //status = I2C_STAT;

            /* Check for Arbitration Lost */
			CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_AL, &response);
            //if ( ( status  & I2C_STAT_AL ) == I2C_STAT_AL )
            if ( response == CSL_I2C_ARBITRATION_LOST )
            {
                //I2C_STAT &= I2C_STAT_AL;
                return 1001;
            }

            /* Check for NACK */
			CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_NACK, &response);
            //if ( ( status & I2C_STAT_NACK ) == I2C_STAT_NACK )
            if ( response == 0x0001 )
            {
                //I2C_STAT &= I2C_STAT_NACK;
                return 1002;
            }

            /* Check for Register Access Ready - Good Condition */
            //if ( ( I2C_STAT & I2C_STAT_ARDY ) == I2C_STAT_ARDY )
			CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);//why ARDY!=1?  
            if ( response == CSL_I2C_ACS_READY )
            {   do{cmdclear=CSL_I2C_CLEAR_ARDY;
			       CSL_i2cHwControl(hI2c,CSL_I2C_CMD_CLEAR_STATUS,&cmdclear);
				   CSL_i2cGetHwStatus(hI2c,CSL_I2C_QUERY_ACS_RDY, &response);}
				   while(response==CSL_I2C_ACS_READY);
            /*{
                I2C_STAT &= I2C_STAT_ARDY;
                return 0;
            }*/
              return 0;
			}
        
        }
    }

    /* I2C Timeout */
    return 2002;
}

⌨️ 快捷键说明

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