Beispiel #1
0
/**
  * @brief  Handle I2C1 event interrupt request.
  * @param  None
  * @retval None
  */
void I2C1_EventIRQ_Handler(void)
{
    if(I2C_GetBitState(I2C1, I2C_FLAG_SBSEND))
    {
        /* Send slave address */
        I2C_AddressingDevice_7bit(I2C1, I2C2_SLAVE_ADDRESS7, I2C_DIRECTION_TRANSMITTER);
    }
    else if(I2C_GetBitState(I2C1, I2C_FLAG_ADDSEND))
    {
        /*Clear ADDSEND bit */
        event1 = I2C_GetCurrentState(I2C1);
    }
    else if(I2C_GetBitState(I2C1, I2C_FLAG_TBE))
    {
        if(I2C_nBytes>0)
        {
            /* The master sends a data byte */
            I2C_SendData(I2C1,*I2C_WriteBuffer++);
            I2C_nBytes--;
        }
        else
        {
            /* The master sends a stop condition to I2C bus */
            I2C_StopOnBus_Enable(I2C1, ENABLE);
            /* Disable the I2C1 interrupt */
            I2C_INTConfig(I2C1,I2C_INT_EIE | I2C_INT_EE | I2C_INT_BIE, DISABLE);
        }
    }

}
Beispiel #2
0
void i2c_sendheader(int address)
{
	i2ccount = 0;
	while (I2C_GetBitState(I2C1, I2C_FLAG_I2CBSY) && I2CTIMEOUTCONDITION)
		i2ccount++;

	I2C_StartOnBus_Enable(I2C1, ENABLE);
	while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_SBSEND && I2CTIMEOUTCONDITION))
		i2ccount++;
	I2C_GetBitState(I2C1, I2C_FLAG_SBSEND);

	I2C_SendData(I2C1, (address << 1));
	while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_TRANSMITTER_ADDSEND) && I2CTIMEOUTCONDITION)
		i2ccount++;

}
Beispiel #3
0
void I2C_GetBitState_Timeout(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG)
{
    reset_timout_tic();
    while(I2C_GetBitState(I2Cx, I2C_FLAG) && timeout_tic > 0)
    {
        timeout_tic --;
    }
    if (timeout_tic == 0) {
        reboot_system(SUCCESS);
    }
}
Beispiel #4
0
void I2C_GPIO_init(void)
{
    GPIO_InitPara GPIO_InitStructure;
    I2C_InitPara I2C_InitStructure;

    /* Enable GPIOB clock */
    RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB,ENABLE);
    /* Enable BOARD_I2C APB1 clock */
    RCC_APB1PeriphClock_Enable(I2C_RCC,ENABLE);


    /* BOARD_I2C GPIO ports*/
    GPIO_InitStructure.GPIO_Pin =  I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_OD;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOB,I2C_SCL_GPIO_PINSOURCE,GPIO_AF_1);
    GPIO_PinAFConfig(GPIOB,I2C_SDA_GPIO_PINSOURCE,GPIO_AF_1);

    // In order to not encounter the I2C BUSY jam, Manually Reset the I2C after GPIO set, before I2C configure.
    I2C_SoftwareReset_Enable(BOARD_I2C, ENABLE);
    I2C_SoftwareReset_Enable(BOARD_I2C, DISABLE);

    I2C_InitStructure.I2C_Protocol = I2C_PROTOCOL_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DUTYCYCLE_2;
    I2C_InitStructure.I2C_BitRate = I2C_CLK_HZ;
    I2C_InitStructure.I2C_AddressingMode = I2C_ADDRESSING_MODE_7BIT;
    I2C_InitStructure.I2C_DeviceAddress = I2C_OWN_ADDRESS7;
    I2C_Init(BOARD_I2C, &I2C_InitStructure);

    I2C_Enable(BOARD_I2C,ENABLE);


    /* Enable I2C2 */

    I2C_Acknowledge_Enable(BOARD_I2C,DISABLE);
    /* The software must wait until I2C Bus is idle */
#ifdef DBG_OLED_BLOCK
    while(I2C_GetBitState(BOARD_I2C,I2C_FLAG_I2CBSY));
#else
    I2C_GetBitState_Timeout(BOARD_I2C,I2C_FLAG_I2CBSY);
#endif

}
Beispiel #5
0
/**
  * @brief  Handle I2C1 error interrupt request.
  * @param  None
  * @retval None
  */
