uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) { if (quantity > BUFFER_LENGTH) quantity = BUFFER_LENGTH; int readed = 0; int timeout_=TIMEOUT; while(timeout_--) { /* Send start */ I2C_START(i2c); I2C_WAIT_READY(i2c); /* Send control byte */ I2C_SET_DATA(i2c, (address<<1)+1); I2C_SET_CONTROL_REG(i2c, I2C_SI | I2C_AA); I2C_WAIT_READY(i2c); if(I2C_GET_STATUS(i2c)!=0x40) { /* Send stop */ I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI); continue; } readed = 0; while (readed < quantity){ /* Read data */ if((readed+1)==quantity) I2C_SET_CONTROL_REG(i2c, I2C_SI); else I2C_SET_CONTROL_REG(i2c, I2C_SI | I2C_AA); I2C_WAIT_READY(i2c); rxBuffer[readed++] = I2C_GET_DATA(i2c); }; if(sendStop==true){ /* Send stop */ I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI); }else I2C_SET_CONTROL_REG(i2c, I2C_SI); break; } // set rx buffer iterator vars rxBufferIndex = 0; rxBufferLength = readed; return readed; }
uint8_t TwoWire::endTransmission(uint8_t sendStop) { int sent = 0; /* Send data */ int timeout_=TIMEOUT; while(timeout_--) { /* Send start */ I2C_START(i2c); I2C_WAIT_READY(i2c); /* Send control byte */ I2C_SET_DATA(i2c, txAddress); I2C_SET_CONTROL_REG(i2c, I2C_SI); I2C_WAIT_READY(i2c); if(I2C_GET_STATUS(i2c)!=0x18) { I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI); continue; } sent = 0; while (sent < txBufferLength) { I2C_SET_DATA(i2c, txBuffer[sent++]); I2C_SET_CONTROL_REG(i2c, I2C_SI); I2C_WAIT_READY(i2c); if(I2C_GET_STATUS(i2c)!=0x28) { I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI); continue; } } if(sendStop==true) { /* Send stop */ I2C_SET_CONTROL_REG(i2c, I2C_STO | I2C_SI); } break; } // empty buffer txBufferLength = 0; status = MASTER_IDLE; return sent; }
uint8_t MPU6050_I2C_SingleRead(uint8_t index) { uint8_t tmp; I2C_START(MPU6050_I2C_PORT); //Start I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_I2C_SLA); //send slave address+W I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI); I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(MPU6050_I2C_PORT, index); //send index I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI); I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_STA | I2C_SI); //Start I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(MPU6050_I2C_PORT, (MPU6050_I2C_SLA+1)); //send slave address+R I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI); I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI); I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag tmp = I2C_GET_DATA(MPU6050_I2C_PORT); //read data I2C_STOP(MPU6050_I2C_PORT); //STOP return tmp; }
uint8_t LM75A_I2C_SingleRead(uint8_t index) { uint8_t tmp; I2C_START(LM75A_I2C_PORT); //Start I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(LM75A_I2C_PORT, LM75A_I2C_SLA); //send slave address+W I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(LM75A_I2C_PORT, index); //send index I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_STA | I2C_SI); //Start I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(LM75A_I2C_PORT, (LM75A_I2C_SLA+1)); //send slave address+R I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag tmp = I2C_GET_DATA(LM75A_I2C_PORT); //read data I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI|I2C_STO);//Stop return tmp; }
void MPU6050_I2C_SingleWrite(uint8_t index, uint8_t data) { I2C_START(MPU6050_I2C_PORT); //Start I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(MPU6050_I2C_PORT, MPU6050_I2C_SLA); //send slave address I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI); I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(MPU6050_I2C_PORT, index); //send index I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI); I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(MPU6050_I2C_PORT, data); //send Data I2C_SET_CONTROL_REG(MPU6050_I2C_PORT, I2C_SI); I2C_WAIT_READY(MPU6050_I2C_PORT); MPU6050_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_STOP(MPU6050_I2C_PORT); //STOP }
void LM75A_I2C_SingleWrite(uint8_t index, uint8_t data) { I2C_START(LM75A_I2C_PORT); //Start I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(LM75A_I2C_PORT, LM75A_I2C_SLA); //send slave address I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(LM75A_I2C_PORT, index); //send index I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(LM75A_I2C_PORT, data); //send Data I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI|I2C_STO);//Stop }
uint16_t LM75A_I2C_DoubleRead(uint8_t index) { uint8_t msb, lsb; uint16_t tmp; I2C_START(LM75A_I2C_PORT); //Start I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(LM75A_I2C_PORT, LM75A_I2C_SLA); //send slave address+W I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(LM75A_I2C_PORT, index); //send index I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_STA | I2C_SI); //Start I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_DATA(LM75A_I2C_PORT, (LM75A_I2C_SLA+1)); //send slave address+R I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag msb = I2C_GET_DATA(LM75A_I2C_PORT); //read data I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI); I2C_WAIT_READY(LM75A_I2C_PORT); LM75A_I2C_PORT->INTSTS |= I2C_INTSTS_INTSTS_Msk; //clear flag lsb = I2C_GET_DATA(LM75A_I2C_PORT); //read data I2C_SET_CONTROL_REG(LM75A_I2C_PORT, I2C_SI|I2C_STO);//Stop tmp = msb; tmp = tmp<<8 | lsb; return tmp; }