int16_t i2c_read_word(uint8_t dev, uint8_t addr){ if(i2c_send_start()!=0) return 0; if(i2c_send_addr(dev,TW_WRITE)!=0) return 0; if(i2c_send_data(addr)!=0) return 0; if(i2c_send_start()!=0) return 0; if(i2c_send_addr(dev,TW_READ)!=0) return 0; uint8_t datal= i2c_receive_data(1); uint8_t datah= i2c_receive_data(0); i2c_send_stop(); return ((datah<<8) | datal); }
uint8_t i2c_read_byte(uint8_t dev, uint8_t addr){ if(i2c_send_start()!=0) return 0; if(i2c_send_addr(dev,TW_WRITE)!=0) return 0; if(i2c_send_data(addr)!=0) return 0; if(i2c_send_start()!=0) return 0; if(i2c_send_addr(dev,TW_READ)!=0) return 0; uint8_t data= i2c_receive_data(0); i2c_send_stop(); return data; }
void i2c_seq_read(uint8_t dev, uint8_t start_addr, uint8_t*buff, uint8_t len){ int i=0; if(i2c_send_start()!=0) return; if(i2c_send_addr(dev,TW_WRITE)!=0) return; if(i2c_send_data(start_addr)!=0) return; if(i2c_send_start()!=0) return; if(i2c_send_addr(dev,TW_READ)!=0) return; for(i=0;i<len;i++) *buff++=i2c_receive_data((i<(len-1))?1:0); //send ack until last byte to read i2c_send_stop(); }
/*! \brief handle I2C1 event interrupt request \param[in] none \param[out] none \retval none */ void I2C1_EventIRQ_Handler(void) { if(i2c_flag_get(I2C1, I2C_ADDSEND)){ /* clear the ADDSEND bit */ event2 =i2c_flag_get(I2C1,I2C_ADDSEND ); }else if(i2c_flag_get(I2C1, I2C_RBNE)){ /* if reception data register is not empty ,I2C1 will read a data from I2C_DATA */ *i2c_rxbuffer++ = i2c_receive_data(I2C1); }else if(i2c_flag_get(I2C1, I2C_STPDET)){ Status=SUCCESS; /* clear the STPDET bit */ i2c_enable(I2C1); /* disable I2C1 interrupt */ i2c_interrupt_disable(I2C1, I2C_CTL1_ERRIE | I2C_CTL1_BUFIE | I2C_CTL1_EVIE); } }