/******************************************************************************* * Function Name : I2C2_EV_IRQHandler * Description : This function handles I2C2 Event interrupt request. * Input : None * Output : None * Return : None *******************************************************************************/ void I2C2_EV_IRQHandler(void) { switch (I2C_GetLastEvent(I2C2)) { /* Slave Transmitter ---------------------------------------------------*/ case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: /* EV1 */ /* Transmit I2C2 data */ I2C_SendData(I2C2, I2C2_Buffer_Tx[Tx2_Idx++]); break; case I2C_EVENT_SLAVE_BYTE_TRANSMITTED: /* EV3 */ /* Transmit I2C2 data */ I2C_SendData(I2C2, I2C2_Buffer_Tx[Tx2_Idx++]); break; /* Slave Receiver ------------------------------------------------------*/ case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: /* EV1 */ break; case I2C_EVENT_SLAVE_BYTE_RECEIVED: /* EV2 */ /* Store I2C2 received data */ I2C2_Buffer_Rx[Rx2_Idx++] = I2C_ReceiveData(I2C2); if(Rx2_Idx == Tx2BufferSize) { I2C_TransmitPEC(I2C2, ENABLE); Direction = Receiver; } break; case I2C_EVENT_SLAVE_STOP_DETECTED: /* EV4 */ /* Clear I2C2 STOPF flag: read of I2C_SR1 followed by a write on I2C_CR1 */ (void)(I2C_GetITStatus(I2C2, I2C_IT_STOPF)); I2C_Cmd(I2C2, ENABLE); break; default: break; } }
/******************************************************************************* * Function Name : I2C1_EV_IRQHandler * Description : This function handles I2C1 Event interrupt request. * Input : None * Output : None * Return : None *******************************************************************************/ void I2C1_EV_IRQHandler(void) { switch (I2C_GetLastEvent(I2C1)) { case I2C_EVENT_MASTER_MODE_SELECT: /* EV5 */ if(Direction == Transmitter) { /* Master Transmitter ----------------------------------------------*/ /* Send slave Address for write */ I2C_Send7bitAddress(I2C1, I2C2_SLAVE_ADDRESS7, I2C_Direction_Transmitter); } else { /* Master Receiver -------------------------------------------------*/ /* Send slave Address for read */ I2C_Send7bitAddress(I2C1, I2C2_SLAVE_ADDRESS7, I2C_Direction_Receiver); } break; /* Master Transmitter --------------------------------------------------*/ /* Test on I2C1 EV6 and first EV8 and clear them */ case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: /* Send the first data */ I2C_SendData(I2C1, I2C1_Buffer_Tx[Tx1_Idx++]); break; /* Test on I2C1 EV8 and clear it */ case I2C_EVENT_MASTER_BYTE_TRANSMITTING: /* Without BTF, EV8 */ if(Tx1_Idx < (Tx1BufferSize)) { /* Transmit I2C1 data */ I2C_SendData(I2C1, I2C1_Buffer_Tx[Tx1_Idx++]); } else { I2C_TransmitPEC(I2C1, ENABLE); I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE); } break; case I2C_EVENT_MASTER_BYTE_TRANSMITTED: /* With BTF EV8-2 */ I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE); /* I2C1 Re-START Condition */ I2C_GenerateSTART(I2C1, ENABLE); break; /* Master Receiver -------------------------------------------------------*/ case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED: if(Tx2BufferSize == 1) { /* Disable I2C1 acknowledgement */ I2C_AcknowledgeConfig(I2C1, DISABLE); /* Send I2C1 STOP Condition */ I2C_GenerateSTOP(I2C1, ENABLE); } break; /* Test on I2C1 EV7 and clear it */ case I2C_EVENT_MASTER_BYTE_RECEIVED: /* Store I2C1 received data */ I2C1_Buffer_Rx[Rx1_Idx++] = I2C_ReceiveData (I2C1); /* Disable ACK and send I2C1 STOP condition before receiving the last data */ if(Rx1_Idx == (Tx2BufferSize - 1)) { /* Disable I2C1 acknowledgement */ I2C_AcknowledgeConfig(I2C1, DISABLE); /* Send I2C1 STOP Condition */ I2C_GenerateSTOP(I2C1, ENABLE); } break; default: break; } }
/************************************************************* * I2C initialization code template **************************************************************/ void I2C1_Init() { #if (STRCMP($interruptEn$, 0) == 0) NVIC_InitTypeDef NVIC_InitStructure; #endif I2C_InitTypeDef I2C_InitStructure; //PUT_A_NEW_LINE_HERE // // Enable I2C clock // RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); #if (STRCMP($SCL1$, DISABLE) == 0 || STRCMP($SDA1$, DISABLE) == 0) //PUT_A_NEW_LINE_HERE // // Enable AFIO and I2C clock // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //PUT_A_NEW_LINE_HERE // // I2C SCL pin remap to PB8, I2C SDA pin remap to PB8 // GPIO_PinRemapConfig(GPIO_Remap_I2C1,ENABLE); #endif //PUT_A_NEW_LINE_HERE // // I2C config // I2C_InitStructure.I2C_Mode = $mode$; I2C_InitStructure.I2C_DutyCycle = $dutyCycle$; I2C_InitStructure.I2C_OwnAddress1 = $ownAddress$; I2C_InitStructure.I2C_Ack = $ack$; I2C_InitStructure.I2C_AcknowledgedAddress = $ackAddress$; I2C_InitStructure.I2C_ClockSpeed = $speed$; I2C_Init($I2C$, &I2C_InitStructure); //PUT_A_NEW_LINE_HERE // // Enable I2C // I2C_Cmd($I2C$, ENABLE); I2C_Init($I2C$, &I2C_InitStructure); #if (STRCMP($interruptEn$, 0) == 0) //PUT_A_NEW_LINE_HERE // // Enable I2C DualAddress // I2C_OwnAddress2Config($I2C$, $ownAddress2$); I2C_DualAddressCmd($I2C$, ENABLE); #endif #if($modeSelect$) //PUT_A_NEW_LINE_HERE // // Transmits the address byte to select the slave device // I2C_Send7bitAddress($I2C$, $slaveAddress$, $transferDirection$); #endif #if(STRCMP($GenCallEn$, DISABLE) == 0) //PUT_A_NEW_LINE_HERE // // Enables I2C1 general call feature // I2C_GeneralCallCmd($I2C$, ENABLE); #endif #if(STRCMP($StrchClkEn$, DISABLE) == 0) //PUT_A_NEW_LINE_HERE // // Enables I2C1 Clock stretching // I2C_StretchClockCmd($I2C$, ENABLE); #endif #if (STRCMP($interruptEn$, 0) == 0) //PUT_A_NEW_LINE_HERE // // Interrupt config // I2C_ITConfig($I2C$, $interruptEn$, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #endif #if($pecTransmitEn$) //PUT_A_NEW_LINE_HERE // // PEC Transmit Enable // #if($pecTransmitEn$) I2C_TransmitPEC($I2C$, ENABLE); #endif #if($pecCalculateEn$) I2C_CalculatePEC($I2C$, ENABLE); #endif #if(STRCMP($pecPosition$, I2C_PECPosition_Next)) I2C_PECPositionConfig($I2C$, $pecPosition$); #endif #if(STRCMP($pecPosition$, I2C_PECPosition_Current)) I2C_PECPositionConfig($I2C$, $pecPosition$); #endif #endif #if(!STRCMP($mode$, I2C_Mode_I2C)) //PUT_A_NEW_LINE_HERE // // PEC Transmit Enable // I2C_SMBusAlertConfig($I2C$, $SMBusAlertCfg$); I2C_ARPCmd($I2C$, $ARPEn$); #endif }