void I2C_ReadFromReg_Burst(uint8_t address, uint8_t deviceRegister, uint8_t* data, uint8_t burstNum) { // Assert the start condition StartI2C1(); while (I2C1CONbits.SEN); // Send the 7-bit device address MasterWriteI2C1(address << 1); while (I2C1STATbits.TBF); // 8 clock cycles while (!IFS1bits.MI2C1IF); // Wait for 9th clock cycle IFS1bits.MI2C1IF = 0; // Clear interrupt flag // Send the register address MasterWriteI2C1(deviceRegister); while (I2C1STATbits.TBF); // 8 clock cycles while (!IFS1bits.MI2C1IF); // Wait for 9th clock cycle IFS1bits.MI2C1IF = 0; // Clear interrupt flag // Start a new I2C transaction RestartI2C1(); while (I2C1CONbits.RSEN); // Send the second address MasterWriteI2C1((address << 1) + 1); while (I2C1STATbits.TBF); // 8 clock cycles while (!IFS1bits.MI2C1IF); // Wait for 9th clock cycle IFS1bits.MI2C1IF = 0; // Clear interrupt flag // Read the data data[0] = MasterReadI2C1(); if (burstNum > 1) { uint8_t i; for (i = 1; i < burstNum; i++) { AckI2C1(); while (I2C1CONbits.ACKEN == 1); data[i] = MasterReadI2C1(); } } // No need to ack reception of this data NotAckI2C1(); while (I2C1CONbits.ACKEN == 1); // Stop the I2C transaction StopI2C1(); while (I2C1CONbits.PEN); // Go idle on the bus IdleI2C1(); }
int RcvData2(unsigned int address){ rcv = 0; StartI2C1(); //Send line start condition IdleI2C1(); //Wait to complete MasterWriteI2C1((address << 1) | 1); //Write out slave address OR 1 (read command) IdleI2C1(); //Wait to complete rcv = MasterReadI2C1()<<8; //Read in a value AckI2C1(); rcv |= MasterReadI2C1(); StopI2C1(); //Send line stop condition IdleI2C1(); //Wait co complete return rcv; //Return read value }
uint8_t I2C_ReadFromReg(uint8_t I2CAddress, uint8_t deviceRegister) { uint8_t data = 0; StartI2C1(); while(I2CCONbits.SEN); MasterWriteI2C1(I2CAddress << 1); while(I2CSTATbits.TBF); // 8 clock cycles while(!IFS1bits.MI2C1IF); // Wait for 9th clock cycle IFS1bits.MI2C1IF = 0; // Clear interrupt flag MasterWriteI2C1(deviceRegister); while(I2CSTATbits.TBF); // 8 clock cycles while(!IFS1bits.MI2C1IF); // Wait for 9th clock cycle IFS1bits.MI2C1IF = 0; // Clear interrupt flag RestartI2C1(); // Second start. while(I2CCONbits.RSEN); MasterWriteI2C1((I2CAddress << 1 )+ 1); while(I2CSTATbits.TBF); // 8 clock cycles while(!IFS1bits.MI2C1IF); // Wait for 9th clock cycle IFS1bits.MI2C1IF = 0; // Clear interrupt flag data = MasterReadI2C1(); NotAckI2C1(); // Read stop sequence. while(I2C1CONbits.ACKEN == 1); StopI2C1(); while(I2CCONbits.PEN); IdleI2C1(); return(data); }
/** * @brief Write to device using generic i2c protocol * @param[in] slave_addr - slave address * @param[in] reg_addr - register address * @param[in] length - number of bytes to read * @param[in] *data - pointer to where register data is to be transfered * @return 0 if sucessfull, 1 otherwise */ int i2c_read(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char *data) { BYTE i=2; StartI2C1(); //Send the Start Bit IdleI2C1(); if (MasterWriteI2C1(((slave_addr<<1)|(0x00)))) return 1; IdleI2C1(); if (MasterWriteI2C1(reg_addr)) return 1; IdleI2C1(); StartI2C1(); //Send the Start Bit IdleI2C1(); //Wait to complete if (MasterWriteI2C1(((slave_addr<<1)|(0x01)))) return 1; IdleI2C1(); I2CReceiverEnable ( I2C1, TRUE); for(i=0;i<length;i++) { data[i] = MasterReadI2C1(); if(i<(length-1)) { I2CAcknowledgeByte(MPU_I2C, TRUE); IdleI2C1(); } else { I2CAcknowledgeByte(MPU_I2C, FALSE); IdleI2C1(); } } StopI2C1(); //Send the Stop condition IdleI2C1(); //Wait to complete return 0; }
/* * Function reads I2C device from slaveAdd * inputs: slaveAdd * registerAdd * returns: int recByte -> received byte from slave device * -1 -> reading error */ unsigned char I2C1ReadByte1(UINT8 slaveAdd, UINT8 registerAdd) { unsigned char recByte = 0; UINT8 address; StartI2C1(); IdleI2C1(); //Wait to complete address = (slaveAdd<<1) & 0xFE; //write MasterWriteI2C1(address); IdleI2C1(); if(I2C1STATbits.ACKSTAT) { StopI2C1(); IdleI2C1(); return 0; } //Send register register location MasterWriteI2C1(registerAdd); IdleI2C1(); if(I2C1STATbits.ACKSTAT) { StopI2C1(); IdleI2C1(); return 0; } RestartI2C1(); //Send start condition again IdleI2C1(); address = (slaveAdd<<1) | 0x01; //Read MasterWriteI2C1(address); IdleI2C1(); if(I2C1STATbits.ACKSTAT) { StopI2C1(); IdleI2C1(); return 0; } recByte = MasterReadI2C1(); //NotAckI2C1(); IdleI2C1(); StopI2C1(); IdleI2C1(); return recByte; }
unsigned char portableMasterReadI2C(I2cBusConnection* i2cBusConnection) { I2cBus* i2cBus = i2cBusConnection->i2cBus; if (i2cBus == NULL) { return MasterReadI2C1(); } else { unsigned portIndex = i2cBus->port; if (portIndex == I2C_BUS_PORT_1) { I2C1CONbits.RCEN = 1; while (I2C1CONbits.RCEN); I2C1STATbits.I2COV = 0; return(I2C1RCV); } #if defined _I2C2 else if (portIndex == I2C_BUS_PORT_2) { TODO : Throw Not Implemented I2C2CONbits.RCEN = 1; while (I2C2CONbits.RCEN); I2C2STATbits.I2COV = 0; return (I2C2RCV); } #endif #if defined _I2C3 else if (portIndex == I2C_BUS_PORT_3) { I2C3CONbits.RCEN = 1; while(I2C3CONbits.RCEN); I2C3STATbits.I2COV = 0; return (I2C3RCV); } #endif #if defined _I2C4 else if (portIndex == I2C_BUS_PORT_4) { I2C4CONbits.RCEN = 1; while(I2C4CONbits.RCEN); I2C4STATbits.I2COV = 0; return (I2C4RCV); } #endif } return 0; }
unsigned char Read23X08_17(unsigned char reg, unsigned char gAddrPins) { unsigned char num; StartI2C1(); // Wait till start sequence is completed while (I2C1CONbits.SEN); MasterWriteI2C1(gControlByte | WrtCmd | gAddrPins); WaitForACK(); MasterWriteI2C1(reg); WaitForACK(); RestartI2C1(); IdleI2C1(); MasterWriteI2C1(gControlByte | RdCmd | gAddrPins); WaitForACK(); num = MasterReadI2C1(); NotAckI2C1(); StopI2C1(); IdleI2C1(); return (num); }
unsigned char i2cReceiveByte(unsigned char channel) { if (channel == 1) { return MasterReadI2C1(); } else { return MasterReadI2C2(); } }