i am trying to read time from the rtc - PCF85263ATT, so i start with writing the write-slave-address (0xA2) and the register to start reading from (seconds register 0x1) and i get NACK (as it shows on the oscilloscope). This NACK causes the failure of i2c_master_cmd_begin() with ESP_FAIL error.
scl pin is set to 18, sda is pin 19, i2c_port is I2C_NUM_0.
here is the code:
Code: Untitled.c Select all
#define PCF85263ATT_SLAVE_REG_WRITE 0xA2
#define PCF85263ATT_SLAVE_REG_READ 0xA3
#define PCF85263ATT_REG_SECONDS 0x01
typedef struct RtcDriver {
int sda_pin_num;
int scl_pin_num;
i2c_port_t i2c_port;
} RtcDriver;
esp_err_t rtc_driver_init(RtcDriver* rtc_driver) {
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = rtc_driver->sda_pin_num,
.sda_pullup_en = GPIO_PULLUP_DISABLE, //there are pullup resistors in the circuit
.scl_io_num = rtc_driver->scl_pin_num,
.scl_pullup_en = GPIO_PULLUP_DISABLE, //there are pullup resistors in the circuit
.master.clk_speed = 400000,
};
esp_err_t err;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_driver_install(rtc_driver->i2c_port, I2C_MODE_MASTER, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0));
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_set_data_mode(rtc_driver->i2c_port, I2C_DATA_MODE_MSB_FIRST, I2C_DATA_MODE_MSB_FIRST));
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_param_config(rtc_driver->i2c_port, &conf));
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_set_timeout(rtc_driver->i2c_port, 9000 / portTICK_RATE_MS));
return 0;
}
esp_err_t rtc_driver_get_time(RtcDriver* rtc_driver, uint8_t* sec, uint8_t* min, uint8_t* hour){
i2c_cmd_handle_t cmd = NULL;
cmd = i2c_cmd_link_create();
if(cmd == NULL) {
ESP_LOGI(TAG, "i2c_cmd_link_create failed!" );
}
uint8_t data[3];
data[0] = PCF85263ATT_SLAVE_REG_WRITE;
data[1] = PCF85263ATT_REG_SECONDS;
data[2] = PCF85263ATT_SLAVE_REG_READ;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_start(cmd));
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_byte(cmd, data[0] , ACK_CHECK_DIS)); //slave addr
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write_byte(cmd, data[1], ACK_CHECK_EN)); //start to read from sec rgstr
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_stop(cmd));
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_cmd_begin(rtc_driver->i2c_port, cmd, 1000 / portTICK_RATE_MS));
i2c_cmd_link_delete(cmd);
vTaskDelay(100 / portTICK_RATE_MS);
cmd = i2c_cmd_link_create();
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_start(cmd));
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_write(cmd, &data[2], 1, true));
data[0] = 0;
data[1] = 0;
data[2] = 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_read(cmd, &data[0], sizeof(data) ,I2C_MASTER_LAST_NACK));
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_stop(cmd));
esp_err_t err;
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_cmd_begin(rtc_driver->i2c_port, cmd, 1000 / portTICK_RATE_MS));
i2c_cmd_link_delete(cmd);
return 0;
}
here is the datasheet of the rtc: https://www.nxp.com/docs/en/data-sheet/PCF85263A.pdf
What am i doing wrong?
i really wish to figure out why the rtc won't ack and why do i get ESP_ERR_TIMEOUT on the second call to i2c_master_cmd_begin().
Thank You,
Adi