static int es_read_reg(uint8_t reg_add, uint8_t *pData) { uint8_t data; int res = 0; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); res |= i2c_master_start(cmd); res |= i2c_master_write_byte(cmd, ES8388_ADDR, 1 /*ACK_CHECK_EN*/); res |= i2c_master_write_byte(cmd, reg_add, 1 /*ACK_CHECK_EN*/); res |= i2c_master_stop(cmd); res |= i2c_master_cmd_begin(0, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); cmd = i2c_cmd_link_create(); res |= i2c_master_start(cmd); res |= i2c_master_write_byte(cmd, ES8388_ADDR | 0x01, 1 /*ACK_CHECK_EN*/); res |= i2c_master_read_byte(cmd, &data, 0x01/*NACK_VAL*/); res |= i2c_master_stop(cmd); res |= i2c_master_cmd_begin(0, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); ES_ASSERT(res, "es_read_reg error", -1); *pData = data; return res; }
void rtc_writeValue(time_t newTime) { ESP_LOGD(tag, ">> writeValue: %ld", newTime); struct tm tm; gmtime_r(&newTime, &tm); char buf[30]; ESP_LOGD(tag, " - %s", asctime_r(&tm, buf)); esp_err_t errRc; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); ESP_ERROR_CHECK(i2c_master_start(cmd)); ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (RTC_ADDRESS << 1) | I2C_MASTER_WRITE, 1 /* expect ack */)); ESP_ERROR_CHECK(i2c_master_write_byte(cmd, 0x03, 1)); ESP_ERROR_CHECK(i2c_master_write_byte(cmd, intToBCD(tm.tm_sec), 1)); // seconds ESP_ERROR_CHECK(i2c_master_write_byte(cmd, intToBCD(tm.tm_min), 1 )); // minutes ESP_ERROR_CHECK(i2c_master_write_byte(cmd, intToBCD(tm.tm_hour), 1 )); // hours ESP_ERROR_CHECK(i2c_master_write_byte(cmd, intToBCD(tm.tm_mday), 1)); // date of month ESP_ERROR_CHECK(i2c_master_write_byte(cmd, intToBCD(tm.tm_wday+1), 1 )); // week day ESP_ERROR_CHECK(i2c_master_write_byte(cmd, intToBCD(tm.tm_mon+1), 1)); // month ESP_ERROR_CHECK(i2c_master_write_byte(cmd, intToBCD(tm.tm_year-100), 1)); // year ESP_ERROR_CHECK(i2c_master_stop(cmd)); errRc = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS); if (errRc != 0) { ESP_LOGE(tag, "i2c_master_cmd_begin: %d", errRc); } i2c_cmd_link_delete(cmd); }
/* * PCF8523 slightly changed its 7 bytes encoded in BCD: * 03h - Seconds - 00-59 * 04h - Minutes - 00-59 * 05h - Hours - 00-23 * 06h - monthday - 01-31 * 07h - weekday - 00-06 * 08h - Month - 01-12 * 09h - Year - 00-99 * */ time_t rtc_readValue() { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); ESP_ERROR_CHECK(i2c_master_start(cmd)); ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (RTC_ADDRESS << 1) | I2C_MASTER_WRITE, true /* expect ack */)); ESP_ERROR_CHECK(i2c_master_write_byte(cmd, 0x03, 1)); // start address ESP_ERROR_CHECK(i2c_master_start(cmd)); ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (RTC_ADDRESS << 1) | I2C_MASTER_READ, true /* expect ack */)); uint8_t data[7]; ESP_ERROR_CHECK(i2c_master_read(cmd, data, 7, false)); ESP_ERROR_CHECK(i2c_master_stop(cmd)); COMMANDCHECKOKERR(i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS),"RTC COMMAND"); i2c_cmd_link_delete(cmd); int i; for (i=0; i<7; i++) { ESP_LOGD(tag, "%d: 0x%.2x", i, data[i]); } struct tm tm; tm.tm_sec = bcdToInt(data[0]); tm.tm_min = bcdToInt(data[1]); tm.tm_hour = bcdToInt(data[2]); tm.tm_mday = bcdToInt(data[3]); tm.tm_mon = bcdToInt(data[5]) - 1; // 0-11 - Note: The month on the PCF8523 is 1-12. tm.tm_year = bcdToInt(data[6]) + 100; // Years since 1900 time_t readTime = mktime(&tm); return readTime; }
int i2c_scan(int argc, char** argv) { int count = 1; if (argc > 1) count = atoi(argv[1]); printf("Scanning for I2C devices (%d)\n", count); for (int j = 0; j < count; ++j) { printf(" 0 1 2 3 4 5 6 7 8 9 a b c d e f\n"); printf("00: "); for (int i = 3; i < 0x78; ++i) { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (i << 1) | I2C_MASTER_WRITE, 1 /* expect ack */); i2c_master_stop(cmd); const auto espRc = i2c_master_cmd_begin(I2C_NUM_0, cmd, 10/portTICK_PERIOD_MS); if (i%16 == 0) printf("\n%.2x:", i); if (espRc == 0) printf(" %.2x", i); else printf(" --"); //ESP_LOGD(tag, "i=%d, rc=%d (0x%x)", i, espRc, espRc); i2c_cmd_link_delete(cmd); } printf("\n"); vTaskDelay(100/portTICK_PERIOD_MS); } return 0; }
int i2c_write_read(uint8_t stop, uint8_t slave, uint8_t rsize, uint8_t *rbuf, uint8_t wsize, uint8_t *wbuf) { if (rsize == 0 && wsize == 0) { return ESP_OK; } i2c_cmd_handle_t cmd; cmd = i2c_cmd_link_create(); i2c_master_start(cmd); if (wsize) { i2c_master_write_byte(cmd, ( slave << 1 ) | I2C_MASTER_WRITE, ACK_CHECK); i2c_master_write(cmd, wbuf, wsize, ACK_CHECK); if (!rsize) { i2c_master_stop(cmd); \ esp_err_t ret = i2c_master_cmd_begin(I2C_NUM, cmd, 1000 / portTICK_RATE_MS); \ i2c_cmd_link_delete(cmd); // I2C_FINISH; return ret; } if (stop) { // rsize is nonzero i2c_master_stop(cmd); \ esp_err_t ret = i2c_master_cmd_begin(I2C_NUM, cmd, 1000 / portTICK_RATE_MS); \ i2c_cmd_link_delete(cmd); // I2C_FINISH; if (ret) return -1; cmd = i2c_cmd_link_create(); i2c_master_start(cmd); } else { i2c_master_start(cmd); } i2c_master_write_byte(cmd, ( slave << 1 ) | I2C_MASTER_READ, ACK_CHECK); } else { // rsize must be nonzero because of the initial check at the top i2c_master_write_byte(cmd, ( slave << 1 ) | I2C_MASTER_READ, ACK_CHECK); } if (rsize > 1) { i2c_master_read(cmd, rbuf, rsize - 1, ACK_VAL); } i2c_master_read_byte(cmd, rbuf + rsize - 1, NACK_VAL); I2C_FINISH; return ret; }
static int es_write_reg(uint8_t slave_add, uint8_t reg_add, uint8_t data) { int res = 0; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); res |= i2c_master_start(cmd); res |= i2c_master_write_byte(cmd, slave_add, 1 /*ACK_CHECK_EN*/); res |= i2c_master_write_byte(cmd, reg_add, 1 /*ACK_CHECK_EN*/); res |= i2c_master_write_byte(cmd, data, 1 /*ACK_CHECK_EN*/); res |= i2c_master_stop(cmd); res |= i2c_master_cmd_begin(0, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); ES_ASSERT(res, "es_write_reg error", -1); return res; }
/* * HAL callback function as prescribed by the U8G2 library. This callback is invoked * to handle I2C communications. */ uint8_t u8g2_esp32_i2c_byte_cb(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { ESP_LOGD(TAG, "i2c_cb: Received a msg: %d, arg_int: %d, arg_ptr: %p", msg, arg_int, arg_ptr); switch(msg) { case U8X8_MSG_BYTE_SET_DC: { if (u8g2_esp32_hal.dc != U8G2_ESP32_HAL_UNDEFINED) { gpio_set_level(u8g2_esp32_hal.dc, arg_int); } break; } case U8X8_MSG_BYTE_INIT: { if (u8g2_esp32_hal.sda == U8G2_ESP32_HAL_UNDEFINED || u8g2_esp32_hal.scl == U8G2_ESP32_HAL_UNDEFINED) { break; } i2c_config_t conf; conf.mode = I2C_MODE_MASTER; ESP_LOGI(TAG, "sda_io_num %d", u8g2_esp32_hal.sda); conf.sda_io_num = u8g2_esp32_hal.sda; conf.sda_pullup_en = GPIO_PULLUP_ENABLE; ESP_LOGI(TAG, "scl_io_num %d", u8g2_esp32_hal.scl); conf.scl_io_num = u8g2_esp32_hal.scl; conf.scl_pullup_en = GPIO_PULLUP_ENABLE; ESP_LOGI(TAG, "clk_speed %d", I2C_MASTER_FREQ_HZ); conf.master.clk_speed = I2C_MASTER_FREQ_HZ; ESP_LOGI(TAG, "i2c_param_config %d", conf.mode); ESP_ERROR_CHECK(i2c_param_config(I2C_MASTER_NUM, &conf)); ESP_LOGI(TAG, "i2c_driver_install %d", I2C_MASTER_NUM); ESP_ERROR_CHECK(i2c_driver_install(I2C_MASTER_NUM, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0)); break; } case U8X8_MSG_BYTE_SEND: { uint8_t* data_ptr = (uint8_t*)arg_ptr; ESP_LOG_BUFFER_HEXDUMP(TAG, data_ptr, arg_int, ESP_LOG_VERBOSE); while( arg_int > 0 ) { ESP_ERROR_CHECK(i2c_master_write_byte(handle_i2c, *data_ptr, ACK_CHECK_EN)); data_ptr++; arg_int--; } break; } case U8X8_MSG_BYTE_START_TRANSFER: { uint8_t i2c_address = u8x8_GetI2CAddress(u8x8); handle_i2c = i2c_cmd_link_create(); ESP_LOGD(TAG, "Start I2C transfer to %02X.", i2c_address>>1); ESP_ERROR_CHECK(i2c_master_start(handle_i2c)); ESP_ERROR_CHECK(i2c_master_write_byte(handle_i2c, i2c_address | I2C_MASTER_WRITE, ACK_CHECK_EN)); break; } case U8X8_MSG_BYTE_END_TRANSFER: { ESP_LOGD(TAG, "End I2C transfer."); ESP_ERROR_CHECK(i2c_master_stop(handle_i2c)); ESP_ERROR_CHECK(i2c_master_cmd_begin(I2C_MASTER_NUM, handle_i2c, I2C_TIMEOUT_MS / portTICK_RATE_MS)); i2c_cmd_link_delete(handle_i2c); break; } } return 0; } // u8g2_esp32_i2c_byte_cb
void task_hmc5883l(void *ignore) { ESP_LOGD(tag, ">> hmc5883l"); i2c_config_t conf; conf.mode = I2C_MODE_MASTER; conf.sda_io_num = PIN_SDA; conf.scl_io_num = PIN_CLK; conf.sda_pullup_en = GPIO_PULLUP_ENABLE; conf.scl_pullup_en = GPIO_PULLUP_ENABLE; conf.master.clk_speed = 100000; ESP_ERROR_CHECK(i2c_param_config(I2C_NUM_0, &conf)); ESP_ERROR_CHECK(i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0)); uint8_t data[6]; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1); i2c_master_write_byte(cmd, 0x02, 1); // 0x02 = "Mode register" i2c_master_write_byte(cmd, 0x00, 1); // 0x00 = "Continuous-Measurement Mode" i2c_master_stop(cmd); i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS); i2c_cmd_link_delete(cmd); //Set value in "Configuration Register B" cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1); i2c_master_write_byte(cmd, 0x01, 1); // 0x01 = "Configuration Register B" i2c_master_write_byte(cmd, 0x20, 1); // 0x20 = default Gain setting i2c_master_stop(cmd); i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS); i2c_cmd_link_delete(cmd); //Set active register to "Identification Register A" cmd = i2c_cmd_link_create(); ESP_ERROR_CHECK(i2c_master_start(cmd)); ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1)); ESP_ERROR_CHECK(i2c_master_write_byte(cmd, 10, 1)); //10 = 0x0A = "Identification Register A" ESP_ERROR_CHECK(i2c_master_stop(cmd)); ESP_ERROR_CHECK(i2c_master_cmd_begin(I2C_NUM_0, cmd, 100/portTICK_PERIOD_MS)); i2c_cmd_link_delete(cmd); //Get data from Identification Register A, B and C cmd = i2c_cmd_link_create(); ESP_ERROR_CHECK(i2c_master_start(cmd)); ESP_ERROR_CHECK(i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_READ, 1)); i2c_master_read_byte(cmd, data, 0); i2c_master_read_byte(cmd, data+1, 0); i2c_master_read_byte(cmd, data+2, 1); ESP_ERROR_CHECK(i2c_master_stop(cmd)); ESP_ERROR_CHECK(i2c_master_cmd_begin(I2C_NUM_0, cmd, 100/portTICK_PERIOD_MS)); i2c_cmd_link_delete(cmd); while(1) { //Set active registert to "Data Output X MSB Register" cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_WRITE, 1); i2c_master_write_byte(cmd, 0x03, 1); //0x03 = "Data Output X MSB Register" i2c_master_stop(cmd); i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS); i2c_cmd_link_delete(cmd); //Read values for X, Y and Z cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (I2C_ADDRESS << 1) | I2C_MASTER_READ, 1); i2c_master_read_byte(cmd, data, 0); //"Data Output X MSB Register" i2c_master_read_byte(cmd, data+1, 0); //"Data Output X LSB Register" i2c_master_read_byte(cmd, data+2, 0); //"Data Output Z MSB Register" i2c_master_read_byte(cmd, data+3, 0); //"Data Output Z LSB Register" i2c_master_read_byte(cmd, data+4, 0); //"Data Output Y MSB Register" i2c_master_read_byte(cmd, data+5, 1); //"Data Output Y LSB Register " i2c_master_stop(cmd); i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000/portTICK_PERIOD_MS); i2c_cmd_link_delete(cmd); short x = data[0] << 8 | data[1]; short z = data[2] << 8 | data[3]; short y = data[4] << 8 | data[5]; int angle = atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees ESP_LOGD(tag, "angle: %d, x: %d, y: %d, z: %d", angle, x, y, z); vTaskDelay(1000/portTICK_PERIOD_MS); } vTaskDelete(NULL); } // task_hmc5883l