Browse Source

[driver]添加ESP32_C3 I2C驱动

ZXY_LINUX 2 years ago
parent
commit
1a7cd8b43f

+ 9 - 4
bsp/ESP32_C3/drivers/Kconfig

@@ -1,6 +1,6 @@
 
 config SOC_ESPRESSIF
-    bool
+    bool 
 
 config SOC_ESP32_C3
     bool
@@ -24,7 +24,7 @@ choice
         bool "LUATOS ESP32C3 board"
 
     config BSP_BOARD_HX_EXP32C3
-        bool "HONGXU ESP32C3 board"
+        bool "HONGXU ESP32C3 board"    
 endchoice
 
 menu "Onboard Peripheral Drivers"
@@ -57,12 +57,17 @@ menu "On-chip Peripheral Drivers"
         bool "Enable GPIO"
         select RT_USING_PIN
         default y
-
+    
     config BSP_USING_UART
-        bool "Enable UART"
+		bool "Enable UART"
         select RT_USING_SERIAL
         select RT_USING_SERIAL_V1
         default y
+
+    config BSP_USING_I2C0
+        bool "Enable I2C0"
+        select RT_USING_I2C
+        default n        
 endmenu
 
 endmenu

+ 133 - 0
bsp/ESP32_C3/drivers/drv_hw_i2c.c

@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2006-2023, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ *2023-03-28      Zxy          first version
+ */
+#ifdef RT_USING_I2C
+#include "drv_hw_i2c.h"
+#include "driver/i2c.h"//bsp/ESP32_C3/packages/ESP-IDF-latest/components/driver/include/driver/i2c.h
+#include "hal/i2c_types.h"//bsp/ESP32_C3/packages/ESP-IDF-latest/tools/mocks/hal/include/hal/i2c_types.h
+#include "esp_err.h"
+//#include "portmacro.h"//bsp/ESP32_C3/packages/FreeRTOS_Wrapper-latest/FreeRTOS/portable/rt-thread/portmacro.h
+
+struct esp32_i2c
+{
+    struct rt_i2c_bus_device bus;
+
+    i2c_config_t *base;
+
+    char *device_name;
+};
+
+// #if defined(BSP_USING_I2C0)
+static struct esp32_i2c i2c0 = {0};
+// #endif
+
+static rt_size_t _master_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num)
+{
+    i2c_cmd_handle_t cmd;//创建流程
+    rt_size_t ret = (0);
+    rt_uint32_t index = 0;
+    // struct esp32_i2c *esp32_i2c = RT_NULL;
+    struct rt_i2c_msg *msg = RT_NULL;
+    i2c_rw_t direction;//w-0 r-1
+    esp_err_t result = ESP_OK;
+
+    RT_ASSERT(bus != RT_NULL);
+
+    // esp32_i2c = (struct esp32_i2c *)bus;
+
+    for(index = 0; index < num; index++)
+    {
+        msg = &msgs[index];
+        direction = ((msg->flags & RT_I2C_RD) ? I2C_MASTER_READ : I2C_MASTER_WRITE);
+
+        if (!(msg->flags & RT_I2C_NO_START))
+        {
+            /* Start condition and slave address. */
+            cmd = i2c_cmd_link_create();//创建流程
+            i2c_master_start(cmd);//启动流程录入
+            result = i2c_master_write_byte(cmd, msg->addr << 1 | WRITE_BIT, ACK_CHECK_EN);//发送起始信号和从设备地址
+            i2c_master_stop(cmd);//流程录入完毕
+            ret = i2c_master_cmd_begin(I2C_NUMBER(0), cmd, 1000 / portTICK_PERIOD_MS);//执行流程
+            i2c_cmd_link_delete(cmd);//删除流程任务
+            if (ret != ESP_OK) return ret;
+        }
+
+        if (result == ESP_OK)
+        {
+            if (direction == I2C_MASTER_WRITE)
+            {
+                /* Transmit data. */
+                cmd = i2c_cmd_link_create();//创建流程
+                i2c_master_start(cmd);//启动流程录入
+                result = i2c_master_write_byte(cmd, msg->buf, ACK_CHECK_EN);
+                i2c_master_stop(cmd);//流程录入完毕
+                ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);//执行流程
+                i2c_cmd_link_delete(cmd);//删除流程任务
+            }
+            else
+            {
+                /* Receive Data. */
+                cmd = i2c_cmd_link_create();//创建流程
+                i2c_master_start(cmd);//启动流程录入
+                result = i2c_master_read_byte(cmd, msg->buf, ACK_VAL);
+                i2c_master_stop(cmd);//流程录入完毕
+                ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);//执行流程
+                i2c_cmd_link_delete(cmd);//删除流程任务
+            }
+        }
+    }
+
+    if (result == ESP_OK)
+    {
+        ret = index;
+    }
+
+    return ret;
+}
+
+static rt_size_t _slave_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num)
+{
+    return -RT_ENOSYS;
+}
+
+static rt_err_t _i2c_bus_control(struct rt_i2c_bus_device *bus, rt_uint32_t cmd, rt_uint32_t arg)
+{
+    return -RT_EINVAL;
+}
+
+static const struct rt_i2c_bus_device_ops i2c_ops =
+{
+    _master_xfer,
+    _slave_xfer,
+    _i2c_bus_control,
+};
+
+int rt_hw_i2c_init(void)
+{
+    i2c0.base = &i2c0;
+    i2c0.device_name = "i2c0";
+    i2c0.bus.ops = &i2c_ops;
+    int i2c_master_port = I2C_MASTER_NUM;//iic0
+        i2c_config_t conf = {
+        .mode = I2C_MODE_MASTER,
+        .sda_io_num = I2C_MASTER_SDA_IO,
+        .sda_pullup_en = GPIO_PULLUP_ENABLE,
+        .scl_io_num = I2C_MASTER_SCL_IO,
+        .scl_pullup_en = GPIO_PULLUP_ENABLE,
+        .master.clk_speed = 100000,
+        // .clk_flags = 0,          /*!< Optional, you can use I2C_SCLK_SRC_FLAG_* flags to choose i2c source clock here. */
+    };
+
+    i2c_param_config(i2c_master_port, &conf);//配置完成
+    i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0);// I2C 设备的初始化
+    rt_i2c_bus_device_register(&i2c0.bus, i2c0.device_name);
+    return RT_EOK;
+}
+INIT_BOARD_EXPORT(rt_hw_i2c_init);
+#endif /* RT_USING_I2C */