void I2C1_ErrorIRQ_Handler(void)
{
    /* No acknowledge received */
    if(I2C_GetBitState(I2C1, I2C_FLAG_AE))
    {
        I2C_ClearBitState(I2C1, I2C_FLAG_AE);
    }

    /* SMBus Alert */
    if(I2C_GetBitState(I2C1, I2C_FLAG_SMBALTS))
    {
        I2C_ClearBitState(I2C1, I2C_FLAG_SMBALTS);
    }

    /* Bus timeout in SMBus mode */
    if(I2C_GetBitState(I2C1, I2C_FLAG_SMBTO))
    {
        I2C_ClearBitState(I2C1, I2C_FLAG_SMBTO);
    }

    /* Over-run or under-run when SCL stretch is disabled */
    if(I2C_GetBitState(I2C1, I2C_FLAG_RXORE))
    {
        I2C_ClearBitState(I2C1, I2C_FLAG_RXORE);
    }

    /* Arbitration lost */
    if(I2C_GetBitState(I2C1, I2C_FLAG_LOSTARB))
    {
        I2C_ClearBitState(I2C1, I2C_FLAG_LOSTARB);
    }

    /* Bus error */
    if(I2C_GetBitState(I2C1, I2C_FLAG_BE))
    {
        I2C_ClearBitState(I2C1, I2C_FLAG_BE);
    }

    /* CRC value doesn't match */
    if(I2C_GetBitState(I2C1, I2C_FLAG_PECE))
    {
        I2C_ClearBitState(I2C1, I2C_FLAG_PECE);
    }

    /* Disable the error interrupt */
    I2C_INTConfig(I2C1,I2C_INT_EIE | I2C_INT_EE | I2C_INT_BIE, DISABLE);
}
Beispiel #6
0
/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
    int i;
    
    RCC_Configuration();
    GPIO_Configuration();
    I2C_Configuration();

    i=0;
    /* Enable I2C2 */
    I2C_Enable(BOARD_I2C,ENABLE);

    /* Enable Acknowledge */
    I2C_Acknowledge_Enable(BOARD_I2C,ENABLE);

    /* Send a NACK for the next data byte which will be received into the shift register */
    I2C_NACKPosition_Enable(BOARD_I2C,I2C_NACKPOSITION_NEXT);

    /* Wait until I2C Bus is idle */
    while(I2C_GetBitState(BOARD_I2C, I2C_FLAG_I2CBSY));

    /* Send a start condition to I2C bus */
    I2C_StartOnBus_Enable(BOARD_I2C, ENABLE);

    /* Wait until SBSEND bit is set */
    while(!I2C_StateDetect(BOARD_I2C, I2C_PROGRAMMINGMODE_MASTER_SBSEND));

    /* Send slave address to I2C bus */
    I2C_AddressingDevice_7bit(BOARD_I2C, SLAVE_ADDRESS7, I2C_DIRECTION_RECEIVER);

    /* Disable ACK before clearing ADDSEND bit */
    I2C_Acknowledge_Enable(BOARD_I2C, DISABLE);

    /* Wait until ADDSEND bit is set and clear it */
    while(!I2C_StateDetect(BOARD_I2C, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND));

    /* Wait until the last data byte is received into the shift register */
    while(!I2C_GetBitState(BOARD_I2C, I2C_FLAG_BTC));

    /* Send a stop condition */
    I2C_StopOnBus_Enable(BOARD_I2C, ENABLE);

    /* Wait until the reception data register is not empty */
    while(!I2C_GetBitState(BOARD_I2C, I2C_FLAG_RBNE));

    /* Read a data from I2C_DTR */
    BOARD_I2C_Buf_Read[i++]=I2C_ReceiveData(BOARD_I2C);

    /* Wait until the reception data register is not empty */
    while(!I2C_GetBitState(BOARD_I2C, I2C_FLAG_RBNE));

    /* Read a data from I2C_DTR */
    BOARD_I2C_Buf_Read[i++]=I2C_ReceiveData(BOARD_I2C);

    while(BOARD_I2C->CTLR1&0x0200);

    I2C_NACKPosition_Enable(BOARD_I2C,I2C_NACKPOSITION_CURRENT);

    /* Enable Acknowledge */
    I2C_Acknowledge_Enable(BOARD_I2C, ENABLE);

    while(1);
}