/* I2C Slave with Interrupt Init */ void I2C_SlaveWithInterrupt_Init(I2C_TypeDef* I2Cx, uint32_t freq, int SlaveAddr, pin_t scl, pin_t sda){ NVIC_InitTypeDef i2c_slave_nvic; uint8_t _i2c_er_irq; I2C_Master_Init(I2Cx, freq, scl, sda); I2C_Slave_Mode(I2Cx, 1); I2C_Slave_Address(I2Cx, SlaveAddr); /* Configure the Priority Group to 1 bit */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); if(I2Cx == I2C1){ _i2c_er_irq = I2C1_ER_IRQn; i2c_slave_nvic.NVIC_IRQChannel = I2C1_EV_IRQn; }else if(I2Cx == I2C2){ _i2c_er_irq = I2C2_ER_IRQn; i2c_slave_nvic.NVIC_IRQChannel = I2C2_EV_IRQn; } i2c_slave_nvic.NVIC_IRQChannelPreemptionPriority = 1; i2c_slave_nvic.NVIC_IRQChannelSubPriority = 0; i2c_slave_nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&i2c_slave_nvic); i2c_slave_nvic.NVIC_IRQChannel = _i2c_er_irq; NVIC_Init(&i2c_slave_nvic); /* Enable Error Interrupt */ I2C_ITConfig(I2Cx, (I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE); }
//********************************************************* void I2C_Main() { char i; #if Slave_Mode == 1 if(I2C->SlaveGO) { I2C->SlaveGO=0; I2C_Slave_Mode(); SSPIE=1; if(I2C->SlaveTxGO) { I2C->SlaveTxGO=0; SS1=0; I2C->SS=0; } if(I2C->SlaveRxGO) { I2C->SlaveRxGO=0; I2C_SetData(0); } LED2=~LED2; } #endif #if Master_Mode == 1 if(I2C->MasterRxGO) { I2C->MasterRxGO=0; I2C_Master_Reception(); TMain->Test=1; LED2=~LED2; #if UART_use == 1 for(i=0;i<32;i++) { UART->TxData[i]=I2C->BufferReader[i]; } UART->TxGO=1; #endif } else { if(SS1) { if(!I2C->SS) { I2C->SS=1; I2C->MasterRxGO=1; } } else { if(I2C->SS) { I2C->SS=0; } if(I2C->MasterTxGO) { I2C->MasterTxGO=0; I2C_Master_Transmission(); } } } #endif }
/* I2C Slave Init */ void I2C_Slave_Init(I2C_TypeDef* I2Cx, uint32_t freq, int SlaveAddr, pin_t scl, pin_t sda){ I2C_Master_Init(I2Cx, freq, scl, sda); I2C_Slave_Mode(I2Cx, 1); I2C_Slave_Address(I2Cx, SlaveAddr); }