int gpio_i2c_readX_KeyPad_Fix( int Grp, unsigned char Dev, void (*Func[2])(void)) { int rxdata; I2C_LOCK(Grp); if(Func[0]) { (*Func[0])(); } i2c_start_bit(Grp); i2c_send_byte(Grp, (unsigned char)(Dev) | 1); i2c_receive_ack(Grp); rxdata = i2c_receive_byte(Grp); i2c_receive_ack(Grp); i2c_stop_bit(Grp); if(Func[1]) { (*Func[1])(); } I2C_UNLOCK(Grp); return (unsigned char)rxdata; }
int i2c_read_block(const uint8_t devaddr, const uint8_t regaddr, uint8_t *data, const int length) { if(!length) return 0; i2c_start(); int res = i2c_send_byte(devaddr); if(res) { printf("NACK on address %02x (%d)\n", devaddr, res); i2c_stop(); return -1; } res = i2c_send_byte(regaddr); if(res) { printf("NACK on register address %02x (%d)\n", regaddr, res); i2c_stop(); return -1; } i2c_restart(); res = i2c_send_byte(devaddr | 1); if(res) { printf("NACK on address %02x (%d)\n", devaddr | 1, res); i2c_stop(); return -2; } for(int i=0;i<length;i++) { *(data++) = i2c_receive_byte((i == length-1)? 0 : 1); } i2c_stop(); return 0; }
int gpio_i2c_readX(int Grp, unsigned char devaddress, unsigned char address) { int rxdata; I2C_LOCK(Grp); i2c_start_bit(Grp); i2c_send_byte(Grp, (unsigned char)(devaddress)); i2c_receive_ack(Grp); i2c_send_byte(Grp, address); i2c_receive_ack(Grp); i2c_start_bit(Grp); i2c_send_byte(Grp, (unsigned char)(devaddress) | 1); i2c_receive_ack(Grp); rxdata = i2c_receive_byte(Grp); i2c_stop_bit(Grp); I2C_UNLOCK(Grp); return (unsigned char)rxdata; }
/** \brief This function receives a response from the device. * * \param[in] size size of rx buffer * \param[out] response pointer to rx buffer * \return status of the operation */ uint8_t ecc108p_receive_response(uint8_t size, uint8_t *response) { uint8_t count; // Address the device and indicate that bytes are to be read. uint8_t i2c_status = ecc108p_send_slave_address(I2C_READ); if (i2c_status != I2C_FUNCTION_RETCODE_SUCCESS) { // Translate error so that the Communication layer // can distinguish between a real error or the // device being busy executing a command. if (i2c_status == I2C_FUNCTION_RETCODE_NACK) i2c_status = ECC108_RX_NO_RESPONSE; return i2c_status; } // Receive count byte. i2c_status = i2c_receive_byte(response); if (i2c_status != I2C_FUNCTION_RETCODE_SUCCESS) return ECC108_COMM_FAIL; count = response[ECC108_BUFFER_POS_COUNT]; if ((count < ECC108_RSP_SIZE_MIN) || (count > size)) { (void) i2c_send_stop(); return ECC108_INVALID_SIZE; } i2c_status = i2c_receive_bytes(count - 1, &response[ECC108_BUFFER_POS_DATA]); if (i2c_status != I2C_FUNCTION_RETCODE_SUCCESS) return ECC108_COMM_FAIL; else return ECC108_SUCCESS; }
int gpio_i2c_rd_arr(int Grp, unsigned char dev, unsigned char rarr[], int rsize, unsigned char darr[], int dsize) { int i; I2C_LOCK(Grp); i2c_start_bit(Grp); i2c_send_byte(Grp, dev); i2c_receive_ack(Grp); for(i = 0; i < rsize; i ++) { i2c_send_byte(Grp, rarr[i]); i2c_receive_ack(Grp); } if(dsize > 0) { i2c_start_bit(Grp); i2c_send_byte(Grp, (unsigned char)(dev) | 1); i2c_receive_ack(Grp); for(i = 0; i < dsize-1; i ++) { darr[i] = i2c_receive_byte(Grp); i2c_send_ack(Grp); } darr[i] = i2c_receive_byte(Grp); } i2c_stop_bit(Grp); I2C_UNLOCK(Grp); return 0; }
uint16_t i2c_read_word(const uint8_t devaddr, const uint16_t regaddr) { i2c_start(); int res; res = i2c_send_byte(devaddr); if(res) { printf("Error sending write address (%d)\n", res); } res = i2c_send_byte(regaddr >> 8); res += i2c_send_byte(regaddr & 0xFF); if(res) { printf("Error sending register address (%d)\n", res); } i2c_restart(); res = i2c_send_byte(devaddr | 1); if(res) { printf("Error sending read address (%d)\n", res); } uint16_t result = ((uint16_t)i2c_receive_byte(1)) << 8; result |= i2c_receive_byte(0); i2c_stop(); return result; }
unsigned char gpio_i2c_read(unsigned char devaddress, unsigned char address) { int rxdata; i2c_start_bit(); i2c_send_byte((unsigned char)(devaddress)); i2c_receive_ack(); i2c_send_byte(address); i2c_receive_ack(); i2c_start_bit(); i2c_send_byte((unsigned char)(devaddress) | 1); i2c_receive_ack(); rxdata = i2c_receive_byte(); //i2c_send_ack(); i2c_stop_bit(); return rxdata; }
uint8_t i2c_read_byte(const uint8_t devaddr, const uint8_t regaddr) { i2c_start(); int res; res = i2c_send_byte(devaddr); if(res) { printf("Error sending write address (%d)\n", res); } res = i2c_send_byte(regaddr); if(res) { printf("Error sending register address (%d)\n", res); } i2c_restart(); res = i2c_send_byte(devaddr | 1); if(res) { printf("Error sending read address (%d)\n", res); } uint8_t result = i2c_receive_byte(0); i2c_stop(); return result; }
int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { unsigned int loop, rxdata; int sadr, ack, bytes_read; rxdata = 0; switch ((int)obj->i2c) { case I2C_0: sadr = TSC_I2C_ADDR; break; case I2C_1: sadr = AAIC_I2C_ADDR; break; case I2C_2: case I2C_3: sadr = address; //LM75_I2C_ADDR; or MMA7660_I2C_ADDR; break; } bytes_read = 0; // Start bit i2c_start(obj); switch ((int)obj->i2c) { case I2C_0: // Set serial and register address i2c_send_byte(obj, sadr); ack += i2c_receive_ack(obj); i2c_send_byte(obj, address); ack += i2c_receive_ack(obj); // Stop bit i2c_stop(obj); // Start bit i2c_start_tsc(obj); // Read from I2C address i2c_send_byte(obj, sadr | 1); ack += i2c_receive_ack(obj); rxdata = (i2c_receive_byte(obj) & 0xFF); data[((length - 1) - bytes_read)] = (char)rxdata; bytes_read++; // Read multiple bytes if ((length > 1) && (length < 5)) { for (loop = 1; loop <= (length - 1); loop++) { // Send ACK i2c_send_ack(obj); // Next byte //rxdata = ((rxdata << 8) & 0xFFFFFF00); //rxdata |= (i2c_receive_byte(obj) & 0xFF); rxdata = i2c_receive_byte(obj); data[(length - 1) - bytes_read] = (char)rxdata; bytes_read++; } } break; case I2C_1: // Set serial and register address i2c_send_byte(obj, sadr); ack += i2c_receive_ack(obj); i2c_send_byte(obj, address); ack += i2c_receive_ack(obj); // Stop bit i2c_stop(obj); // Start bit i2c_start_tsc(obj); // Fall through to read data case I2C_2: case I2C_3: // Read from preset register address pointer i2c_send_byte(obj, sadr | 1); ack += i2c_receive_ack(obj); rxdata = i2c_receive_byte(obj); data[bytes_read] = (char)rxdata; bytes_read++; // Read multiple bytes if ((length > 1) && (length < 5)) { for (loop = 1; loop <= (length - 1); loop++) { // Send ACK i2c_send_ack(obj); // Next byte rxdata = i2c_receive_byte(obj); data[loop] = (char)rxdata; bytes_read++; } } break; } i2c_send_nack(obj); i2c_stop(obj); // Actual stop bit return bytes_read; }