/** * \brief Sets up the EEPROM I2C interface * * \param slaveAddr Slave Address of the EEPROM * * \return None. */ void EEPROMI2CSetUp(unsigned int slaveAddr) { /* Configuring system clocks for I2C0 instance. */ I2C0ModuleClkConfig(); /* Performing Pin Multiplexing for I2C0. */ I2C0PinMux(); /* Put i2c in reset/disabled state */ I2CMasterDisable(I2C_BASE_ADDR); I2CSoftReset(I2C_BASE_ADDR); /* Configure i2c bus speed to 100khz */ I2CMasterInitExpClk(I2C_BASE_ADDR, 48000000, 24000000, 100000); /* Set i2c slave address */ I2CMasterSlaveAddrSet(I2C_BASE_ADDR, slaveAddr); /* Disable all I2C interrupts */ I2CMasterIntDisableEx(I2C_BASE_ADDR, 0xFFFFFFFF); /* Bring I2C module out of reset */ I2CMasterEnable(I2C_BASE_ADDR); while(!I2CSystemStatusGet(I2C_BASE_ADDR)); }
/** * \brief Initializes the I2C interface for a codec * * \param baseAddr Base Address of the I2C Module Registers which * is used for the codec * intCh Channel Number where the I2C ISR to be registered * slaveAddr Slave Address of the codec * * Note: This API enables the system interrupt for the given I2C module only. * It does not do any pin multiplexing or global interrupt enabling. * This shall be called only after AINTC initialization. * * \return None. * **/ void I2CCodecIfInit(unsigned int baseAddr, unsigned int intCh, unsigned int slaveAddr) { unsigned int sysIntNum = 0; /* Put i2c in reset/disabled state */ I2CMasterDisable(baseAddr); /* Configure i2c bus speed to 100khz */ I2CMasterInitExpClk(baseAddr, 24000000, 8000000, 100000); /* Set i2c slave address */ I2CMasterSlaveAddrSet(baseAddr, slaveAddr); I2CMasterEnable(baseAddr); /* ** Setup the interrupt in AINTC for the i2c module. ** If another instance is to be added, this shall include ** checking for the other instance base address also. */ if(SOC_I2C_0_REGS == baseAddr) { #ifdef _TMS320C6X sysIntNum = SYS_INT_I2C0_INT; #else sysIntNum = SYS_INT_I2CINT0; #endif } I2CCodecIntSetup(sysIntNum, intCh); }
//Initialize as a slave void TwoWire::begin(uint8_t address) { if(i2cModule == NOT_ACTIVE) { i2cModule = BOOST_PACK_WIRE; } SysCtlPeripheralEnable(g_uli2cPeriph[i2cModule]); GPIOPinConfigure(g_uli2cConfig[i2cModule][0]); GPIOPinConfigure(g_uli2cConfig[i2cModule][1]); GPIOPinTypeI2C(g_uli2cBase[i2cModule], g_uli2cSDAPins[i2cModule]); GPIOPinTypeI2CSCL(g_uli2cBase[i2cModule], g_uli2cSCLPins[i2cModule]); slaveAddress = address; //Enable slave interrupts IntEnable(g_uli2cInt[i2cModule]); I2CSlaveIntEnableEx(SLAVE_BASE, I2C_SLAVE_INT_DATA | I2C_SLAVE_INT_STOP); HWREG(SLAVE_BASE + I2C_O_SICR) = I2C_SICR_DATAIC | I2C_SICR_STARTIC | I2C_SICR_STOPIC; //Setup as a slave device I2CMasterDisable(MASTER_BASE); I2CSlaveEnable(SLAVE_BASE); I2CSlaveInit(SLAVE_BASE, address); IntMasterEnable(); }
/* ** Initializes the I2C interface for a slave */ void I2C0IfConfig(unsigned int slaveAddr, unsigned int speed) { /* Put i2c in reset/disabled state */ I2CMasterDisable(SOC_I2C_0_REGS); /* Configure i2c bus speed to 100khz */ I2CMasterInitExpClk(SOC_I2C_0_REGS, 24000000, 8000000, speed); /* Set i2c slave address */ I2CMasterSlaveAddrSet(SOC_I2C_0_REGS, slaveAddr); I2CMasterEnable(SOC_I2C_0_REGS); }
void I2CSetup(void) { I2CPinMuxSetup(0); /* Put i2c in reset/disabled state */ I2CMasterDisable(SOC_I2C_0_REGS); /* Configure i2c bus speed to 100khz */ I2CMasterInitExpClk(SOC_I2C_0_REGS, 24000000, 8000000, 100000); /* Set i2c slave address */ I2CMasterSlaveAddrSet(SOC_I2C_0_REGS, 0x48); ConfigureAINTCIntI2C(); }
/*! * @brief Function to close a given CC26XX I2C peripheral specified by the * I2C handle. * * After calling the close function, the I2C is disabled. * * @pre I2CCC26XX_open() has to be called first. * Calling context: Task * * @param handle An I2C_Handle returned by I2C_open() * * @note The generic I2C API should be used when accessing the I2CCC26XX. * * @sa I2CCC26XX_open(), I2C_close(), I2C_open() */ void I2CCC26XX_close(I2C_Handle handle) { unsigned int key; I2CCC26XX_Object *object; I2CCC26XX_HWAttrs const *hwAttrs; /* Get the pointer to the object and hwAttrs */ hwAttrs = handle->hwAttrs; object = handle->object; /* Check to see if a I2C transaction is in progress */ Assert_isTrue(object->headPtr == NULL, NULL); /* Deallocate pins */ PIN_close(hPin); /* Mask I2C interrupts */ I2CMasterIntDisable(hwAttrs->baseAddr); /* Disable the I2C Master */ I2CMasterDisable(hwAttrs->baseAddr); /* Release power constraint*/ threadSafeStdbyDisRelease(); /* Power off the I2C module */ Power_releaseDependency(hwAttrs->powerMngrId); Hwi_destruct(&(object->hwi)); Semaphore_destruct(&(object->mutex)); if (object->transferMode == I2C_MODE_BLOCKING) { Semaphore_destruct(&(object->transferComplete)); } /* Unregister power post notification object */ Power_unregisterNotify(&object->i2cPostObj); /* Mark the module as available */ key = Hwi_disable(); object->isOpen = false; Hwi_restore(key); Log_print1(Diags_USER1, "I2C: Object closed 0x%x", hwAttrs->baseAddr); return; }
static void SetupI2C(void) { I2C0_BASE = vmm_find_iomap("SOC_I2C_0_REGS"); /* Enable the clock for I2C0 */ I2C0ModuleClkConfig(); I2CPinMuxSetup(0); /* Put i2c in reset/disabled state */ I2CMasterDisable(I2C0_BASE); /* Disable auto Idle functionality */ I2CAutoIdleDisable(I2C0_BASE); /* Configure i2c bus speed to 100khz */ I2CMasterInitExpClk(I2C0_BASE, 48000000, 12000000, 100000); /* Set i2c slave address */ I2CMasterSlaveAddrSet(I2C0_BASE, I2C_SLAVE_ADDR); /* Bring I2C out of reset */ I2CMasterEnable(I2C0_BASE); }
/** * \brief Initializes the I2C interface for a codec * * \param baseAddr Base Address of the I2C Module Registers which * is used for the codec * slaveAddr Slave Address of the codec * * Note: This API enables the system interrupt for the given I2C module only. * It does not do any pin multiplexing or global interrupt enabling. * This shall be called only after AINTC initialization. * * \return None. * **/ void I2CCodecIfInit(unsigned int baseAddr, unsigned int slaveAddr) { /* Put i2c in reset/disabled state */ I2CMasterDisable(baseAddr); /* Disable the auto idle functionality */ I2CAutoIdleDisable(baseAddr); /* Configure i2c bus speed to 100khz */ I2CMasterInitExpClk(SOC_I2C_1_REGS, 48000000, 12000000, 100000); /* Set i2c slave address */ I2CMasterSlaveAddrSet(baseAddr, slaveAddr); I2CMasterEnable(baseAddr); IntRegister(SYS_INT_I2C1INT, I2CCodecIsr); IntPrioritySet(SYS_INT_I2C1INT, 0, AINTC_HOSTINT_ROUTE_IRQ); IntSystemEnable(SYS_INT_I2C1INT); }