100 lines
2.4 KiB
C++
100 lines
2.4 KiB
C++
#include "mcp2521.hpp"
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
#include "driver/gpio.h"
|
|
#include "driver/spi_master.h"
|
|
|
|
MCP2521_SPI_Interface::MCP2521_SPI_Interface(
|
|
spi_host_device_t spi_host,
|
|
spi_bus_config_t *bus_config,
|
|
gpio_num_t mosi,
|
|
gpio_num_t miso,
|
|
gpio_num_t sclk,
|
|
gpio_num_t cs,
|
|
gpio_num_t int_pin
|
|
) {
|
|
initPins(int_pin);
|
|
initSPIBus(spi_host, mosi, miso, sclk, bus_config);
|
|
this->spi_bus_config = bus_config;
|
|
initSPIDevice(spi_host, cs);
|
|
}
|
|
|
|
MCP2521_SPI_Interface::MCP2521_SPI_Interface(
|
|
spi_host_device_t spi_host,
|
|
spi_bus_config_t *bus_config,
|
|
gpio_num_t cs,
|
|
gpio_num_t int_pin
|
|
) {
|
|
initPins(int_pin);
|
|
this->spi_bus_config = bus_config;
|
|
initSPIDevice(spi_host, cs);
|
|
}
|
|
|
|
void MCP2521_SPI_Interface::initSPIBus(
|
|
spi_host_device_t spi_host,
|
|
gpio_num_t mosi,
|
|
gpio_num_t miso,
|
|
gpio_num_t sclk,
|
|
spi_bus_config_t *bus_config
|
|
) {
|
|
memset(bus_config, 0, sizeof(spi_bus_config_t));
|
|
bus_config->mosi_io_num = mosi;
|
|
bus_config->miso_io_num = miso;
|
|
bus_config->sclk_io_num = sclk;
|
|
|
|
bus_config->quadwp_io_num = -1;
|
|
bus_config->quadhd_io_num = -1;
|
|
|
|
bus_config->flags = SPICOMMON_BUSFLAG_MASTER;
|
|
spi_bus_initialize(spi_host, bus_config, SPI_DMA_CH_AUTO);
|
|
}
|
|
|
|
void MCP2521_SPI_Interface::initSPIDevice(
|
|
spi_host_device_t spi_host,
|
|
gpio_num_t cs
|
|
) {
|
|
memset(&this->spi_device_config, 0, sizeof(spi_device_interface_config_t));
|
|
this->spi_device_config = {
|
|
.command_bits = 8,
|
|
.address_bits = 0,
|
|
.dummy_bits = 0,
|
|
|
|
.mode = 0,
|
|
.duty_cycle_pos = 128,
|
|
// cs_ena_pretrans = 0 and cs_ena_posttrans = 0 need to be set to zero, if not its not compatible with full-duplex mode
|
|
// Learned this the hard way
|
|
.cs_ena_pretrans = 0,
|
|
.cs_ena_posttrans = 0,
|
|
.clock_speed_hz = 10000,
|
|
|
|
.spics_io_num = cs,
|
|
.flags = SPI_DEVICE_NO_DUMMY,
|
|
.queue_size = 5,
|
|
};
|
|
|
|
spi_bus_add_device(spi_host, &this->spi_device_config, &this->spi_device_handle);
|
|
|
|
memset(&this->spi_tx_buffer, 0, sizeof(this->spi_tx_buffer));
|
|
memset(&this->spi_rx_buffer, 0, sizeof(this->spi_rx_buffer));
|
|
}
|
|
|
|
spi_bus_config_t * MCP2521_SPI_Interface::getSPI_bus_config() {
|
|
return this->spi_bus_config;
|
|
}
|
|
|
|
MCP2521_SPI_Interface::~MCP2521_SPI_Interface() {
|
|
deinitSPI();
|
|
deinitPins();
|
|
}
|
|
|
|
void MCP2521_SPI_Interface::initPins(gpio_num_t int_pin) {
|
|
|
|
}
|
|
|
|
void MCP2521_SPI_Interface::deinitPins() {
|
|
|
|
|
|
}
|
|
|