mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-02-18 18:21:40 +08:00
[driver]添加ESP32_C3 I2C驱动
This commit is contained in:
parent
19f311b498
commit
1a7cd8b43f
@ -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
bsp/ESP32_C3/drivers/drv_hw_i2c.c
Normal file
133
bsp/ESP32_C3/drivers/drv_hw_i2c.c
Normal file
@ -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
bsp/ESP32_C3/drivers/drv_hw_i2c.h
Normal file
32
bsp/ESP32_C3/drivers/drv_hw_i2c.h
Normal file
@ -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__ */
|
@ -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 */
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user