Browse Source

AP_Periph: use HAL CAN Drivers instead of ChibiOS's

zr-v5.1
Siddharth Purohit 5 years ago committed by Peter Barker
parent
commit
5ab6916a41
  1. 75
      Tools/AP_Periph/can.cpp
  2. 1
      Tools/AP_Periph/wscript

75
Tools/AP_Periph/can.cpp

@ -52,6 +52,7 @@
#include "../AP_Bootloader/app_comms.h" #include "../AP_Bootloader/app_comms.h"
#include <AP_HAL/utility/RingBuffer.h> #include <AP_HAL/utility/RingBuffer.h>
#include <AP_Common/AP_FWVersion.h> #include <AP_Common/AP_FWVersion.h>
#include <AP_HAL_ChibiOS/CANIface.h>
#include "i2c.h" #include "i2c.h"
#include <utility> #include <utility>
@ -79,6 +80,8 @@ static uint8_t transfer_id;
#define CAN_PROBE_CONTINUOUS 0 #define CAN_PROBE_CONTINUOUS 0
#endif #endif
static ChibiOS::CANIface can_iface(0);
/* /*
* Variables used for dynamic node ID allocation. * Variables used for dynamic node ID allocation.
* RTFM at http://uavcan.org/Specification/6._Application_level_functions/#dynamic-node-id-allocation * RTFM at http://uavcan.org/Specification/6._Application_level_functions/#dynamic-node-id-allocation
@ -780,13 +783,12 @@ static void processTx(void)
{ {
static uint8_t fail_count; static uint8_t fail_count;
for (const CanardCANFrame* txf = NULL; (txf = canardPeekTxQueue(&canard)) != NULL;) { for (const CanardCANFrame* txf = NULL; (txf = canardPeekTxQueue(&canard)) != NULL;) {
CANTxFrame txmsg {}; AP_HAL::CANFrame txmsg {};
txmsg.DLC = txf->data_len; txmsg.dlc = txf->data_len;
memcpy(txmsg.data8, txf->data, 8); memcpy(txmsg.data, txf->data, 8);
txmsg.EID = txf->id & CANARD_CAN_EXT_ID_MASK; txmsg.id = (txf->id | AP_HAL::CANFrame::FlagEFF);
txmsg.IDE = 1; // push message with 1s timeout
txmsg.RTR = 0; if (can_iface.send(txmsg, AP_HAL::micros64() + 1000000, 0) > 0) {
if (canTransmit(&CAND1, CAN_ANY_MAILBOX, &txmsg, TIME_IMMEDIATE) == MSG_OK) {
canardPopTxQueue(&canard); canardPopTxQueue(&canard);
fail_count = 0; fail_count = 0;
} else { } else {
@ -802,41 +804,25 @@ static void processTx(void)
} }
} }
static ObjectBuffer<CANRxFrame> rxbuffer{32};
static void can_rxfull_cb(CANDriver *canp, uint32_t flags)
{
CANRxFrame rxmsg;
chSysLockFromISR();
while (canTryReceiveI(canp, CAN_ANY_MAILBOX, &rxmsg) == false) {
rxbuffer.push_force(rxmsg);
}
chSysUnlockFromISR();
}
static void processRx(void) static void processRx(void)
{ {
CANRxFrame rxmsg; AP_HAL::CANFrame rxmsg;
while (true) { while (true) {
bool have_msg; bool read_select = true;
chSysLock(); bool write_select = false;
have_msg = rxbuffer.pop(rxmsg); can_iface.select(read_select, write_select, nullptr, 0);
chSysUnlock(); if (!read_select) {
if (!have_msg) {
break; break;
} }
CanardCANFrame rx_frame {}; CanardCANFrame rx_frame {};
//palToggleLine(HAL_GPIO_PIN_LED); //palToggleLine(HAL_GPIO_PIN_LED);
uint64_t timestamp;
const uint64_t timestamp = AP_HAL::micros64(); AP_HAL::CANIface::CanIOFlags flags;
memcpy(rx_frame.data, rxmsg.data8, 8); can_iface.receive(rxmsg, timestamp, flags);
rx_frame.data_len = rxmsg.DLC; memcpy(rx_frame.data, rxmsg.data, 8);
if(rxmsg.IDE) { rx_frame.data_len = rxmsg.dlc;
rx_frame.id = CANARD_CAN_FRAME_EFF | rxmsg.EID; rx_frame.id = rxmsg.id;
} else {
rx_frame.id = rxmsg.SID;
}
canardHandleRxFrame(&canard, &rx_frame, timestamp); canardHandleRxFrame(&canard, &rx_frame, timestamp);
} }
} }
@ -1030,26 +1016,7 @@ void AP_Periph_FW::can_start()
node_status.mode = UAVCAN_PROTOCOL_NODESTATUS_MODE_INITIALIZATION; node_status.mode = UAVCAN_PROTOCOL_NODESTATUS_MODE_INITIALIZATION;
node_status.uptime_sec = AP_HAL::millis() / 1000U; node_status.uptime_sec = AP_HAL::millis() / 1000U;
static CANConfig cancfg = { can_iface.init(1000000, AP_HAL::CANIface::NormalMode);
CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP,
0
};
// calculate optimal CAN timings given PCLK1 and baudrate
CanardSTM32CANTimings timings {};
canardSTM32ComputeCANTimings(STM32_PCLK1, unsigned(g.can_baudrate), &timings);
cancfg.btr = CAN_BTR_SJW(0) |
CAN_BTR_TS2(timings.bit_segment_2-1) |
CAN_BTR_TS1(timings.bit_segment_1-1) |
CAN_BTR_BRP(timings.bit_rate_prescaler-1);
if (g.can_node >= 0 && g.can_node < 128) {
PreferredNodeID = g.can_node;
}
CAND1.rxfull_cb = can_rxfull_cb;
canStart(&CAND1, &cancfg);
canardInit(&canard, (uint8_t *)canard_memory_pool, sizeof(canard_memory_pool), canardInit(&canard, (uint8_t *)canard_memory_pool, sizeof(canard_memory_pool),
onTransferReceived, shouldAcceptTransfer, NULL); onTransferReceived, shouldAcceptTransfer, NULL);

1
Tools/AP_Periph/wscript

@ -24,6 +24,7 @@ def build(bld):
'AP_Param', 'AP_Param',
'StorageManager', 'StorageManager',
'AP_FlashStorage', 'AP_FlashStorage',
'AP_RAMTRON',
'AP_GPS', 'AP_GPS',
'AP_SerialManager', 'AP_SerialManager',
'AP_RTC', 'AP_RTC',

Loading…
Cancel
Save