
void I2C_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStruct; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8; //管脚号 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //速度 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //输入 输出 复用 模拟 GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//推挽输出 开漏输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//上拉 下拉 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_1); I2C_DeInit(I2C1); //复位I2C I2C_Cmd(I2C1, DISABLE); I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; I2C_InitStruct.I2C_AnalogFilter = I2C_AnalogFilter_Enable; I2C_InitStruct.I2C_DigitalFilter = 0x00; I2C_InitStruct.I2C_OwnAddress1 =0xA0; I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStruct.I2C_Timing = 0x00900000; // 100Kbits 0x40B22536 0x30e30000 0x30E32E44 I2C_Init(I2C1, &I2C_InitStruct); I2C_StretchClockCmd(I2C1, ENABLE); //使能I2C I2C_ITConfig(I2C1, I2C_IT_RXI | I2C_CR1_ERRIE | I2C_IT_TXI| I2C_IT_NACKI|I2C_IT_ADDRI | I2C_IT_STOPI, ENABLE);// I2C_Cmd(I2C1, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = I2C1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void I2C1_IRQHandler(void) { uint8_t temp; uint32_t status = (uint32_t)(I2C1->ISR & (uint16_t)0x0000100FE); if(status & I2C_ISR_ADDR) { if(I2C1->ISR&I2C_ISR_DIR) //tx mode { I2C1->ICR |= I2C_ICR_ADDRCF; } if((I2C1->ISR&I2C_ISR_DIR)==0) //rx mode { I2C1->ICR |= I2C_ICR_ADDRCF; Instruct = 1; } Offset = 0; } else if(status & I2C_ISR_RXNE) //0x04 { temp = I2C_ReceiveData(I2C1); if(Instruct) { switch(temp) { case 0x02: // Get DevInfo TxBuff = (uint8_t *)&DevInfo; // 24 bytes MaxBytes = sizeof(DevInfo); I2C1->ISR |= I2C_ISR_TXE; break; default: break; } Instruct = 0; } RxBuff[Offset++] = temp; } else if(status & I2C_ISR_TXIS) //0x02 { if(Offset < MaxBytes) { I2C_SendData(I2C1, TxBuff[Offset++]); } else { I2C_SendData(I2C1, 0xFF); } } else if(status & I2C_ISR_NACKF) //0x02 { I2C1->ISR |= I2C_ISR_TXE; I2C_ClearITPendingBit(I2C1, I2C_ISR_NACKF); } else if(status & I2C_ISR_STOPF) { I2C1->ICR |= I2C_ICR_STOPCF; } else { I2C_ClearITPendingBit(I2C1, 0x00003F38); } } |
非常稳定, |