restructured i2c-max split, added BMS unit test
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# This file was automatically generated for projects
|
||||
# without default 'CMakeLists.txt' file.
|
||||
|
||||
FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.*)
|
||||
FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.* ${CMAKE_SOURCE_DIR}/test/*.*)
|
||||
|
||||
idf_component_register(SRCS ${app_sources}
|
||||
INCLUDE_DIRS "."
|
||||
INCLUDE_DIRS "." "${CMAKE_SOURCE_DIR}/test"
|
||||
REQUIRES nvs_flash esp-nimble-cpp esp_socketio_client)
|
||||
|
||||
55
src/i2c.c
55
src/i2c.c
@@ -18,58 +18,3 @@ esp_err_t i2c_init() {
|
||||
return (i2c_param_config(I2C_MASTER_NUM, &conf) ||
|
||||
i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0));
|
||||
}
|
||||
|
||||
// Helper: Read 16-bit register to 2-byte array (MSB first big endian)
|
||||
esp_err_t max17048_read_reg(uint8_t reg_addr, uint8_t *MSB, uint8_t *LSB) {
|
||||
// this is better than converting to little endian for my application
|
||||
// since I usually need to handle bytes individually.
|
||||
uint8_t data[2];
|
||||
// Write register address
|
||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||
i2c_master_start(cmd);
|
||||
i2c_master_write_byte(cmd, (MAX17048_ADDR << 1) | I2C_MASTER_WRITE, true);
|
||||
i2c_master_write_byte(cmd, reg_addr, true);
|
||||
|
||||
// Restart and Read 2 bytes
|
||||
i2c_master_start(cmd);
|
||||
i2c_master_write_byte(cmd, (MAX17048_ADDR << 1) | I2C_MASTER_READ, true);
|
||||
i2c_master_read(cmd, data, 2, I2C_MASTER_LAST_NACK);
|
||||
i2c_master_stop(cmd);
|
||||
|
||||
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(I2C_MASTER_TIMEOUT_MS));
|
||||
i2c_cmd_link_delete(cmd);
|
||||
|
||||
if (ret == ESP_OK) {
|
||||
*MSB = data[0];
|
||||
*LSB = data[1];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Write big endian 2-byte array to a 16-bit register
|
||||
esp_err_t max17048_write_reg(uint8_t reg_addr, uint8_t MSB, uint8_t LSB) {
|
||||
// Write register address
|
||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||
i2c_master_start(cmd);
|
||||
i2c_master_write_byte(cmd, (MAX17048_ADDR << 1) | I2C_MASTER_WRITE, true);
|
||||
i2c_master_write_byte(cmd, reg_addr, true);
|
||||
i2c_master_write_byte(cmd, MSB, true);
|
||||
i2c_master_write_byte(cmd, LSB, true);
|
||||
i2c_master_stop(cmd);
|
||||
|
||||
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(I2C_MASTER_TIMEOUT_MS));
|
||||
i2c_cmd_link_delete(cmd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t max17048_friendly_write_reg(uint8_t reg_addr, uint8_t MSB, uint8_t LSB,
|
||||
uint8_t MSBmask, uint8_t LSBmask) {
|
||||
uint8_t origMSB, origLSB;
|
||||
esp_err_t err = max17048_read_reg(reg_addr, &origMSB, &origLSB);
|
||||
MSB &= MSBmask;
|
||||
LSB &= LSBmask;
|
||||
MSB |= origMSB & ~MSBmask;
|
||||
LSB |= origLSB & ~LSBmask;
|
||||
return err | max17048_write_reg(reg_addr, MSB, LSB);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "esp_pm.h"
|
||||
#include "mainEventLoop.hpp"
|
||||
#include "max17048.h"
|
||||
#include "bms_test.hpp"
|
||||
|
||||
// Global encoder instances
|
||||
Encoder* topEnc = new Encoder(ENCODER_PIN_A, ENCODER_PIN_B);
|
||||
@@ -53,6 +54,7 @@ void pm_init() {
|
||||
}
|
||||
|
||||
extern "C" void app_main() {
|
||||
pm_init();
|
||||
mainApp();
|
||||
// pm_init();
|
||||
// mainApp();
|
||||
bms_test_app();
|
||||
}
|
||||
@@ -118,3 +118,58 @@ void bms_checker_task(void *pvParameters) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Helper: Read 16-bit register to 2-byte array (MSB first big endian)
|
||||
esp_err_t max17048_read_reg(uint8_t reg_addr, uint8_t *MSB, uint8_t *LSB) {
|
||||
// this is better than converting to little endian for my application
|
||||
// since I usually need to handle bytes individually.
|
||||
uint8_t data[2];
|
||||
// Write register address
|
||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||
i2c_master_start(cmd);
|
||||
i2c_master_write_byte(cmd, (MAX17048_ADDR << 1) | I2C_MASTER_WRITE, true);
|
||||
i2c_master_write_byte(cmd, reg_addr, true);
|
||||
|
||||
// Restart and Read 2 bytes
|
||||
i2c_master_start(cmd);
|
||||
i2c_master_write_byte(cmd, (MAX17048_ADDR << 1) | I2C_MASTER_READ, true);
|
||||
i2c_master_read(cmd, data, 2, I2C_MASTER_LAST_NACK);
|
||||
i2c_master_stop(cmd);
|
||||
|
||||
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(I2C_MASTER_TIMEOUT_MS));
|
||||
i2c_cmd_link_delete(cmd);
|
||||
|
||||
if (ret == ESP_OK) {
|
||||
*MSB = data[0];
|
||||
*LSB = data[1];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Write big endian 2-byte array to a 16-bit register
|
||||
esp_err_t max17048_write_reg(uint8_t reg_addr, uint8_t MSB, uint8_t LSB) {
|
||||
// Write register address
|
||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||
i2c_master_start(cmd);
|
||||
i2c_master_write_byte(cmd, (MAX17048_ADDR << 1) | I2C_MASTER_WRITE, true);
|
||||
i2c_master_write_byte(cmd, reg_addr, true);
|
||||
i2c_master_write_byte(cmd, MSB, true);
|
||||
i2c_master_write_byte(cmd, LSB, true);
|
||||
i2c_master_stop(cmd);
|
||||
|
||||
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(I2C_MASTER_TIMEOUT_MS));
|
||||
i2c_cmd_link_delete(cmd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t max17048_friendly_write_reg(uint8_t reg_addr, uint8_t MSB, uint8_t LSB,
|
||||
uint8_t MSBmask, uint8_t LSBmask) {
|
||||
uint8_t origMSB, origLSB;
|
||||
esp_err_t err = max17048_read_reg(reg_addr, &origMSB, &origLSB);
|
||||
MSB &= MSBmask;
|
||||
LSB &= LSBmask;
|
||||
MSB |= origMSB & ~MSBmask;
|
||||
LSB |= origLSB & ~LSBmask;
|
||||
return err | max17048_write_reg(reg_addr, MSB, LSB);
|
||||
}
|
||||
Reference in New Issue
Block a user