/** * @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 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++; }
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); } }
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 }
/** * @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); }
/** * @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); }