RCM — ESP32 Room Controller
WT32-ETH01 firmware
Loading...
Searching...
No Matches
i2c_cmd_device.c
Go to the documentation of this file.
1
8#include "i2c_cmd_device.h"
9
10#include "driver/i2c_master.h"
11#include "esp_check.h"
12#include "esp_log.h"
13#include "freertos/FreeRTOS.h"
14#include "freertos/task.h"
15#include "i2c_bus.h"
16
17static const char *TAG = "i2c_cmd";
18
20#define I2C_DEVICE_ADDR 0x20
21#define CMD_INTERVAL_MS 1000
22
23static uint8_t s_commands[] = {
24 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
25 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
26 0x10, 0x11
27};
28
29static i2c_master_dev_handle_t s_i2c_dev;
30static bool s_initialized;
31
32static esp_err_t i2c_cmd_send(uint8_t *data, size_t data_len)
33{
34 return i2c_master_transmit(s_i2c_dev, data, data_len, I2C_BUS_TIMEOUT_MS);
35}
36
37esp_err_t i2c_cmd_device_init(void)
38{
39 if (s_initialized) {
40 return ESP_OK;
41 }
42
43 ESP_RETURN_ON_ERROR(i2c_bus_init(), TAG, "shared bus init failed");
44 ESP_RETURN_ON_ERROR(i2c_bus_add_device(I2C_DEVICE_ADDR, &s_i2c_dev),
45 TAG, "add LCM device failed");
46
47 s_initialized = true;
48 ESP_LOGI(TAG, "LCM device 0x%02X on shared I2C bus", I2C_DEVICE_ADDR);
49 return ESP_OK;
50}
51
52static void i2c_cmd_task(void *arg)
53{
54 size_t idx = 0;
55 esp_err_t err = ESP_OK;
56
57 (void)arg;
58
59 while (true) {
60 err = i2c_cmd_send(s_commands + idx, 1);
61
62 if (err == ESP_OK) {
63 ESP_LOGI(TAG, "Sent command 0x%02X", s_commands[idx]);
64 } else {
65 ESP_LOGW(TAG, "Send 0x%02X failed: %s", s_commands[idx], esp_err_to_name(err));
66 }
67
68 idx = (idx + 1) % (sizeof(s_commands) / sizeof(s_commands[0]));
69 vTaskDelay(pdMS_TO_TICKS(CMD_INTERVAL_MS));
70 }
71}
72
73esp_err_t i2c_cmd_device_start(void)
74{
75 static bool started = false;
76
77 ESP_RETURN_ON_FALSE(s_initialized, ESP_ERR_INVALID_STATE, TAG, "not initialized");
78
79 if (started) {
80 return ESP_OK;
81 }
82
83 BaseType_t created = xTaskCreate(i2c_cmd_task, "i2c_cmd", 2048, NULL, 5, NULL);
84 ESP_RETURN_ON_FALSE(created == pdPASS, ESP_ERR_NO_MEM, TAG, "task create failed");
85
86 started = true;
87 ESP_LOGI(TAG, "LCM command task started (every %d ms)", CMD_INTERVAL_MS);
88 return ESP_OK;
89}
esp_err_t i2c_bus_init(void)
Создаёт master-шину I2C (идемпотентно).
Definition i2c_bus.c:16
esp_err_t i2c_bus_add_device(uint8_t addr7, i2c_master_dev_handle_t *dev)
Добавить устройство с 7-битным адресом на общую шину.
Definition i2c_bus.c:43
Общая I2C-шина master (I2C_NUM_0) для всех периферийных устройств.
#define I2C_BUS_TIMEOUT_MS
Definition i2c_bus.h:20
#define CMD_INTERVAL_MS
static void i2c_cmd_task(void *arg)
static const char * TAG
esp_err_t i2c_cmd_device_init(void)
Добавляет LCM как устройство на общую шину (i2c_bus_init при необходимости).
static bool s_initialized
esp_err_t i2c_cmd_device_start(void)
Запускает задачу циклической отправки команд на LCM.
static i2c_master_dev_handle_t s_i2c_dev
static uint8_t s_commands[]
#define I2C_DEVICE_ADDR
Заводской адрес LCM (7 бит); после SET_ADDR может отличаться
static esp_err_t i2c_cmd_send(uint8_t *data, size_t data_len)
Периодическая отправка команд на LCM по общей I2C-шине.