76 lines
2.4 KiB
C++
76 lines
2.4 KiB
C++
#include <cstring>
|
|
|
|
#include "mcp2521.hpp"
|
|
#include "mcp2521_addresses.hpp"
|
|
|
|
MCP2521_Command_Interface::MCP2521_Command_Interface(
|
|
MCP2521_Hardware_Handle * hardware_handle
|
|
) {
|
|
this->hardware_handle = hardware_handle;
|
|
}
|
|
|
|
void MCP2521_Command_Interface::reset() {
|
|
hardware_handle->execute(MCP2521_OP_RESET);
|
|
}
|
|
|
|
void MCP2521_Command_Interface::read_reg(uint8_t address, uint8_t *data, size_t length) {
|
|
hardware_handle->read(MCP2521_OP_READ, data, length, address);
|
|
}
|
|
|
|
uint8_t MCP2521_Command_Interface::read_reg(uint8_t address) {
|
|
return hardware_handle->read(MCP2521_OP_READ, address);
|
|
}
|
|
|
|
void MCP2521_Command_Interface::read_rx_buf(MCP2521_RX_BUFFER buffer, MCP2521_BUFFER_TYPE type, uint8_t *data, size_t length) {
|
|
uint8_t address = (buffer << 1) | (type << 2);
|
|
hardware_handle->read(MCP2521_OP_READ_RX_BUFFER | address, data, length);
|
|
}
|
|
|
|
void MCP2521_Command_Interface::write_reg(uint8_t address, uint8_t *data, size_t length) {
|
|
hardware_handle->write(MCP2521_OP_WRITE, data, length, address);
|
|
}
|
|
|
|
void MCP2521_Command_Interface::write_reg(uint8_t address, uint8_t data) {
|
|
hardware_handle->write(MCP2521_OP_WRITE, data, address);
|
|
}
|
|
|
|
void MCP2521_Command_Interface::write_tx_buf(MCP2521_TX_BUFFER buffer, MCP2521_BUFFER_TYPE type, uint8_t *data, size_t length) {
|
|
uint8_t address = buffer | (type << 2);
|
|
hardware_handle->write(MCP2521_OP_LOAD_TX_BUFFER | address, data, length);
|
|
}
|
|
|
|
void MCP2521_Command_Interface::request_to_send(bool txb2, bool txb1, bool txb0) {
|
|
uint8_t data = (txb2 << 2) | (txb1 << 1) | txb0;
|
|
hardware_handle->execute(MCP2521_OP_RTS | data);
|
|
}
|
|
|
|
void MCP2521_Command_Interface::request_to_send(MCP2521_TX_BUFFER buffer) {
|
|
uint8_t mask = 0;
|
|
|
|
switch (buffer) {
|
|
case MCP2521_TX_BUFFER::TXB0:
|
|
mask = 0b001;
|
|
break;
|
|
case MCP2521_TX_BUFFER::TXB1:
|
|
mask = 0b010;
|
|
break;
|
|
case MCP2521_TX_BUFFER::TXB2:
|
|
mask = 0b100;
|
|
break;
|
|
}
|
|
|
|
hardware_handle->execute(MCP2521_OP_RTS | mask);
|
|
}
|
|
|
|
uint8_t MCP2521_Command_Interface::read_status() {
|
|
return hardware_handle->read(MCP2521_OP_READ_STATUS);
|
|
}
|
|
|
|
uint8_t MCP2521_Command_Interface::read_rx_status() {
|
|
return hardware_handle->read(MCP2521_OP_RX_STATUS);
|
|
}
|
|
|
|
void MCP2521_Command_Interface::bit_modify(uint8_t address, uint8_t mask, uint8_t data) {
|
|
uint8_t data_array[3] = {address, mask, data};
|
|
hardware_handle->write(MCP2521_OP_BIT_MODIFY, data_array, 3);
|
|
} |