void i2c_read_multiple(char address, char reg, unsigned char * data, char length) { OC2RS = 2500; i2c_master_start(); //ST i2c_master_send(address << 1); //SAD+W - SAK i2c_master_send(reg); //SUB - SAK i2c_master_restart(); //SR i2c_master_send(address << 1 | 0b1); //SAD+R - SAK unsigned char i; for (i=0; i<length; i++) { data[i] = i2c_master_recv(); //DATA if (i == length-1) {i2c_master_ack(1);} //NMAK if last read else {i2c_master_ack(0);} //MAK if not last read } i2c_master_stop(); //SP }
void I2C_read_multiple(char address, char register_, unsigned char* data, char length){ i2c_master_start(); i2c_master_send(address << 1|0); i2c_master_send(register_); i2c_master_restart(); i2c_master_send(address << 1|1); int i; for(i = 0; i < length-1; i++){ data[i] = i2c_master_recv(); i2c_master_ack(0); } data[length-1] = i2c_master_recv(); i2c_master_ack(1); i2c_master_stop(); }
void i2c_master_read_all(char device,char start_reg,int numval,unsigned char* array) { int counter=0; i2c_master_start(); i2c_master_send((device << 1) | 0); // writing i2c_master_send(start_reg); i2c_master_restart(); // send a RESTART to read i2c_master_send((device << 1) | 1); // reading for(;counter<numval;counter++) { array[counter] = i2c_master_recv(); // receive a byte from the bus i2c_master_ack(0); } array[numval] = i2c_master_recv(); i2c_master_ack(1); i2c_master_stop(); }
void i2c_read_multiple(char address, char reg, unsigned char * data, char length) { i2c_master_start(); //First write unsigned char devopW = (address << 1) | 0x00; // append 0 at the end of the address for the write unsigned char devopR = (address << 1) | 0x01; i2c_master_send(devopW); i2c_master_send(reg); // register to start reading from i2c_master_restart(); i2c_master_send(devopR); int i=0; for(i=0; i<(int)length-1; i++) { data[i] = i2c_master_recv(); i2c_master_ack(0); // continue reading length - 1 bytes } data[(int)length-1] = i2c_master_recv(); // read the last byte i2c_master_ack(1); // send the last acknowledgment with 1 i2c_master_stop(); }
char readaddress(){ i2c_master_start(); i2c_master_send(0b11010110); i2c_master_send(0x0F); i2c_master_restart(); i2c_master_send(0b11010111); read=i2c_master_recv(); i2c_master_ack(1); i2c_master_stop(); return read; }
char I2C_read_WHOAMI(void){ i2c_master_start(); i2c_master_send(ADDRESS << 1|0); //IMU address i2c_master_send(0x0F); //WHO_AM_I i2c_master_restart(); i2c_master_send(ADDRESS << 1|1); char r = i2c_master_recv(); i2c_master_ack(1); i2c_master_stop(); return r; }
unsigned char readByte(unsigned char address) { unsigned char result; i2c_master_start(); i2c_master_send(MCP23008_ADDRESS << 1); i2c_master_send(address); i2c_master_restart(); i2c_master_send(MCP23008_ADDRESS << 1 | 0b1); result = i2c_master_recv(); i2c_master_ack(1); i2c_master_stop(); return result; }
unsigned char getExpander() { i2c_master_start(); i2c_master_send(0x40); i2c_master_send(0x09); i2c_master_restart(); i2c_master_send(0x41); unsigned char input=i2c_master_recv(); i2c_master_ack(1); i2c_master_stop(); return input; }
void I2C_read_multiple(char address, char reg_addr, unsigned char * data, char length){ i2c_master_start(); i2c_master_send(address << 1 | 0); // chip address & indicate write i2c_master_send(reg_addr); // addr of OUT_TEMP_L register i2c_master_restart(); // make the restart bit, so we can begin reading i2c_master_send(address << 1 | 1); // chip address & indicate reading for(j = 0; j < length - 1; j++){ *(data + j) = i2c_master_recv(); i2c_master_ack(0); // make the ack so the slave knows we got it } *(data + length) = i2c_master_recv(); i2c_master_ack(1); i2c_master_stop(); // make the stop bit temp = data_array[0] << 8 | data_array[1]; gyroX = data_array[2] << 8 | data_array[3]; gyroY = data_array[4] << 8 | data_array[5]; gyroZ = data_array[6] << 8 | data_array[7]; accelX = data_array[8] << 8 | data_array[9]; accelY = data_array[10] << 8 | data_array[11]; accelZ = data_array[12] << 8 | data_array[13]; }
char i2c_master_read(char device, char reg_addr) { char read_master; i2c_master_start(); i2c_master_send((device << 1) | 0); // writing i2c_master_send(reg_addr); i2c_master_restart(); // send a RESTART to read i2c_master_send((device << 1) | 1); // reading read_master = i2c_master_recv(); // receive a byte from the bus i2c_master_ack(1); i2c_master_stop(); return read_master; }
void i2c_readmulti(){ i2c_master_start(); i2c_master_send(0b11010110); i2c_master_send(0x20); i2c_master_restart(); i2c_master_send(0b11010111); int i; for(i=0;i<13;i++) { arr[i]=i2c_master_recv(); i2c_master_ack(0); } arr[13]=i2c_master_recv(); i2c_master_ack(1); i2c_master_stop(); tem=(arr[1]<<8)|(arr[0]); gx=(arr[3]<<8)|(arr[2]); gy=(arr[5]<<8)|(arr[4]); gz=(arr[7]<<8)|(arr[6]); ax=(arr[9]<<8)|(arr[8]); ay=(arr[11]<<8)|(arr[10]); az=(arr[13]<<8)|(arr[12]); }
void sendByte(unsigned char data, unsigned char address) { // Start the I2C Write Transmission i2c_start(I2C_START_CMD); // Write the address i2c_write(address|I2C_WRITE_CMD); // Write data to PCA8574 Register i2c_write(data); // Send No Acknowledge to the Slave i2c_master_ack(I2C_DATA_NOACK); // Stop I2C Transmission i2c_stop(); }
unsigned char readByte(unsigned char address) { unsigned char data; // Start the I2C Write Transmission i2c_start(I2C_START_CMD); // read the given node i2c_write(address|I2C_READ_CMD); // Get the High Byte of MCP9801 I2C Temp Sensor data=i2c_read(); // Send No Acknowledge to the Slave i2c_master_ack(I2C_DATA_NOACK); // Stop I2C Transmission i2c_stop(); return data; }
int main() { unsigned char master_read = 0x00; __builtin_disable_interrupts(); // set the CP0 CONFIG register to indicate that kseg0 is cacheable (0x3) __builtin_mtc0(_CP0_CONFIG, _CP0_CONFIG_SELECT, 0xa4210583); // 0 data RAM access wait states BMXCONbits.BMXWSDRM = 0x0; // enable multi vector interrupts INTCONbits.MVEC = 0x1; // disable JTAG to get pins back DDPCONbits.JTAGEN = 0; TRISAbits.TRISA4 = 1; //set port A4 (PIN12)as input pin for button input TRISBbits.TRISB4 = 0; //set port B4 (PIN11)as output pin for LED i2c_init(); i2c_imu_init(); __builtin_enable_interrupts(); //WHO_AM_I (0Fh) i2c_master_start(); i2c_master_send(0xD6); i2c_master_send(0x0F); i2c_master_restart(); i2c_master_send(0xD7); unsigned char input=i2c_master_recv(); i2c_master_ack(1); i2c_master_stop(); }