乐鑫技术交流
直播中

李勇

7年用户 1286经验值
私信 关注
[问答]

ESP32C6两路TWAI读写时如何区分呢?

ESP32C6两路TWAI读写时不知道怎么区别,看过IDF上的例程,都是针对只有一路TWAI的,有没有大神有写过C6两路TWAI的例程,麻烦指点 一下?

回帖(1)

余温重顾

2024-6-7 10:54:29
ESP32-C6 是一款具有双 CAN 接口的微控制器,它支持 TWAI(Time-Triggered CAN)协议。要在 ESP32-C6 上实现两路 TWAI 读写,可以按照以下步骤进行:

1. 首先,确保您已经安装了 ESP-IDF 开发环境。如果没有,请访问 https://docs.espressif.com/projects/esp-idf/en/latest/esp32c6/getting-started/index.html 了解如何安装。

2. 创建一个新的 ESP-IDF 项目。在命令行中,输入以下命令:
   ```
   mkdir my_twai_project
   cd my_twai_project
   git clone https://github.com/espressif/esp-idf.git
   cd esp-idf
   git checkout release/v4.4
   cd ..
   ./esp-idf/install.sh
   export IDF_PATH=$(pwd)
   cd ..
   ```

3. 配置项目。在 `my_twai_project` 目录下,创建一个新的 CMakeLists.txt 文件,内容如下:
   ```
   cmake_minimum_required(VERSION 3.5)
   set(PROJECT_NAME "my_twai_project")
   project(${PROJECT_NAME})
   
   include($ENV{IDF_PATH}/tools/cmake/project.cmake)
   ```

4. 创建一个新的源文件,例如 `main.c`,并在其中编写以下代码:
   ```c
   #include
   #include
   #include "freertos/FreeRTOS.h"
   #include "freertos/task.h"
   #include "esp_log.h"
   #include "driver/can.h"

   static const char *TAG = "TWAI_EXAMPLE";

   void twai_example_task(void *arg) {
       can_device_handle_t can0_handle, can1_handle;
       can_timing_config_t can_timing = CAN_TIMING_CONFIG_500KBPS();

       // 初始化 CAN 接口 0
       can_driver_install(can0, &can_timing, CAN_MODE_NORMAL);
       can0_handle = can_get_device_handle(can0);

       // 初始化 CAN 接口 1
       can_driver_install(can1, &can_timing, CAN_MODE_NORMAL);
       can1_handle = can_get_device_handle(can1);

       // 配置 CAN 接口 0 的过滤器
       can_filter_config_t can0_filter = {
           .acceptance_code = 0x123,
           .acceptance_mask = 0x1FF,
           .single_filter = true
       };
       can_filter_set_config(can0_handle, 0, &can0_filter);

       // 配置 CAN 接口 1 的过滤器
       can_filter_config_t can1_filter = {
           .acceptance_code = 0x456,
           .acceptance_mask = 0x7FF,
           .single_filter = true
       };
       can_filter_set_config(can1_handle, 0, &can1_filter);

       // 创建 CAN 消息结构体
       can_message_t message;
       message.identifier = 0x100; // 消息 ID
       message.data_length_code = 8; // 数据长度
       message.data = "ABCDEFGH"; // 消息数据

       // 发送消息到 CAN 接口 0
       can_write_message(can0_handle, &message, portMAX_DELAY);

       // 发送消息到 CAN 接口 1
       message.identifier = 0x200;
       can_write_message(can1_handle, &message, portMAX_DELAY);

       // 接收消息
       can_message_t received_message;
       can_receive_message(can0_handle, &received_message, portMAX_DELAY);
       ESP_LOGI(TAG, "Received message on CAN0: ID=%03x, DLC=%d, Data=%s", received_message.identifier, received_message.data_length_code, received_message.data);

       can_receive_message(can1_handle, &received_message, portMAX_DELAY);
       ESP_LOGI(TAG, "Received message on CAN1: ID=%03x, DLC=%d, Data=%s", received_message.identifier, received_message.data_length_code, received_message.data);

       // 卸载 CAN 驱动
       can_driver_uninstall(can0_handle);
       can_driver_uninstall(can1_handle);

       vTaskDelete(NULL);
   }

   void app_main() {
       xTaskCreatePinnedToCore(twai_example_task, "twai_example_task", 4096, NULL, 5, NULL, 0);
   }
   ```

5. 编译并烧录程序。在 `my_twai_project` 目录下,执行以下命令:
   ```
   idf.py set-target esp32c6
   idf.py menuconfig
   idf.py build
   idf.py flash
   idf.py monitor
   ```

6. 运行程序并观察输出。您应该能够看到通过两个 CAN 接口发送
举报

更多回帖

发帖
×
20
完善资料,
赚取积分