void i2c_writereg(int address, int reg, int data) { i2c_sendheader(address); I2C_SendData(I2C1, reg); I2C_SendData(I2C1, data); while (I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED) == ERROR && I2CTIMEOUTCONDITION) { i2ccount++; } I2C_StopOnBus_Enable(I2C1, ENABLE); #ifdef WAITFORSTOP while (I2C1->CTLR1 & 0x0200 && I2CTIMEOUTCONDITION) i2ccount++; #endif if (!I2CTIMEOUTCONDITION) { liberror++; } }
/** * @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); } } }
int i2c_readreg(int address, int reg) { int data; i2c_sendheader(address); I2C_SendData(I2C1, reg); while (I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED) == ERROR && I2CTIMEOUTCONDITION) { i2ccount++; } // restart I2C_StartOnBus_Enable(I2C1, ENABLE); while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_SBSEND && I2CTIMEOUTCONDITION)) { i2ccount++; } // send receiveing address I2C_SendData(I2C1, (address << 1) + 1); while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND) && I2CTIMEOUTCONDITION) { i2ccount++; } // wait for one byte while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_RECEIVED) && I2CTIMEOUTCONDITION) { i2ccount++; } data = I2C_ReceiveData(I2C1); I2C_StopOnBus_Enable(I2C1, ENABLE); // wait for stop #ifdef WAITFORSTOP while (I2C1->CTLR1 & 0x0200 && I2CTIMEOUTCONDITION) i2ccount++; #endif if (!I2CTIMEOUTCONDITION) { liberror++; } return data; }
void IIC_Stop(void) { /* Send a stop condition to I2C bus */ I2C_StopOnBus_Enable(BOARD_I2C,ENABLE); #ifdef DBG_OLED_BLOCK while(BOARD_I2C->CTLR1&0x0200); #else reset_timout_tic(); while(BOARD_I2C->CTLR1&0x0200 && timeout_tic > 0) { timeout_tic--; } if (timeout_tic == 0) { reboot_system(SUCCESS); } #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); }
int i2c_readdata(int address, int reg, int *data, int size) { int index = 0; int error = 0; int i2ccount2 = 0; int byteerror = 0; i2c_sendheader(address); I2C_SendData(I2C1, reg); while (I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED) == ERROR && I2CTIMEOUTCONDITION) i2ccount++; // restart I2C_StartOnBus_Enable(I2C1, ENABLE); while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_SBSEND) && I2CTIMEOUTCONDITION) { i2ccount++; } // read address I2C_SendData(I2C1, (address << 1) + 1); I2C_Acknowledge_Enable(I2C1, ENABLE); while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND) && I2CTIMEOUTCONDITION) { i2ccount++; } while (index < size) { i2ccount2 = 0; while (!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_RECEIVED) && (i2ccount2 < 2048)) { i2ccount2++; } if (i2ccount2 >= 2048) byteerror = 1; data[index] = I2C_ReceiveData(I2C1); index++; if (index == size - 1) I2C_Acknowledge_Enable(I2C1, DISABLE); } I2C_StopOnBus_Enable(I2C1, ENABLE); // wait for stop #ifdef WAITFORSTOP while (I2C1->CTLR1 & 0x0200 && I2CTIMEOUTCONDITION) i2ccount++; #endif if (!I2CTIMEOUTCONDITION || byteerror) { liberror++; error = 1; } I2C_Acknowledge_Enable(I2C1, DISABLE); return error; }