//----------------------------------------------------------------------------- // 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 }
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); }
/** 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); }
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); }