示例#1
0
void USCI_B_I2C_masterInit(uint16_t baseAddress,
                           uint8_t selectClockSource,
                           uint32_t i2cClk,
                           uint32_t dataRate)
{
    USCI_B_I2C_initMasterParam param = {0};
    param.selectClockSource = selectClockSource;
    param.i2cClk = i2cClk;
    param.dataRate = dataRate;

    USCI_B_I2C_initMaster(baseAddress, &param);
}
void msp430_i2c_init(void)
{
	unsigned long _smclk;
    if (i2c.enabled)
        return;
    /**Configure Pins for I2C
     * Set P3.0 and P3.1 as Secondary Module Function Input.
     * Select Port 3
     * Set Pin 0, 1 to input Secondary Module Function, (UCB0SIMO/UCB0SDA, UCB0SOMI/UCB0SCL).
     * */
    GPIO_setAsPeripheralModuleFunctionInputPin(
            GPIO_PORT_P3,
            GPIO_PIN0 + GPIO_PIN1
            );
    _smclk = msp430_get_smclk_freq();
    USCI_B_I2C_initMasterParam param = {0};
    param.selectClockSource = USCI_B_I2C_CLOCKSOURCE_SMCLK;
    param.i2cClk = _smclk;
    param.dataRate = USCI_B_I2C_SET_DATA_RATE_400KBPS;
    USCI_B_I2C_initMaster(USCI_B0_BASE, &param);
    //Enable I2C Module to start operations
    USCI_B_I2C_enable(USCI_B0_BASE);

    USCI_B_I2C_clearInterrupt(USCI_B0_BASE,
            USCI_B_I2C_TRANSMIT_INTERRUPT +
            USCI_B_I2C_RECEIVE_INTERRUPT +
            USCI_B_I2C_NAK_INTERRUPT
            );
    //Enable master Receive interrupt
    USCI_B_I2C_enableInterrupt(USCI_B0_BASE,
            USCI_B_I2C_TRANSMIT_INTERRUPT +
            USCI_B_I2C_RECEIVE_INTERRUPT +
            USCI_B_I2C_NAK_INTERRUPT
            );

    /* Initialize struct. */
    i2c.state = STATE_WAITING;
    i2c.slave_reg = 0;
    i2c.data = 0;
    i2c.length = 0;
    i2c.enabled = 1;
}