mirror of
https://github.com/Seeed-Studio/Seeed_Arduino_CAN.git
synced 2026-07-28 04:06:45 +00:00
Extract "send to buffer X" method
This commit is contained in:
+24
-28
@@ -7,8 +7,8 @@ const struct MCP_CAN::TXBn_REGS MCP_CAN::TXB[MCP_CAN::N_TXBUFFERS] = {
|
||||
};
|
||||
|
||||
const struct MCP_CAN::RXBn_REGS MCP_CAN::RXB[N_RXBUFFERS] = {
|
||||
{MCP_RXB0CTRL, MCP_RXB0SIDH, MCP_RXB0DATA},
|
||||
{MCP_RXB1CTRL, MCP_RXB1SIDH, MCP_RXB1DATA}
|
||||
{MCP_RXB0CTRL, MCP_RXB0SIDH, MCP_RXB0DATA, CANINTF_RX0IF},
|
||||
{MCP_RXB1CTRL, MCP_RXB1SIDH, MCP_RXB1DATA, CANINTF_RX1IF}
|
||||
};
|
||||
|
||||
void MCP_CAN::startSPI() {
|
||||
@@ -427,25 +427,9 @@ MCP_CAN::ERROR MCP_CAN::initFilt(const RXF num, const bool ext, const uint32_t u
|
||||
return res;
|
||||
}
|
||||
|
||||
MCP_CAN::ERROR MCP_CAN::sendMessage(const struct can_frame *frame)
|
||||
MCP_CAN::ERROR MCP_CAN::sendMessage(const TXBn txbn, const struct can_frame *frame)
|
||||
{
|
||||
if (frame->can_dlc > CAN_MAX_CHAR_IN_MESSAGE) {
|
||||
return ERROR_FAILTX;
|
||||
}
|
||||
|
||||
const struct TXBn_REGS *txbuf = NULL;
|
||||
|
||||
for (int i=0; i<N_TXBUFFERS; i++) {
|
||||
uint8_t ctrlval = readRegister(TXB[i].CTRL);
|
||||
if ( (ctrlval & TXB_TXREQ) == 0 ) {
|
||||
txbuf = &TXB[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (txbuf == NULL) {
|
||||
return ERROR_FAILTX;
|
||||
}
|
||||
const struct TXBn_REGS *txbuf = &TXB[txbn];
|
||||
|
||||
uint8_t data[13];
|
||||
|
||||
@@ -466,6 +450,25 @@ MCP_CAN::ERROR MCP_CAN::sendMessage(const struct can_frame *frame)
|
||||
return ERROR_OK;
|
||||
}
|
||||
|
||||
MCP_CAN::ERROR MCP_CAN::sendMessage(const struct can_frame *frame)
|
||||
{
|
||||
if (frame->can_dlc > CAN_MAX_CHAR_IN_MESSAGE) {
|
||||
return ERROR_FAILTX;
|
||||
}
|
||||
|
||||
TXBn txBuffers[N_TXBUFFERS] = {TXB0, TXB1, TXB2};
|
||||
|
||||
for (int i=0; i<N_TXBUFFERS; i++) {
|
||||
const struct TXBn_REGS *txbuf = &TXB[txBuffers[i]];
|
||||
uint8_t ctrlval = readRegister(txbuf->CTRL);
|
||||
if ( (ctrlval & TXB_TXREQ) == 0 ) {
|
||||
return sendMessage(txBuffers[i], frame);
|
||||
}
|
||||
}
|
||||
|
||||
return ERROR_FAILTX;
|
||||
}
|
||||
|
||||
//MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext)
|
||||
MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, struct can_frame *frame)
|
||||
{
|
||||
@@ -499,14 +502,7 @@ MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, struct can_frame *frame)
|
||||
|
||||
readRegisterS(rxb->DATA, frame->data, dlc);
|
||||
|
||||
switch (rxbn) {
|
||||
case RXB0:
|
||||
modifyRegister(MCP_CANINTF, CANINTF_RX0IF, 0);
|
||||
break;
|
||||
case RXB1:
|
||||
modifyRegister(MCP_CANINTF, CANINTF_RX1IF, 0);
|
||||
break;
|
||||
}
|
||||
modifyRegister(MCP_CANINTF, rxb->CANINTF_RXnIF, 0);
|
||||
|
||||
return ERROR_OK;
|
||||
}
|
||||
|
||||
@@ -113,6 +113,12 @@ class MCP_CAN
|
||||
RXB1 = 1
|
||||
};
|
||||
|
||||
enum TXBn {
|
||||
TXB0 = 0,
|
||||
TXB1 = 1,
|
||||
TXB2 = 2
|
||||
};
|
||||
|
||||
enum /*class*/ MODE : uint8_t {
|
||||
MODE_NORMAL = 0x00,
|
||||
MODE_SLEEP = 0x20,
|
||||
@@ -310,6 +316,7 @@ class MCP_CAN
|
||||
REGISTER CTRL;
|
||||
REGISTER SIDH;
|
||||
REGISTER DATA;
|
||||
CANINTF CANINTF_RXnIF;
|
||||
} RXB[N_RXBUFFERS];
|
||||
|
||||
uint8_t SPICS;
|
||||
@@ -340,6 +347,7 @@ class MCP_CAN
|
||||
ERROR begin(const CAN_SPEED speedset);
|
||||
ERROR initMask(const uint8_t num, const bool ext, const uint32_t ulData);
|
||||
ERROR initFilt(const RXF num, const bool ext, const uint32_t ulData);
|
||||
ERROR sendMessage(const TXBn txbn, const struct can_frame *frame);
|
||||
ERROR sendMessage(const struct can_frame *frame);
|
||||
ERROR readMessage(const RXBn rxbn, struct can_frame *frame);
|
||||
ERROR readMessage(struct can_frame *frame);
|
||||
|
||||
Reference in New Issue
Block a user