int RcvIMUData(unsigned int reg_addr) { // //see page 92 of https://www.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf rcv = 0; StartI2C2(); //Send line start condition IdleI2C2(); //Wait to complete MasterWriteI2C2(0x50); //Write slave addr WRITE (OR 0) IdleI2C2(); MasterWriteI2C2(reg_addr); //BNO055_QUATERNION_DATA_W_LSB_ADDR IdleI2C2(); RestartI2C2(); IdleI2C2(); MasterWriteI2C2(0x51); //Write the slave address, READ (OR 1) IdleI2C2(); rcv |= MasterReadI2C2(); //Read in LSB IdleI2C2(); AckI2C2(); IdleI2C2(); rcv |= MasterReadI2C2()<<8; //Read in MSB NotAckI2C2(); IdleI2C2(); StopI2C2(); //Send line stop condition IdleI2C2(); return rcv; }
/** * Reads temperature from IR sensor of an object in front of sensor * @return A hex value from 0x27AD (-70 ?C) to 0x7fff (382.19?C) */ int RcvIRTemp(void){ rcv = 0; StartI2C2(); //Send line start condition IdleI2C2(); //Wait to complete MasterWriteI2C2(0xb4); //Write slave addr WRITE (OR 0) IdleI2C2(); MasterWriteI2C2(0x07); //0x07 = read RAM for TObj1 temperature IdleI2C2(); RestartI2C2(); IdleI2C2(); MasterWriteI2C2(0xb5); //Write the slave address, READ (OR 1) IdleI2C2(); rcv |= MasterReadI2C2(); //Read in LSB IdleI2C2(); AckI2C2(); //Acknowledge LSB IdleI2C2(); rcv |= MasterReadI2C2()<<8; //Read in MSB AckI2C2(); //Acknowledge MSB IdleI2C2(); MasterReadI2C2(); //Read in PEC AckI2C2(); //Acknowledge MSB IdleI2C2(); StopI2C2(); //Send line stop condition IdleI2C2(); return rcv; //Return read value }
char I2C2_READ_String(U8 DevAdd, U8 RegAdd, U8 *RegValue, U8 len) { int DataWait = len*100; char ComRes,DevAddr; DevAddr = (DevAdd<<1)|M_I2C_Write; StartI2C2(); // Send the start bit IdleI2C2(); // Wait to complete while(I2C2STATbits.ACKSTAT); //wait for acknowledgement ComRes=MasterWriteI2C2(DevAddr); // Adress with write mode IdleI2C2(); // Wait to complete while(I2C2STATbits.ACKSTAT); //wait for acknowledgement ComRes=MasterWriteI2C2(RegAdd); // Write the chip ID register loaction for read IdleI2C2(); // Send the start bit while(I2C2STATbits.ACKSTAT); //wait for acknowledgement RestartI2C2(); // Send the start bit IdleI2C2(); // Wait to complete while(I2C2STATbits.ACKSTAT); //wait for acknowledgement DevAddr = (DevAdd<<1)|M_I2C_Read; MasterWriteI2C2(DevAddr); // Adress with write mode IdleI2C2(); // Wait to complete while(I2C2STATbits.ACKSTAT); //wait for acknowledgement MastergetsI2C2(len, RegValue, DataWait); // Read the Register value IdleI2C2(); // Wait to complete NotAckI2C2(); // Not Acknowledge I2C IdleI2C2(); // Wait to complete StopI2C2(); // Stop I2C communication IdleI2C2(); // Wait to complete; return ComRes; }
S8 I2C2_WRITE_String(U8 DevAdd, U8 RegAdd, U8 *RegValue, U8 len) { char ComRes; DevAdd = (DevAdd<<1)|M_I2C_Write; StartI2C2(); // Send the start bit IdleI2C2(); // Wait to complete while(I2C2STATbits.ACKSTAT); //wait for acknowledgement ComRes=MasterWriteI2C2(DevAdd); // Adress with write mode IdleI2C2(); // Wait to complete while(I2C2STATbits.ACKSTAT); //wait for acknowledgement ComRes=MasterWriteI2C2(RegAdd); // Write the chip ID register loaction for read IdleI2C2(); // Send the start bit while(I2C2STATbits.ACKSTAT); //wait for acknowledgement while(len--) { ComRes=MasterWriteI2C2(*RegValue); // Write the chip ID register loaction for read IdleI2C2(); // Wait to complete while(I2C2STATbits.ACKSTAT); //wait for acknowledgement RegValue++; } StopI2C2(); // Stop the I2C communication IdleI2C2(); // Wait to complete return ComRes; }
void LDWordReadI2C(unsigned char SlaveAddress, unsigned char reg, unsigned char *data1, unsigned char *data2){ StartI2C2(); //Send the Start Bit IdleI2C2(); //Wait to complete MasterWriteI2C2(SlaveAddress); //transmit write command IdleI2C2(); //Wait to complete MasterWriteI2C2(reg); IdleI2C2(); StopI2C2(); IdleI2C2(); StartI2C2(); //Send the Start Bit IdleI2C2(); //Wait to complete MasterWriteI2C2(SlaveAddress|0x01); //transmit read command IdleI2C2(); //Wait to complete unsigned char data[2]; MastergetsI2C2(2, data, 30); // "MCHP I2C" *data1=data[0]; *data2=data[1]; // if (status!=0) // while(1); StopI2C2(); //Send the Stop condition IdleI2C2(); //Wait to complete }
void LDWordWriteI2C(unsigned char SlaveAddress, unsigned char reg, unsigned char data1, unsigned char data2){ StartI2C2(); //Send the Start Bit IdleI2C2(); //Wait to complete MasterWriteI2C2(SlaveAddress); //transmit write command IdleI2C2(); //Wait to complete MasterWriteI2C2(reg); IdleI2C2(); MasterWriteI2C2(data1); IdleI2C2(); MasterWriteI2C2(data2); IdleI2C2(); StopI2C2(); IdleI2C2(); }
void sleepIRTemp(){ StartI2C2(); //Send line start condition IdleI2C2(); //Wait to complete MasterWriteI2C2(0xb4); //Write slave addr WRITE (OR 0) IdleI2C2(); MasterWriteI2C2(0xff); //sleep command IdleI2C2(); MasterReadI2C2(); //Read in PEC IdleI2C2(); AckI2C2(); //Acknowledge PEC IdleI2C2(); StopI2C2(); }
void SendIMUData (int reg_addr, int data){ StartI2C2(); //Send the Start Bit IdleI2C2(); //Wait to complete MasterWriteI2C2(0x50); //Sends the slave address over the I2C line. IdleI2C2(); //Wait to complete MasterWriteI2C2(reg_addr); //Sends data byte over I2C line IdleI2C2(); //Wait to complete MasterWriteI2C2(data); IdleI2C2(); //wait for ack StopI2C2(); //Send the Stop condition IdleI2C2(); //Wait to complete }
void i2cSendByte(unsigned char channel, unsigned char byte) { if (channel == 1) { MasterWriteI2C1(byte); while(I2C1STATbits.TRSTAT); while(I2C1STATbits.ACKSTAT); } else { MasterWriteI2C2(byte); while(I2C2STATbits.TRSTAT); while(I2C2STATbits.ACKSTAT); } }
/***************************************************** * RcvData(unsigned int address) * * * * Gets a byte of data from I2C slave device at * * ADDRESS. * * * * Returns: Received data * ****************************************************/ int RcvData(unsigned int address) { StartI2C2(); //Send line start condition IdleI2C2(); //Wait to complete MasterWriteI2C2((address << 1) | 1); //Write out slave address OR 1 (read command) IdleI2C2(); //Wait to complete rcv = MasterReadI2C2(); //Read in a value IdleI2C2(); AckI2C2(); IdleI2C2(); StopI2C2(); //Send line stop condition IdleI2C2(); //Wait co complete return rcv; //Return read value }
int RcvIRTemp(unsigned int address){ rcv = 0; StartI2C2(); //Send line start condition IdleI2C2(); //Wait to complete MasterWriteI2C2(0xb4); //Write slave addr WRITE (OR 0) IdleI2C2(); MasterWriteI2C2(0xf0); //command // //Command to read Tobj1 on ir sensor's ram: 000 = read ram; 0x07 = tobj1 IdleI2C2(); //Wait to complete // StopI2C2(); //restart // IdleI2C2(); // StartI2C2(); // IdleI2C2(); // // MasterWriteI2C2(0xb5); //Write the slave address, READ (OR 1) // IdleI2C2(); MasterReadI2C2(); //Read in LSB IdleI2C2(); AckI2C2(); //Acknowledge LSB IdleI2C2(); MasterReadI2C2(); //Read in MSB IdleI2C1(); AckI2C2(); //Acknowledge MSB IdleI2C2(); MasterReadI2C2(); //Read in PEC IdleI2C1(); AckI2C2(); //Acknowledge MSB IdleI2C2(); StopI2C2(); //Send line stop condition IdleI2C2(); //Wait co complete return rcv; //Return read value }
/***************************************************************************** * Function Name : gyroSendByte * Description : Send a byte to gyroscope * Parameters : byte - a byte to send * Return Value : None *****************************************************************************/ static inline void gyroSendByte( unsigned char byte ) { MasterWriteI2C2(byte); while(I2C2STATbits.TRSTAT); while(I2C2STATbits.ACKSTAT); }