void IIC_Start(void) { /* Send a start condition to I2C bus */ I2C_StartOnBus_Enable(BOARD_I2C,ENABLE); /* The software must wait until SBSEND bit is set */ #ifdef DBG_OLED_BLOCK while(!I2C_StateDetect(BOARD_I2C,I2C_PROGRAMMINGMODE_MASTER_SBSEND)); #else I2C_StateDetect_Timeout(BOARD_I2C,I2C_PROGRAMMINGMODE_MASTER_SBSEND); #endif }
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++; }
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; }
/** * @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; }