TWI_ConfigureMaster
Default mainpageat91libperipheralstwiTWI_ConfigureMaster
Description Source Call Graph
Start Line: 86
void TWI_ConfigureMaster(AT91S_TWI *pTwi, unsigned int twck, unsigned int mck)
{
    unsigned int ckdiv = 0;
    unsigned int cldiv;
    unsigned char ok = 0;

    TRACE_DEBUG("TWI_ConfigureMaster()\n\r");
    SANITY_CHECK(pTwi);

#ifdef AT91C_TWI_SVEN  // TWI slave
    // SVEN: TWI Slave Mode Enabled
    pTwi->TWI_CR = AT91C_TWI_SVEN;
#endif
    // Reset the TWI
    pTwi->TWI_CR = AT91C_TWI_SWRST;
    pTwi->TWI_RHR;

    // TWI Slave Mode Disabled, TWI Master Mode Disabled
#ifdef AT91C_TWI_SVEN  // TWI slave
    pTwi->TWI_CR = AT91C_TWI_SVDIS;
#endif
    pTwi->TWI_CR = AT91C_TWI_MSDIS;

    // Set master mode
    pTwi->TWI_CR = AT91C_TWI_MSEN;

    // Configure clock
    while (!ok) {
#if defined(__ARMCC_VERSION)
        cldiv = ((mck / (2 * twck)) - 3) / pow(2, ckdiv);
#else
        cldiv = ((mck / (2 * twck)) - 3) / power(2, ckdiv);
#endif        
        if (cldiv <= 255) {

            ok = 1;
        }
        else {

            ckdiv++;
        }
    }

    ASSERT(ckdiv < 8, "-F- Cannot find valid TWI clock parameters\n\r");
    TRACE_DEBUG("Using CKDIV = %u and CLDIV/CHDIV = %u\n\r", ckdiv, cldiv);
    pTwi->TWI_CWGR = 0;
    pTwi->TWI_CWGR = (ckdiv << 16) | (cldiv << 8) | cldiv;
}