/** * @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); } } }
void Write_IIC_Addr7(unsigned char IIC_Addr_7bit) { /* Send slave address to I2C bus */ I2C_AddressingDevice_7bit(BOARD_I2C,IIC_Addr_7bit,I2C_DIRECTION_TRANSMITTER); /* The software must wait until ADDSEND bit is set*/ #ifdef DBG_OLED_BLOCK while(!I2C_StateDetect(BOARD_I2C,I2C_PROGRAMMINGMODE_MASTER_TRANSMITTER_ADDSEND)); #else I2C_StateDetect_Timeout(BOARD_I2C,I2C_PROGRAMMINGMODE_MASTER_TRANSMITTER_ADDSEND); #endif }
/** * @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); }