Esempio n. 1
0
//-----------------------------------------------------------------------------
// unsigned char i2c_slave_present(unsigned char slave_address)
//
// This function is used to look for a slave address on the I2C bus.  
// It sends a START and STOP condition back-to-back and wait for an ACK from the slave
//
// IN:   unsigned char slave_address  =>  Slave Address
// OUT:  unsigned char                =>  0: address was not found, 
//                                        1: address found
//-----------------------------------------------------------------------------
unsigned char i2c_slave_present(int bus_num, unsigned char slave_address) {
   unsigned char uc1ie_bak, slaveadr_bak, ucb1i2cie_bak, returnValue;
   //store state
   ucb1i2cie_bak =  *i2c_control.i2cie[bus_num];                   // store *i2c_control.i2cie[bus_num] register
   uc1ie_bak     =  *i2c_control.ie[bus_num];                       // store UC1IE register
   slaveadr_bak  =  *i2c_control.i2csa[bus_num];                   // store old slave address
   //start i2c
   while ( i2c_busy(bus_num) );
   i2c_init_transmit(bus_num,slave_address);
   //
   *i2c_control.i2cie[bus_num]    &= ~UCNACKIE;                    // no NACK interrupt
   *i2c_control.i2csa[bus_num]     =  slave_address;               // set slave address
   *i2c_control.ie[bus_num]        &= ~(i2c_control.ietx[bus_num] + i2c_control.ierx[bus_num]);       // no RX or TX interrupts
   __disable_interrupt();
   *i2c_control.ctl1[bus_num]     |=  UCTR + UCTXSTT + UCTXSTP;    // transmitter, start and stop condition
   while (*i2c_control.ctl1[bus_num] & UCTXSTP);                   // wait for STOP condition
   returnValue   = !(*i2c_control.stat[bus_num] & UCNACKIFG);      // 0 if an ACK was received
   __enable_interrupt();
   
   //restore state
   *i2c_control.ie[bus_num]         =  uc1ie_bak;                   // restore IE2
   *i2c_control.i2csa[bus_num]     =  slaveadr_bak;                // restore old slave address
   *i2c_control.i2cie[bus_num]     =  ucb1i2cie_bak;               // restore old UCB0CTL1
   return returnValue;                           // return whether or not 
}
Esempio n. 2
0
void i2c_write_register(uint8_t bus_num, uint8_t slave_addr, uint8_t reg_addr, uint8_t reg_setting) {
   uint8_t i2c_packet[2] = {reg_addr, reg_setting};
   i2c_init_transmit(bus_num,slave_addr);
   while ( i2c_busy(bus_num) );
   i2c_transmit(bus_num,sizeof(i2c_packet),i2c_packet);
   while ( i2c_busy(bus_num) );
   __delay_cycles(I2C_BUS_FREE_TIME);
}
Esempio n. 3
0
/**
data contains the register as a first element if needed. Note that i2c is a
transport mechanism and whether there is a register as a first param or not is
app/device dependent
*/
void i2c_write_register(uint8_t bus_num, uint8_t slave_addr, uint8_t length, uint8_t* data) {
   
   i2c_init_transmit(bus_num,slave_addr);
   while( i2c_busy(bus_num) );
   
   i2c_transmit(bus_num,length,data);
   while( i2c_busy(bus_num) );
   
   __delay_cycles(I2C_BUS_FREE_TIME);
}
Esempio n. 4
0
void i2c_read_registers(uint8_t bus_num, uint8_t slave_addr, uint8_t reg_addr, uint8_t numBytes, uint8_t* spaceToWrite) {
   uint8_t i2c_packet[1] = {reg_addr};
   //transmit reg address to gyro
   i2c_init_transmit(bus_num,slave_addr);
   while ( i2c_busy(bus_num) );
   i2c_transmit(bus_num,sizeof(i2c_packet),i2c_packet);
   while ( i2c_busy(bus_num) );
   __delay_cycles(I2C_BUS_FREE_TIME);
   //read what gyro has to say
   i2c_init_receive(bus_num,slave_addr);
   while ( i2c_busy(bus_num) );
   i2c_receive(bus_num,numBytes,spaceToWrite);
   while ( i2c_busy(bus_num) );
   __delay_cycles(I2C_BUS_FREE_TIME);
}