Implement Multi-Bus CAN Interfaces
This commit is contained in:
@@ -2,5 +2,6 @@ idf_component_register(SRCS "hello_world_main.cpp"
|
||||
REQUIRES driver
|
||||
REQUIRES mcp2521
|
||||
REQUIRES mcp2521_hardware_interface
|
||||
REQUIRES CAN-Protocol-Stack
|
||||
REQUIRES spi_flash
|
||||
INCLUDE_DIRS "")
|
||||
|
||||
@@ -23,23 +23,40 @@
|
||||
|
||||
#include "mcp2521.hpp"
|
||||
|
||||
#define SPI_PIN_CS0 GPIO_NUM_5
|
||||
#define SPI_PIN_SCLK GPIO_NUM_18
|
||||
#define SPI_PIN_MISO GPIO_NUM_19
|
||||
#define SPI_PIN_MOSI GPIO_NUM_23
|
||||
#define CAN_INT_PIN GPIO_NUM_21
|
||||
|
||||
#define EXTERNAL_TRIGGER GPIO_NUM_26
|
||||
#define SPI_PIN_CS0 GPIO_NUM_25
|
||||
#define SPI_PIN_CS1 GPIO_NUM_27
|
||||
|
||||
void onRX(void *arg) {
|
||||
MCP2521 *mcp2521 = (MCP2521 *)arg;
|
||||
#define CAN_INT0_PIN GPIO_NUM_5
|
||||
#define CAN_INT1_PIN GPIO_NUM_26
|
||||
|
||||
rx_info info = mcp2521->get_rx_id(MCP2521_RX_BUFFER::RXB0);
|
||||
void onRX0(void *arg) {
|
||||
MCP2521 *mcp2521_0 = (MCP2521 *)arg;
|
||||
|
||||
rx_info info = mcp2521_0->get_rx_id(MCP2521_RX_BUFFER::RXB0);
|
||||
uint8_t data[8];
|
||||
|
||||
mcp2521->read_rx_buf(MCP2521_RX_BUFFER::RXB0, MCP2521_BUFFER_TYPE::DATA, data, info.length);
|
||||
mcp2521_0->read_rx_buf(MCP2521_RX_BUFFER::RXB0, MCP2521_BUFFER_TYPE::DATA, data, info.length);
|
||||
|
||||
printf("RX: (%x) ", info.id);
|
||||
printf("RX0: (%x) ", info.id);
|
||||
for (int i = 0; i < info.length; i++) {
|
||||
printf("%x ", data[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void onRX1(void *arg) {
|
||||
MCP2521 *mcp2521_0 = (MCP2521 *)arg;
|
||||
|
||||
rx_info info = mcp2521_0->get_rx_id(MCP2521_RX_BUFFER::RXB0);
|
||||
uint8_t data[8];
|
||||
|
||||
mcp2521_0->read_rx_buf(MCP2521_RX_BUFFER::RXB0, MCP2521_BUFFER_TYPE::DATA, data, info.length);
|
||||
|
||||
printf("RX1: (%x) ", info.id);
|
||||
for (int i = 0; i < info.length; i++) {
|
||||
printf("%x ", data[i]);
|
||||
}
|
||||
@@ -52,46 +69,53 @@ extern "C" void app_main() {
|
||||
const gpio_num_t LED_PIN = GPIO_NUM_2;
|
||||
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
|
||||
|
||||
gpio_set_direction(EXTERNAL_TRIGGER, GPIO_MODE_OUTPUT);
|
||||
gpio_set_level(EXTERNAL_TRIGGER, true);
|
||||
|
||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||
|
||||
|
||||
spi_bus_config_t spi_bus;
|
||||
|
||||
MCP2521_Hardware_Handle_ESP hardware_mcp2521(
|
||||
MCP2521_HardwareHandleFactory_ESPBus mcp2521_hardware_factory(
|
||||
VSPI_HOST,
|
||||
&spi_bus,
|
||||
SPI_PIN_MOSI,
|
||||
SPI_PIN_MISO,
|
||||
SPI_PIN_SCLK,
|
||||
SPI_PIN_CS0,
|
||||
CAN_INT_PIN
|
||||
SPI_PIN_SCLK
|
||||
);
|
||||
|
||||
MCP2521 mcp2521(&hardware_mcp2521);
|
||||
MCP2521_HardwareHandle_ESPBus hardware_mcp2521_0 = mcp2521_hardware_factory.create(CAN_INT0_PIN, SPI_PIN_CS0);
|
||||
MCP2521_HardwareHandle_ESPBus hardware_mcp2521_1 = mcp2521_hardware_factory.create(CAN_INT1_PIN, SPI_PIN_CS1);
|
||||
|
||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||
|
||||
MCP2521 mcp2521_0(&hardware_mcp2521_0);
|
||||
MCP2521 mcp2521_1(&hardware_mcp2521_1);
|
||||
|
||||
uint8_t data[4] = {0xf0, 0x42, 0x13, 0x37};
|
||||
|
||||
gpio_set_level(EXTERNAL_TRIGGER, false);
|
||||
mcp2521.reset();
|
||||
mcp2521.enable_interrupts(true, true, true, true, true, true, true, true);
|
||||
mcp2521_0.reset();
|
||||
mcp2521_1.reset();
|
||||
mcp2521_0.enable_interrupts(true, true, true, true, true, true, true, true);
|
||||
mcp2521_1.enable_interrupts(true, true, true, true, true, true, true, true);
|
||||
|
||||
mcp2521.register_rx0_handler(onRX, &mcp2521);
|
||||
mcp2521.register_rx1_handler(onRX, &mcp2521);
|
||||
mcp2521.set_mode_of_operation(MCP2521_OPERATION_MODE::LOOPBACK, true);
|
||||
mcp2521_0.register_rx0_handler(onRX0, &mcp2521_0);
|
||||
mcp2521_1.register_rx0_handler(onRX1, &mcp2521_1);
|
||||
mcp2521_0.register_rx1_handler(onRX0, &mcp2521_0);
|
||||
mcp2521_1.register_rx1_handler(onRX1, &mcp2521_1);
|
||||
|
||||
mcp2521_0.set_mode_of_operation(MCP2521_OPERATION_MODE::NORMAL, true);
|
||||
mcp2521_1.set_mode_of_operation(MCP2521_OPERATION_MODE::NORMAL, true);
|
||||
|
||||
printf("CANSTAT0: %x\n", mcp2521_0.read_reg(MCP2521_CANSTAT));
|
||||
printf("CANSTAT1: %x\n", mcp2521_1.read_reg(MCP2521_CANSTAT));
|
||||
|
||||
vTaskDelay(3 / portTICK_PERIOD_MS);
|
||||
vTaskDelay(20 / portTICK_PERIOD_MS);
|
||||
|
||||
mcp2521.prepare_tx(
|
||||
mcp2521_0.prepare_tx(
|
||||
MCP2521_TX_BUFFER::TXB0, 0x042, data, 4, false, false);
|
||||
|
||||
vTaskDelay(20 / portTICK_PERIOD_MS);
|
||||
mcp2521_0.request_to_send(MCP2521_TX_BUFFER::TXB0);
|
||||
//vTaskDelay(10 / portTICK_PERIOD_MS);
|
||||
//mcp2521_1.request_to_send(MCP2521_TX_BUFFER::TXB0);
|
||||
|
||||
mcp2521.request_to_send(MCP2521_TX_BUFFER::TXB0);
|
||||
|
||||
mcp2521.set_tx_id(MCP2521_TX_BUFFER::TXB0, 0x041, false);
|
||||
mcp2521.request_to_send(MCP2521_TX_BUFFER::TXB0);
|
||||
|
||||
//mcp2521_0.set_tx_id(MCP2521_TX_BUFFER::TXB0, 0x041, false);
|
||||
//mcp2521_0.request_to_send(MCP2521_TX_BUFFER::TXB0);
|
||||
|
||||
vTaskDelay(20 / portTICK_PERIOD_MS);
|
||||
|
||||
@@ -100,6 +124,6 @@ extern "C" void app_main() {
|
||||
gpio_set_level(LED_PIN, flag);
|
||||
flag = !flag;
|
||||
|
||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user