forked from test34/can_wizard
Add support for esp32
This commit is contained in:
parent
aa8ff79313
commit
b78d983c1f
3 changed files with 147 additions and 15 deletions
103
README.md
103
README.md
|
@ -1,9 +1,104 @@
|
||||||
TODO:
|
|
||||||
|
# CAN Wizard
|
||||||
|
|
||||||
|
CAN Wizard is a project designed for communication using the CAN (Controller Area Network) protocol, primarily targeted at embedded systems utilizing the ESP32 microcontroller family. This project is developed using ESP-IDF and supports ESP32-C3, allowing flexible development for different use cases.
|
||||||
|
|
||||||
|
Here are more information:
|
||||||
|
- [Xa6p Article](https://habr.com/ru/articles/793326/). (in Russian)
|
||||||
|
- [Traduccion in English](https://okhsunrog.ru/articles/2024/02/15/can_bus_sniffer/).
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **CAN Communication**: Implements CAN communication protocols, enabling data exchange between devices over a CAN bus.
|
||||||
|
- **File System Integration**: Includes file system operations for handling configuration or logging.
|
||||||
|
- **Custom serial Console**: A custom serial console implementation for interacting with the system and issuing commands.
|
||||||
|
- **Modular Design**: Organized in components for easier maintenance and scalability, including linked lists and command utilities.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- **Hardware**:
|
||||||
|
- ESP32-C3 microcontroller
|
||||||
|
- SN65HVD230 CAN transceiver
|
||||||
|
|
||||||
|
- **Software**:
|
||||||
|
- ESP-IDF (version x.x.x or newer)
|
||||||
|
- CMake (for project build system)
|
||||||
|
- Python (for ESP-IDF and related tools)
|
||||||
|
|
||||||
|
## Setup and Installation
|
||||||
|
|
||||||
|
1. **Clone the Repository**:
|
||||||
|
Clone this repository using:
|
||||||
|
```bash
|
||||||
|
git clone --recursive git@github.com:okhsunrog/can_wizard.git
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Install ESP-IDF**:
|
||||||
|
Follow the official ESP-IDF installation guide for your operating system: [ESP-IDF Setup Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/)
|
||||||
|
|
||||||
|
3. **Configure ESP-IDF**:
|
||||||
|
Set up your environment by running the following commands:
|
||||||
|
```bash
|
||||||
|
cd <project-directory>
|
||||||
|
idf.py set-target esp32c3
|
||||||
|
idf.py menuconfig
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Build and Flash**:
|
||||||
|
Build the project and flash it to your microcontroller:
|
||||||
|
```bash
|
||||||
|
idf.py build
|
||||||
|
idf.py flash
|
||||||
|
idf.py monitor
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Console Commands
|
||||||
|
|
||||||
|
The CAN Wizard project provides several commands that can be executed through a console interface:
|
||||||
|
|
||||||
|
- `can_send <data>`: Send CAN data over the bus.
|
||||||
|
- `can_receive`: Receive CAN data from the bus.
|
||||||
|
- `can_status`: Display the current CAN status.
|
||||||
|
|
||||||
|
Additional commands can be explored through the console by typing `help`.
|
||||||
|
|
||||||
|
### File System Operations
|
||||||
|
|
||||||
|
The project includes basic file system operations to read and write configuration or log files. These operations can be accessed through the `fs_*` commands in the console.
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
can_wizard-main/
|
||||||
|
├── components/
|
||||||
|
│ └── C-Linked-List/ # Linked list implementation used in the project
|
||||||
|
├── main/
|
||||||
|
│ ├── can.c # CAN communication implementation
|
||||||
|
│ ├── console.c # Custom console implementation
|
||||||
|
│ ├── cmd_can.c # CAN command handlers
|
||||||
|
│ ├── fs.c # File system operations
|
||||||
|
│ └── main.c # Main entry point
|
||||||
|
└── CMakeLists.txt # Project build system configuration
|
||||||
|
```
|
||||||
|
|
||||||
|
## TODO:
|
||||||
- code refactoring
|
- code refactoring
|
||||||
- test dumb mode
|
- test dumb mode
|
||||||
- fix prompt flickering with some commands
|
- fix prompt flickering with some commands
|
||||||
- add standard ID filtering to cansmartfilter
|
- add standard ID filtering to cansmartfilter
|
||||||
|
|
||||||
An article about the project:
|
## License
|
||||||
- in [Russian](https://habr.com/ru/articles/793326/).
|
|
||||||
- in [English](https://okhsunrog.ru/articles/2024/02/15/can_bus_sniffer/).
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions are welcome! Please submit a pull request or open an issue to discuss your ideas.
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
Danila Gornushko
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -185,6 +185,7 @@ static int canup(int argc, char **argv) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch (canup_args.speed->ival[0]) {
|
switch (canup_args.speed->ival[0]) {
|
||||||
|
#if CONFIG_IDF_TARGET_ESP32C3
|
||||||
case 1000:
|
case 1000:
|
||||||
t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1KBITS();
|
t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1KBITS();
|
||||||
break;
|
break;
|
||||||
|
@ -203,6 +204,7 @@ static int canup(int argc, char **argv) {
|
||||||
case 20000:
|
case 20000:
|
||||||
t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_20KBITS();
|
t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_20KBITS();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case 25000:
|
case 25000:
|
||||||
t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_25KBITS();
|
t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_25KBITS();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
#include "can.h"
|
#include "can.h"
|
||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
#include "xvprintf.h"
|
#include "xvprintf.h"
|
||||||
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
|
#include "driver/uart.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if CONFIG_LOG_COLORS
|
#if CONFIG_LOG_COLORS
|
||||||
static const bool use_colors = true;
|
static const bool use_colors = true;
|
||||||
|
@ -182,29 +185,61 @@ void console_task_interactive(void* arg) {
|
||||||
void initialize_console(void) {
|
void initialize_console(void) {
|
||||||
/* Disable buffering on stdin */
|
/* Disable buffering on stdin */
|
||||||
setvbuf(stdin, NULL, _IONBF, 0);
|
setvbuf(stdin, NULL, _IONBF, 0);
|
||||||
|
|
||||||
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
|
/* Set up UART for the console */
|
||||||
|
const uart_config_t uart_config = {
|
||||||
|
.baud_rate = 115200,
|
||||||
|
.data_bits = UART_DATA_8_BITS,
|
||||||
|
.parity = UART_PARITY_DISABLE,
|
||||||
|
.stop_bits = UART_STOP_BITS_1,
|
||||||
|
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Install the UART driver */
|
||||||
|
uart_driver_install(UART_NUM_0, 256, 0, 0, NULL, 0);
|
||||||
|
uart_param_config(UART_NUM_0, &uart_config);
|
||||||
|
|
||||||
|
/* Asign VFS to UART */
|
||||||
|
//uart_vfs_dev_use_driver(UART_NUM_0);
|
||||||
|
esp_vfs_dev_uart_use_driver(UART_NUM_0);
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C3
|
||||||
/* Minicom, screen, idf_monitor send CR when ENTER key is pressed */
|
/* Minicom, screen, idf_monitor send CR when ENTER key is pressed */
|
||||||
esp_vfs_dev_usb_serial_jtag_set_rx_line_endings(ESP_LINE_ENDINGS_CR);
|
esp_vfs_dev_usb_serial_jtag_set_rx_line_endings(ESP_LINE_ENDINGS_CR);
|
||||||
|
|
||||||
/* Move the caret to the beginning of the next line on '\n' */
|
/* Move the caret to the beginning of the next line on '\n' */
|
||||||
esp_vfs_dev_usb_serial_jtag_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF);
|
esp_vfs_dev_usb_serial_jtag_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF);
|
||||||
|
|
||||||
|
usb_serial_jtag_driver_config_t usb_serial_jtag_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT();
|
||||||
|
|
||||||
|
/* Install USB-SERIAL-JTAG driver for interrupt-driven reads and writes */
|
||||||
|
ESP_ERROR_CHECK(usb_serial_jtag_driver_install(&usb_serial_jtag_config));
|
||||||
|
|
||||||
|
/* Asign vfs to JTAG */
|
||||||
|
esp_vfs_usb_serial_jtag_use_driver();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Enable non-blocking mode on stdin and stdout */
|
/* Enable non-blocking mode on stdin and stdout */
|
||||||
fcntl(fileno(stdout), F_SETFL, 0);
|
fcntl(fileno(stdout), F_SETFL, 0);
|
||||||
fcntl(fileno(stdin), F_SETFL, 0);
|
fcntl(fileno(stdin), F_SETFL, 0);
|
||||||
usb_serial_jtag_driver_config_t usb_serial_jtag_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT();
|
|
||||||
/* Install USB-SERIAL-JTAG driver for interrupt-driven reads and writes */
|
/* Configure the console */
|
||||||
ESP_ERROR_CHECK(usb_serial_jtag_driver_install(&usb_serial_jtag_config));
|
|
||||||
/* Tell vfs to use usb-serial-jtag driver */
|
|
||||||
esp_vfs_usb_serial_jtag_use_driver();
|
|
||||||
console_config.max_cmdline_args = CONFIG_CONSOLE_MAX_CMDLINE_ARGS;
|
console_config.max_cmdline_args = CONFIG_CONSOLE_MAX_CMDLINE_ARGS;
|
||||||
console_config.max_cmdline_length = CONFIG_CONSOLE_MAX_CMDLINE_LENGTH;
|
console_config.max_cmdline_length = CONFIG_CONSOLE_MAX_CMDLINE_LENGTH;
|
||||||
if (use_colors) console_config.hint_color = atoi(LOG_COLOR_CYAN);
|
if (use_colors) console_config.hint_color = atoi(LOG_COLOR_CYAN);
|
||||||
|
|
||||||
|
/* Initializing */
|
||||||
ESP_ERROR_CHECK(esp_console_init(&console_config));
|
ESP_ERROR_CHECK(esp_console_init(&console_config));
|
||||||
// linenoiseSetMultiLine(1);
|
|
||||||
|
/* Config library linenoise */
|
||||||
|
linenoiseSetMultiLine(1);
|
||||||
linenoiseSetCompletionCallback(&esp_console_get_completion);
|
linenoiseSetCompletionCallback(&esp_console_get_completion);
|
||||||
linenoiseSetHintsCallback((linenoiseHintsCallback*) &esp_console_get_hint);
|
linenoiseSetHintsCallback((linenoiseHintsCallback*) &esp_console_get_hint);
|
||||||
linenoiseHistorySetMaxLen(30);
|
linenoiseHistorySetMaxLen(30);
|
||||||
linenoiseSetMaxLineLen(console_config.max_cmdline_length);
|
linenoiseSetMaxLineLen(console_config.max_cmdline_length);
|
||||||
linenoiseHistoryLoad(HISTORY_PATH);
|
linenoiseHistoryLoad(HISTORY_PATH);
|
||||||
/* Register commands */
|
|
||||||
|
/* Record commands */
|
||||||
esp_console_register_help_command();
|
esp_console_register_help_command();
|
||||||
register_system();
|
register_system();
|
||||||
register_can_commands();
|
register_can_commands();
|
||||||
|
|
Loading…
Reference in a new issue