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

📄 davincievm_i2c.c

📁 TI的DM6446的硬件平台搭建的相关例子
💻 C
📖 第 1 页 / 共 2 页
字号:
        for ( i = 0 ; i < len ; i++ )
        {
            if ( i == 1 )
            {
                len = data[0];
                CSL_i2cHwControl( i2c_handle, CSL_I2C_CMD_SET_DATA_COUNT, &len );
            }

            timecount = 0;
            do
            {
                CSL_i2cGetHwStatus( i2c_handle, CSL_I2C_QUERY_RX_RDY, &response );

                timecount++;
                if ( timecount >= timeout )
                {
                    DAVINCIEVM_I2C_reset( );
                    return 1000;
                }

            } while( response == 0 );

            CSL_i2cRead( i2c_handle, &data[i] );
        }

      //CSL_i2cHwControl( i2c_handle, CSL_I2C_CMD_STOP, 0 );

        return 0;

}

/*使用EEPROM时IIC使用如下驱动*/
Int16 EEPROM_I2C_init( )
{
        I2C_ICMDR   = 0;                    // Reset I2C
        I2C_ICPSC   = 26;                   // Config prescaler for 27MHz
        I2C_ICCLKL  = 5;                    // Config clk LOW for 50kHz
        I2C_ICCLKH  = 5;                    // Config clk HIGH for 50kHz
        I2C_ICMDR  |= ICMDR_IRS;            // Release I2C from reset
        return 0;

}

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  DAVINCIEVM_I2C_close( )                                                 *
 *                                                                          *
 * ------------------------------------------------------------------------ */
Int16 EEPROM_I2C_close( )
{
  
        I2C_ICMDR = 0;                      // Reset I2C
        return 0;

}

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  DAVINCIEVM_I2C_reset( )                                                 *
 *                                                                          *
 *                                                                          *
 *                                                                          *
 * ------------------------------------------------------------------------ */
Int16 EEPROM_I2C_reset( )
{
    DAVINCIEVM_I2C_close( );
    DAVINCIEVM_I2C_init( );
    return 0;
}

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  DAVINCIEVM_I2C_write( i2caddr, data, len )                              *
 *                                                                          *
 *      I2C write in Master mode                                            *
 *                                                                          *
 *      i2caddr <- I2C slave address                                        *
 *      data    <- I2C data ptr                                             *
 *      len     <- # of bytes to write                                      *
 *                                                                          *
 * ------------------------------------------------------------------------ */
Int16 EEPROM_I2C_write( Uint16 i2caddr, Uint8* data, Uint16 len )
{
    Uint16 i;
    Int32 timeout   = 0x20000;
    Int32 timecount = 0;

        I2C_ICCNT = len;                    // Set len
        I2C_ICSAR = i2caddr;                // Set I2C slave address
        I2C_ICMDR = ICMDR_STT               // Config for master write
                  | ICMDR_TRX
                  | ICMDR_MST
                  | ICMDR_IRS
                  | ICMDR_FREE
                  ;

        DAVINCIEVM_wait( 10 );              // Short delay

        for ( i = 0 ; i < len ; i++ )
        {
            I2C_ICDXR = data[i];            // Write

            timecount = 0;
            do
            {
                timecount++;
                if ( timecount >= timeout )
                {
                    DAVINCIEVM_I2C_reset( );
                    return 1000;
                }
            } while ( ( I2C_ICSTR & ICSTR_ICXRDY ) == 0 );// Wait for Tx Ready
        }

        I2C_ICMDR |= ICMDR_STP;             // Generate STOP
        return 0;

}

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  DAVINCIEVM_I2C_read( i2caddr, data, len )                               *
 *                                                                          *
 *      I2C read in Master mode                                             *
 *                                                                          *
 *      i2caddr <- I2C slave address                                        *
 *      data    <- I2C data ptr                                             *
 *      len     <- # of bytes to write                                      *
 *                                                                          *
 * ------------------------------------------------------------------------ */
Int16 EEPROM_I2C_read( Uint16 i2caddr, Uint8* data, Uint16 len )
{
    Uint16 i;
    Int32 timeout   = 0x20000;
    Int32 timecount = 0;

        I2C_ICCNT = len;                    // Set len
        I2C_ICSAR = i2caddr;                // Set I2C slave address
        I2C_ICMDR = ICMDR_STT               // Config for master read
                  | ICMDR_MST
                  | ICMDR_IRS
                  | ICMDR_FREE
                  ;

        for ( i = 0 ; i < len ; i++ )
        {
            timecount = 0;
            do
            {
                timecount++;
                if ( timecount >= timeout )
                {
                    DAVINCIEVM_I2C_reset( );
                    return 1000;
                }
            } while ( ( I2C_ICSTR & ICSTR_ICRRDY ) == 0 );// Wait for Rx Ready
            data[i] = I2C_ICDRR;            // Read
        }

        I2C_ICMDR |= ICMDR_STP;             // Generate STOP
        return 0;

}

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  DAVINCIEVM_I2C_read_variable( i2caddr, data, len )                      *
 *                                                                          *
 *      I2C read in Master mode                                             *
 *                                                                          *
 *      i2caddr <- I2C slave address                                        *
 *      data    <- I2C data ptr                                             *
 *      len     <- # of bytes to write                                      *
 *                                                                          *
 * ------------------------------------------------------------------------ */
Int16 EEPROM_I2C_read_variable( Uint16 i2caddr, Uint8* data, Uint16 len )
{
    Uint16 i;
    Int32 timeout   = 0x20000;
    Int32 timecount = 0;

        I2C_ICCNT = len;                    // Set len
        I2C_ICSAR = i2caddr;                // Set I2C slave address
        I2C_ICMDR = ICMDR_STT               // Config for master read
                  | ICMDR_MST
                  | ICMDR_IRS
                  | ICMDR_FREE
                  ;

        for ( i = 0 ; i < len ; i++ )
        {
            if ( i == 1 )
            {
                len = data[0];
                I2C_ICCNT = len;            // Set len
            }

            timecount = 0;
            do
            {
                timecount++;
                if ( timecount >= timeout )
                {
                    DAVINCIEVM_I2C_reset( );
                    return 1000;
                }
            } while ( ( I2C_ICSTR & ICSTR_ICRRDY ) == 0 );// Wait for Rx Ready
            data[i] = I2C_ICDRR;            // Read
        }

        I2C_ICMDR |= ICMDR_STP;             // Generate STOP
        return 0;
}

⌨️ 快捷键说明

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