feat✨: 添加I2C Master的BUS功能
This commit is contained in:
parent
3bd1e07432
commit
0013e8d9ed
@ -107,7 +107,7 @@ uint8_t _main_task_wake_up_services()
|
||||
imp_main_task_table[IMP_TASK_ID_EXT_TRANS_SERVICE_TASK], 2048,
|
||||
NULL, 10, NULL);
|
||||
xTaskCreate(imp_display_service_task,
|
||||
imp_main_task_table[IMP_TASK_ID_DISP_SERVICE_TASK], 2048, NULL,
|
||||
imp_main_task_table[IMP_TASK_ID_DISP_SERVICE_TASK], 8192, NULL,
|
||||
11, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -15,6 +15,7 @@ idf_component_register(
|
||||
"utilities/u8g2/port"
|
||||
"services/display_service"
|
||||
"components/screen_pages/test_page"
|
||||
"components/imp_esp_i2c_master_dev_op"
|
||||
|
||||
EXCLUDE_SRCS
|
||||
"utilities/imp_util_ring_queue/ring_queue_test.c"
|
||||
@ -36,6 +37,7 @@ idf_component_register(
|
||||
"utilities/u8g2/port"
|
||||
"services/display_service"
|
||||
"components/screen_pages/test_page"
|
||||
"components/imp_esp_i2c_master_dev_op"
|
||||
|
||||
LDFRAGMENTS
|
||||
"utilities/letter_shell/port/esp-idf/shell.lf"
|
||||
|
||||
@ -0,0 +1,122 @@
|
||||
/**
|
||||
* @file imp_esp_i2c_master_dev_op.c
|
||||
* @author Alvin Young (impressionyang@outlook.com)
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2025-03-24
|
||||
*
|
||||
* _ _
|
||||
* (_)_ _ ___ _______ ___ ___ (_)__ ___ __ _____ ____ ___ _
|
||||
* / / ' \/ _ \/ __/ -_|_-<(_-</ / _ \/ _ \/ // / _ `/ _ \/ _ `/
|
||||
* /_/_/_/_/ .__/_/ \__/___/___/_/\___/_//_/\_, /\_,_/_//_/\_, /
|
||||
* /_/ /___/ /___/
|
||||
* @copyright Copyright (c) 2025 impressionyang
|
||||
*
|
||||
* @par 修改日志:
|
||||
* <table>
|
||||
* <tr><th>Date <th>Version <th>Author <th>Description
|
||||
* <tr><td>2025-03-24 <td>v1.0 <td>Alvin Young <td>首次创建
|
||||
* </table>
|
||||
*
|
||||
*/
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "imp_esp_i2c_master_dev_op.h"
|
||||
#include <stdio.h>
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "esp_log.h"
|
||||
#include "driver/i2c_master.h"
|
||||
#include <stdlib.h>
|
||||
/* define --------------------------------------------------------------------*/
|
||||
#define I2C_BUS_0_SCL_PIN 34
|
||||
#define I2C_BUS_0_SDA_PIN 33
|
||||
/* typedef -------------------------------------------------------------------*/
|
||||
/* variables -----------------------------------------------------------------*/
|
||||
|
||||
static uint8_t is_bus_0_inited = 0;
|
||||
|
||||
i2c_master_bus_handle_t bus0_handle;
|
||||
static imp_esp_i2c_master_dev_op_t i2c_bus_0_handle = { 0 };
|
||||
/* Private function(only *.c) -----------------------------------------------*/
|
||||
|
||||
void _imp_esp_i2c_master_dev_op_bus_init(
|
||||
imp_esp_i2c_master_dev_op_port_num_e port)
|
||||
{
|
||||
if (port == EM_IMP_ESP_I2C_PORT_0) {
|
||||
i2c_master_bus_config_t bus_config = {
|
||||
.i2c_port = I2C_NUM_0,
|
||||
.sda_io_num = I2C_BUS_0_SDA_PIN,
|
||||
.scl_io_num = I2C_BUS_0_SCL_PIN,
|
||||
.clk_source = I2C_CLK_SRC_DEFAULT,
|
||||
.glitch_ignore_cnt = 7,
|
||||
.flags.enable_internal_pullup = true,
|
||||
};
|
||||
i2c_new_master_bus(&bus_config, &bus0_handle);
|
||||
}
|
||||
}
|
||||
|
||||
void _imp_esp_i2c_master_dev_op_handle_init(imp_esp_i2c_master_dev_op_t* handle)
|
||||
{
|
||||
uint8_t bit_len = handle->chip_addr_is_7bit == 1 ? 0 : 1;
|
||||
i2c_device_config_t dev_config = {
|
||||
.dev_addr_length = bit_len,
|
||||
.device_address = handle->chip_addr,
|
||||
.scl_speed_hz = handle->bus_speed,
|
||||
};
|
||||
i2c_master_bus_add_device(handle->bus_handle, &dev_config,
|
||||
&(handle->dev_handle));
|
||||
}
|
||||
|
||||
/* Exported functions --------------------------------------------------------*/
|
||||
uint8_t
|
||||
imp_esp_i2c_master_dev_op_init(imp_esp_i2c_master_dev_op_t* handle,
|
||||
imp_esp_i2c_master_dev_op_port_num_e port,
|
||||
uint8_t chip_addr_is_7bit, uint16_t chip_addr,
|
||||
uint32_t bus_speed)
|
||||
{
|
||||
handle->port = port;
|
||||
handle->chip_addr_is_7bit = chip_addr_is_7bit;
|
||||
handle->chip_addr = chip_addr;
|
||||
handle->bus_speed = bus_speed;
|
||||
|
||||
switch (port) {
|
||||
case EM_IMP_ESP_I2C_PORT_0:
|
||||
if (!is_bus_0_inited) {
|
||||
_imp_esp_i2c_master_dev_op_bus_init(EM_IMP_ESP_I2C_PORT_0);
|
||||
is_bus_0_inited = 1;
|
||||
}
|
||||
handle->bus_handle = bus0_handle;
|
||||
_imp_esp_i2c_master_dev_op_handle_init(handle);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
uint8_t imp_esp_i2c_master_dev_op_read(imp_esp_i2c_master_dev_op_t* handle,
|
||||
uint8_t* reg, uint16_t reg_len,
|
||||
uint8_t* data, uint16_t data_len)
|
||||
{
|
||||
if (NULL == handle->bus_handle || NULL == handle->dev_handle) {
|
||||
return 0;
|
||||
}
|
||||
esp_err_t err =
|
||||
i2c_master_transmit_receive(handle->dev_handle, reg, reg_len, data,
|
||||
data_len, 1000 / portTICK_PERIOD_MS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
uint8_t imp_esp_i2c_master_dev_op_write(imp_esp_i2c_master_dev_op_t* handle,
|
||||
uint8_t* data, uint16_t data_len)
|
||||
{
|
||||
if (NULL == handle->bus_handle || NULL == handle->dev_handle) {
|
||||
return 0;
|
||||
}
|
||||
esp_err_t err = i2c_master_transmit(handle->dev_handle, data, data_len,
|
||||
1000 / portTICK_PERIOD_MS);
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* EOF
|
||||
*/
|
||||
@ -0,0 +1,90 @@
|
||||
/**
|
||||
* @file imp_esp_i2c_master_dev_op_master_dev_op.h
|
||||
* @author Alvin Young (impressionyang@outlook.com)
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2025-03-24
|
||||
*
|
||||
* _ _
|
||||
* (_)_ _ ___ _______ ___ ___ (_)__ ___ __ _____ ____ ___ _
|
||||
* / / ' \/ _ \/ __/ -_|_-<(_-</ / _ \/ _ \/ // / _ `/ _ \/ _ `/
|
||||
* /_/_/_/_/ .__/_/ \__/___/___/_/\___/_//_/\_, /\_,_/_//_/\_, /
|
||||
* /_/ /___/ /___/
|
||||
* @copyright Copyright (c) 2025 impressionyang
|
||||
*
|
||||
* @par 修改日志:
|
||||
* <table>
|
||||
* <tr><th>Date <th>Version <th>Author <th>Description
|
||||
* <tr><td>2025-03-24 <td>v1.0 <td>Alvin Young <td>首次创建
|
||||
* </table>
|
||||
*
|
||||
*/
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __IMP_ESP_I2C_MASTER_DEV_OP_H__
|
||||
#define __IMP_ESP_I2C_MASTER_DEV_OP_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include <stdint.h>
|
||||
#include "driver/i2c_master.h"
|
||||
/* define --------------------------------------------------------------------*/
|
||||
/* typedef -------------------------------------------------------------------*/
|
||||
typedef enum __imp_esp_i2c_master_dev_op_port_num_e__
|
||||
{
|
||||
EM_IMP_ESP_I2C_PORT_0 = 0x00,
|
||||
EM_IMP_ESP_I2C_PORT_1,
|
||||
EM_IMP_ESP_I2C_PORT_2,
|
||||
} imp_esp_i2c_master_dev_op_port_num_e;
|
||||
|
||||
typedef struct __imp_esp_i2c_master_dev_op_t__
|
||||
{
|
||||
i2c_port_t port;
|
||||
uint8_t is_dev_init;
|
||||
uint8_t chip_addr_is_7bit;
|
||||
uint16_t chip_addr;
|
||||
uint32_t bus_speed;
|
||||
i2c_master_dev_handle_t dev_handle;
|
||||
i2c_master_bus_handle_t bus_handle;
|
||||
} imp_esp_i2c_master_dev_op_t;
|
||||
/* variables -----------------------------------------------------------------*/
|
||||
/* Private function(only *.c) -----------------------------------------------*/
|
||||
/* Exported functions --------------------------------------------------------*/
|
||||
uint8_t
|
||||
imp_esp_i2c_master_dev_op_init(imp_esp_i2c_master_dev_op_t* handle,
|
||||
imp_esp_i2c_master_dev_op_port_num_e port,
|
||||
uint8_t chip_addr_is_7bit, uint16_t chip_addr,
|
||||
uint32_t bus_speed);
|
||||
uint8_t imp_esp_i2c_master_dev_op_read(imp_esp_i2c_master_dev_op_t* bus,
|
||||
uint8_t* reg, uint16_t reg_len,
|
||||
uint8_t* data, uint16_t data_len);
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief reg in data
|
||||
* @param [in] bus
|
||||
* @param [in] data
|
||||
* @param [in] data_len
|
||||
* @return uint8_t
|
||||
* @date 2025-03-24
|
||||
* @author Alvin Young (impressionyang@outlook.com)
|
||||
*
|
||||
* @details
|
||||
* @note
|
||||
* @par 修改日志:
|
||||
* <table>
|
||||
* <tr><th>Date <th>Author <th>Description
|
||||
* <tr><td>2025-03-24 <td>Alvin Young <td>新建
|
||||
* </table>
|
||||
*/
|
||||
uint8_t imp_esp_i2c_master_dev_op_write(imp_esp_i2c_master_dev_op_t* bus,
|
||||
uint8_t* data, uint16_t data_len);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif //__IMP_ESP_I2C_MASTER_DEV_OP_H__
|
||||
/*
|
||||
* EOF
|
||||
*/
|
||||
@ -24,7 +24,8 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include "esp_log.h"
|
||||
#include "driver/i2c.h"
|
||||
// #include "driver/i2c.h"
|
||||
#include "imp_esp_i2c_master_dev_op.h"
|
||||
#include "u8g2.h"
|
||||
#include "u8x8.h"
|
||||
#include <freertos/FreeRTOS.h>
|
||||
@ -42,14 +43,16 @@
|
||||
|
||||
/* typedef -------------------------------------------------------------------*/
|
||||
/* variables -----------------------------------------------------------------*/
|
||||
i2c_config_t i2c_config = {
|
||||
.mode = I2C_MODE_MASTER, // set master mod
|
||||
.sda_io_num = I2C_SDA_IO, // set sda pin
|
||||
.scl_io_num = I2C_SCL_IO, // set scl pin
|
||||
.sda_pullup_en = GPIO_PULLUP_ENABLE, // pull up mode
|
||||
.scl_pullup_en = GPIO_PULLUP_ENABLE, // pull up mode
|
||||
.master.clk_speed = 4000000 // set speed at 100KHz
|
||||
};
|
||||
// i2c_config_t i2c_config = {
|
||||
// .mode = I2C_MODE_MASTER, // set master mod
|
||||
// .sda_io_num = I2C_SDA_IO, // set sda pin
|
||||
// .scl_io_num = I2C_SCL_IO, // set scl pin
|
||||
// .sda_pullup_en = GPIO_PULLUP_ENABLE, // pull up mode
|
||||
// .scl_pullup_en = GPIO_PULLUP_ENABLE, // pull up mode
|
||||
// .master.clk_speed = 4000000 // set speed at 100KHz
|
||||
// };
|
||||
|
||||
imp_esp_i2c_master_dev_op_t i2c_oled_handle;
|
||||
|
||||
/* Private function(only *.c) -----------------------------------------------*/
|
||||
|
||||
@ -69,8 +72,10 @@ i2c_config_t i2c_config = {
|
||||
*/
|
||||
static void _imp_i2c_ssd_oled_init(void)
|
||||
{
|
||||
i2c_param_config(I2C_NUM_0, &i2c_config);
|
||||
i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0);
|
||||
// i2c_param_config(I2C_NUM_0, &i2c_config);
|
||||
// i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0);
|
||||
imp_esp_i2c_master_dev_op_init(&i2c_oled_handle, EM_IMP_ESP_I2C_PORT_0, 1,
|
||||
0x3C, 4000000);
|
||||
}
|
||||
|
||||
/* Exported functions --------------------------------------------------------*/
|
||||
@ -94,13 +99,15 @@ static void _imp_i2c_ssd_oled_init(void)
|
||||
*/
|
||||
void imp_i2c_ssd_oled_write(uint8_t addr, uint32_t idx, uint8_t* data)
|
||||
{
|
||||
i2c_cmd_handle_t handler = i2c_cmd_link_create();
|
||||
i2c_master_start(handler);
|
||||
i2c_master_write_byte(handler, addr | WRITE_BIT, ACK_CHECK_EN);
|
||||
i2c_master_write(handler, data, idx, 2);
|
||||
i2c_master_stop(handler);
|
||||
i2c_master_cmd_begin(I2C_NUM_0, handler, pdMS_TO_TICKS(100));
|
||||
i2c_cmd_link_delete(handler);
|
||||
// i2c_cmd_handle_t handler = i2c_cmd_link_create();
|
||||
// i2c_master_start(handler);
|
||||
// i2c_master_write_byte(handler, addr | WRITE_BIT, ACK_CHECK_EN);
|
||||
// i2c_master_write(handler, data, idx, 2);
|
||||
// i2c_master_stop(handler);
|
||||
// i2c_master_cmd_begin(I2C_NUM_0, handler, pdMS_TO_TICKS(100));
|
||||
// i2c_cmd_link_delete(handler);
|
||||
// imp_esp_i2c_master_dev_op_write(&i2c_oled_handle, &addr, 1);
|
||||
imp_esp_i2c_master_dev_op_write(&i2c_oled_handle, data, idx);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -141,34 +148,34 @@ uint8_t imp_i2c_ssd_oled_8x8_gpio_delay(u8x8_t* u8x8, uint8_t msg,
|
||||
uint8_t u8x8_byte_i2c(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ptr)
|
||||
{
|
||||
static uint8_t buffer
|
||||
[32]; /* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */
|
||||
[32]; /* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */
|
||||
static uint8_t buf_idx;
|
||||
uint8_t* data;
|
||||
// cdc_printf("i2c addr is 0x%02x\r\n", u8x8_GetI2CAddress(u8x8));
|
||||
|
||||
switch (msg) {
|
||||
case U8X8_MSG_BYTE_SEND:
|
||||
data = (uint8_t*)arg_ptr;
|
||||
while (arg_int > 0) {
|
||||
buffer[buf_idx++] = *data;
|
||||
data++;
|
||||
arg_int--;
|
||||
}
|
||||
break;
|
||||
data = (uint8_t*)arg_ptr;
|
||||
while (arg_int > 0) {
|
||||
buffer[buf_idx++] = *data;
|
||||
data++;
|
||||
arg_int--;
|
||||
}
|
||||
break;
|
||||
case U8X8_MSG_BYTE_INIT:
|
||||
/* add your custom code to init i2c subsystem */
|
||||
break;
|
||||
/* add your custom code to init i2c subsystem */
|
||||
break;
|
||||
case U8X8_MSG_BYTE_SET_DC:
|
||||
/* ignored for i2c */
|
||||
break;
|
||||
/* ignored for i2c */
|
||||
break;
|
||||
case U8X8_MSG_BYTE_START_TRANSFER:
|
||||
buf_idx = 0;
|
||||
break;
|
||||
buf_idx = 0;
|
||||
break;
|
||||
case U8X8_MSG_BYTE_END_TRANSFER:
|
||||
imp_i2c_ssd_oled_write(u8x8_GetI2CAddress(u8x8), buf_idx, buffer);
|
||||
break;
|
||||
imp_i2c_ssd_oled_write(u8x8_GetI2CAddress(u8x8), buf_idx, buffer);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user