Hi All,
I am trying to communicate with IC MAX17201 using I2C interface. I am able to detect the IC and communicate with it.
When I read 8bit registers from the IC I don't have any issue. But when I am trying to read 16bit register from the IC, I am getting errors.The existing code from NRF SDK includes data to read and write 8 bit registers.
I have modified the code a bit in order to read 2bytes from register. I am not able to read 16bit registers. I tried to read NPACKCFG_REG but not able to read it properly. As well as while compiling I am getting warnings like this:-unsigned conversion from 'int' to 'uint8_t' {aka 'unsigned char'} changes value from '437' to '181' [-
#define NPACKCFG_REG 0x1B5 #define MAX17201_ADDRESS_LEN 1 #define MAX17201_ADDR (0xD8>>1) #define MAX17201_WHO_AM_I 0x6BU bool i2c_register_write_max17211(uint16_t register_address, uint16_t value) { ret_code_t err_code; uint8_t tx_data[4]; tx_data[0] = ( (register_address >> 8)& 0xFF ); tx_data[1] = register_address & 0xFF; tx_data[2] = ((value>>8)& 0xff); tx_data[3] = value & 0xFF; m_xfer_done = false; err_code = nrf_drv_twi_tx(&m_twi, MAX17201_WHO_AM_I, tx_data, sizeof(tx_data), false); //Wait until the transmission of the data is finished while (m_xfer_done == false) { } // if there is no error then return true else return false if (NRF_SUCCESS != err_code) { NRF_LOG_INFO("FAILED"); return false; } NRF_LOG_INFO("SUCCESS"); return true; } bool i2c_register_read_max17211(uint8_t register_address, uint8_t destination[2], uint8_t number_of_bytes) { ret_code_t err_code; //uint8_t rx_buffer[2]; //Set the flag to false to show the receiving is not yet completed m_xfer_done = false; // Send the Register address where we want to write the data err_code = nrf_drv_twi_tx(&m_twi, MAX17201_WHO_AM_I, ®ister_address, 1, true); //Wait for the transmission to get completed while (m_xfer_done == false){} //vTaskDelay(1000); // If transmission was not successful, exit the function with false as return value if (NRF_SUCCESS != err_code) { return false; } //set the flag again so that we can read data from the MPU6050's internal register m_xfer_done = false; // Receive the data from the MPU6050 //err_code = nrf_drv_twi_rx(&m_twi, MAX17201_WHO_AM_I, destination, number_of_bytes); err_code = nrf_drv_twi_rx(&m_twi, MAX17201_WHO_AM_I, &destination[0], sizeof(destination)); //wait until the transmission is completed while (m_xfer_done == false){} //vTaskDelay(1000); // if data was successfully read, return true else return false if (NRF_SUCCESS != err_code) { return false; } //NRF_LOG_INFO("DATA IS %x",destination); return true; }
Please help me on how to read multiple bytes from 16bit registers and how to write data into 16 bit registers.