+ 32 - 0
bsp/ESP32_C3/drivers/drv_hw_i2c.h

@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2006-2023, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ *2023-03-28      Zxy          first version
+ */
+#ifndef __DRV_HW_I2C_H__
+#define __DRV_HW_I2C_H__
+
+#include <rtthread.h>
+#include <rtdevice.h>
+#include "sdkconfig.h"
+
+#define WRITE_BIT I2C_MASTER_WRITE              /*!< I2C master write */
+#define READ_BIT I2C_MASTER_READ                /*!< I2C master read */
+#define ACK_CHECK_EN 0x1                        /*!< I2C master will check ack from slave*/
+#define ACK_CHECK_DIS 0x0                       /*!< I2C master will not check ack from slave */
+#define ACK_VAL 0x0                             /*!< I2C ack value */
+#define NACK_VAL 0x1                            /*!< I2C nack value */
+#define _I2C_NUMBER(num) I2C_NUM_##num
+#define I2C_NUMBER(num) _I2C_NUMBER(num)
+#define I2C_MASTER_NUM I2C_NUMBER(0) /*!< I2C port number for master dev */
+#define I2C_MASTER_SCL_IO CONFIG_I2C_MASTER_SCL               /*!< gpio number for I2C master clock */
+#define I2C_MASTER_SDA_IO CONFIG_I2C_MASTER_SDA               /*!< gpio number for I2C master data  */
+#define CONFIG_I2C_MASTER_SCL 6
+#define CONFIG_I2C_MASTER_SDA 5
+int rt_hw_i2c_init(void);
+
+#endif /* __DRV_HW_I2C_H__ */

+ 13 - 4
bsp/ESP32_C3/rtconfig.h

@@ -7,7 +7,7 @@
 /* RT-Thread Kernel */
 
 #define RT_NAME_MAX 8
-#define RT_ALIGN_SIZE 8
+#define RT_ALIGN_SIZE 4
 #define RT_THREAD_PRIORITY_32
 #define RT_THREAD_PRIORITY_MAX 32
 #define RT_TICK_PER_SECOND 1000
@@ -65,6 +65,7 @@
 /* Device Drivers */
 
 #define RT_USING_DEVICE_IPC
+#define RT_UNAMED_PIPE_NUMBER 64
 #define RT_USING_SERIAL
 #define RT_USING_SERIAL_V1
 #define RT_SERIAL_RB_BUFSZ 64
@@ -130,9 +131,6 @@
 /* u8g2: a monochrome graphic library */
 
 
-/* PainterEngine: A cross-platform graphics application framework written in C language */
-
-
 /* tools packages */
 
 
@@ -154,6 +152,11 @@
 
 /* peripheral libraries and drivers */
 
+/* sensors drivers */
+
+
+/* touch drivers */
+
 #define PKG_USING_ESP_IDF
 #define PKG_USING_ESP_IDF_LATEST_VERSION
 
@@ -163,6 +166,9 @@
 /* AI packages */
 
 
+/* Signal Processing and Control Algorithm Packages */
+
+
 /* miscellaneous packages */
 
 /* project laboratory */
@@ -195,10 +201,13 @@
 
 /* Communication */
 
+
 /* Device Control */
 
+
 /* Other */
 
+
 /* Signal IO */