コード例 #1
1
ファイル: i2cconfig.c プロジェクト: gbellack/OmniView
//****************************************************************************
//
//! Invokes the I2C driver APIs to read from the device. This assumes the 
//! device local address to read from is set using the I2CWrite API.
//!
//! \param      ucDevAddr is the device I2C slave address
//! \param      ucBuffer is the pointer to the read data to be placed
//! \param      ulSize is the length of data to be read
//! \param      ucFlags Flag
//! 
//! This function works in a polling mode,
//!    1. Writes the device register address to be written to.
//!    2. In a loop, reads all the bytes over I2C
//!
//! \return 0: Success, < 0: Failure.
//
//****************************************************************************
unsigned long I2CBufferRead(unsigned char ucDevAddr, unsigned char *ucBuffer,
                            unsigned long ulSize,unsigned char ucFlags)
{
    unsigned long ulNdx;

    // Set I2C codec slave address 
    MAP_I2CMasterSlaveAddrSet(I2CA0_BASE,ucDevAddr, true);
    MAP_I2CMasterIntClearEx(I2CA0_BASE, I2C_INT_MASTER);

    if(ulSize == 1)
    {
        // Start single transfer. 
        MAP_I2CMasterControl(I2CA0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
    }
    else
    {
        // Start the transfer. 
        MAP_I2CMasterControl(I2CA0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);

        // Wait for transfer completion. 
        while((MAP_I2CMasterIntStatusEx(I2CA0_BASE, false) & I2C_INT_MASTER) == 0)
        {
        }

        // Read first byte from the controller. 
        ucBuffer[0] = MAP_I2CMasterDataGet(I2CA0_BASE);

        for(ulNdx=1; ulNdx < ulSize-1; ulNdx++)
        {
            MT9D111Delay(10);
            MAP_I2CMasterIntClearEx(I2CA0_BASE, I2C_INT_MASTER);

            // continue the transfer. 
            MAP_I2CMasterControl(I2CA0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);

            // Wait for transfer completion. 
            while((MAP_I2CMasterIntStatusEx(I2CA0_BASE, false) & I2C_INT_MASTER) == 0)
            {
            }

            // Read next byte from the controller. 
            ucBuffer[ulNdx] = MAP_I2CMasterDataGet(I2CA0_BASE);
        }

        MAP_I2CMasterIntClearEx(I2CA0_BASE, I2C_INT_MASTER);
        MAP_I2CMasterControl(I2CA0_BASE,I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
    }

    // Wait for transfer completion. 
    while((MAP_I2CMasterIntStatusEx(I2CA0_BASE, false) & I2C_INT_MASTER) == 0)
    {
    }

    // Read the last byte from the controller. 
    ucBuffer[ulSize-1] = MAP_I2CMasterDataGet(I2CA0_BASE);

    return 0;
}
コード例 #2
0
ファイル: Wire.cpp プロジェクト: Aginorty/Energia
uint8_t TwoWire::I2CTransact(unsigned long ulCmd)
{
	MAP_I2CMasterIntClearEx(I2C_BASE, MAP_I2CMasterIntStatusEx(I2C_BASE, false));
	MAP_I2CMasterTimeoutSet(I2C_BASE, I2C_TIMEOUT_VAL);
	MAP_I2CMasterControl(I2C_BASE, ulCmd);

	while((MAP_I2CMasterIntStatusEx(I2C_BASE, false)
			& (I2C_INT_MASTER | I2C_MRIS_CLKTOUT)) == 0) {
		if(!MAP_I2CMasterBusy(I2C_BASE)) return -1;
	}

	/* Check for any errors in transfer */
	if(MAP_I2CMasterErr(I2C_BASE) != I2C_MASTER_ERR_NONE) {
		switch(ulCmd) {
		case I2C_MASTER_CMD_BURST_SEND_START:
		case I2C_MASTER_CMD_BURST_SEND_CONT:
		case I2C_MASTER_CMD_BURST_SEND_STOP:
			MAP_I2CMasterControl(I2C_BASE,
				I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
			break;
		case I2C_MASTER_CMD_BURST_RECEIVE_START:
		case I2C_MASTER_CMD_BURST_RECEIVE_CONT:
		case I2C_MASTER_CMD_BURST_RECEIVE_FINISH:
			MAP_I2CMasterControl(I2C_BASE,
				I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
			break;
		default:
			break;
		}

		return 0;
	}

	return -1;
}
コード例 #3
0
ファイル: i2cconfig.c プロジェクト: gbellack/OmniView
unsigned long I2CBufferWrite(unsigned char ucDevAddr, unsigned char *ucBuffer,
                             unsigned long ulSize,unsigned char ucFlags)
{
    unsigned long ulNdx;

   // Set I2C codec slave address 
    MAP_I2CMasterSlaveAddrSet(I2CA0_BASE,ucDevAddr, false);

   // Write the first byte to the controller. 
    MAP_I2CMasterDataPut(I2CA0_BASE,ucBuffer[0]);
    MAP_I2CMasterIntClearEx(I2CA0_BASE, I2C_INT_MASTER);

    if( ulSize == 1)
    {
        MAP_I2CMasterControl(I2CA0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
    }
    else
    {
       // Continue the transfer. 
        MAP_I2CMasterControl(I2CA0_BASE, I2C_MASTER_CMD_BURST_SEND_START);

       // Wait until the current byte has been transferred. 
        while((MAP_I2CMasterIntStatusEx(I2CA0_BASE, false) & I2C_INT_MASTER) == 0)
        {
        }

        for(ulNdx=1; ulNdx < ulSize-1; ulNdx++)
        {
           // Write the next byte to the controller. 
            MAP_I2CMasterDataPut(I2CA0_BASE,ucBuffer[ulNdx]);

           // Clear Master Interrupt 
            MAP_I2CMasterIntClearEx(I2CA0_BASE, I2C_INT_MASTER);

           // Continue the transfer. 
            MAP_I2CMasterControl(I2CA0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);

           // Wait until the current byte has been transferred. 
            while((MAP_I2CMasterIntStatusEx(I2CA0_BASE, false) & I2C_INT_MASTER) == 0)
            {
            }
        }

       // Write the last byte to the controller. 
        MAP_I2CMasterDataPut(I2CA0_BASE, ucBuffer[ulSize-1]);
        MAP_I2CMasterIntClearEx(I2CA0_BASE, I2C_INT_MASTER);

       // End the transfer. 
        MAP_I2CMasterControl(I2CA0_BASE,I2C_MASTER_CMD_BURST_SEND_FINISH);
    }

   // Wait until the current byte has been transferred. 
    while((MAP_I2CMasterIntStatusEx(I2CA0_BASE, false) & I2C_INT_MASTER) == 0)
    {
    }

    return 0;
}
コード例 #4
0
void I2C_WriteMultiBegin(unsigned char slaveAddress, unsigned char address, unsigned char data)
{
	MAP_I2CMasterSlaveAddrSet(I2CBase, slaveAddress, false);

	MAP_I2CMasterDataPut(I2CBase, address);
	MAP_I2CMasterControl(I2CBase, I2C_MASTER_CMD_BURST_SEND_START);

	I2C_WaitForBus(I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);

	MAP_I2CMasterDataPut(I2CBase, data);
	MAP_I2CMasterControl(I2CBase, I2C_MASTER_CMD_BURST_SEND_CONT);

	I2C_WaitForBus(I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
}
コード例 #5
0
void I2C_WriteMultiEnd(unsigned char data)
{
	MAP_I2CMasterDataPut(I2CBase, data);
	MAP_I2CMasterControl(I2CBase, I2C_MASTER_CMD_BURST_SEND_FINISH);

	I2C_WaitForBus(I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);
}
コード例 #6
0
ファイル: ti_arm_mcu_i2c.c プロジェクト: ebirger/tinkerpal
void ti_arm_mcu_i2c_reg_write(int port, unsigned char addr, unsigned char reg,
    const unsigned char *data, int len)
{
    const ti_arm_mcu_i2c_t *i2c = &ti_arm_mcu_i2cs[port];
    
    MAP_I2CMasterSlaveAddrSet(i2c->base, addr >> 1, 0);
    MAP_I2CMasterDataPut(i2c->base, reg);
    MAP_I2CMasterControl(i2c->base, I2C_MASTER_CMD_BURST_SEND_START);
    wait_for_completion(i2c->base);
    while (len--)
    {
        MAP_I2CMasterDataPut(i2c->base, *data++);
        if (len)
        {
            MAP_I2CMasterControl(i2c->base, I2C_MASTER_CMD_BURST_SEND_CONT);
            wait_for_completion(i2c->base);
        }
    }
    MAP_I2CMasterControl(i2c->base, I2C_MASTER_CMD_BURST_SEND_FINISH);
    wait_for_completion(i2c->base);
}
コード例 #7
0
unsigned long I2C_ReadMultiContinue(void)
{
	unsigned char data;

	MAP_I2CMasterControl(I2CBase, I2C_MASTER_CMD_BURST_RECEIVE_CONT);

	I2C_WaitForBus(I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);

	data = MAP_I2CMasterDataGet(I2CBase);

	return data;
}
コード例 #8
0
unsigned long I2C_ReadMultiBegin(unsigned char slaveAddress, unsigned char address)
{
	unsigned char data;

	MAP_I2CMasterSlaveAddrSet(I2CBase, slaveAddress, false);

	MAP_I2CMasterDataPut(I2CBase, address);
	MAP_I2CMasterControl(I2CBase, I2C_MASTER_CMD_BURST_SEND_START);

	I2C_WaitForBus(I2C_MASTER_CMD_BURST_SEND_ERROR_STOP);

	MAP_I2CMasterSlaveAddrSet(I2CBase, slaveAddress, true);

	MAP_I2CMasterControl(I2CBase, I2C_MASTER_CMD_BURST_RECEIVE_START);

	I2C_WaitForBus(I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);

	data = MAP_I2CMasterDataGet(I2CBase);

	return data;
}
コード例 #9
0
static inline int I2C_WaitForBus(unsigned long errorCmd)
{
	while (MAP_I2CMasterBusy(I2CBase));

	if (MAP_I2CMasterErr(I2CBase))
	{
		MAP_I2CMasterControl(I2CBase, errorCmd);
		I2C_Error(__FILE__, __LINE__);
		return 1;
	}

	return 0;
}