Пример #1
0
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();
}
Пример #5
0
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;
}
Пример #8
0
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;
}
Пример #9
0
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;
}
Пример #11
0
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]);
}
Пример #12
0
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();
}
Пример #13
0
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;
}
Пример #14
0
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();
    
    
   
    
    
    
    
}