Compare commits
5 Commits
8bc2f9eeac
...
5e82878083
| Author | SHA1 | Date | |
|---|---|---|---|
| 5e82878083 | |||
| 92c0628c62 | |||
| 7f67fc6abe | |||
| ea5203b67d | |||
| 14c80dc33c |
@ -5,7 +5,7 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
/* CAN bus driver for BLDC motor controllers (Issue #597)
|
||||
* CAN2 on PB12 (RX, AF9) / PB13 (TX, AF9) at 500 kbps
|
||||
* CAN1 on PB8 (RX, AF9) / PB9 (TX, AF9) at 500 kbps (Issue #676 remap)
|
||||
* APB1 = 54 MHz: PSC=6, BS1=13tq, BS2=4tq, SJW=1tq → 18 tq/bit = 500 kbps
|
||||
*/
|
||||
|
||||
|
||||
@ -257,8 +257,9 @@
|
||||
#define GIMBAL_PAN_LIMIT_DEG 180.0f // pan soft limit (deg each side)
|
||||
#define GIMBAL_TILT_LIMIT_DEG 90.0f // tilt soft limit (deg each side)
|
||||
|
||||
// --- CAN Bus Driver (Issue #597) ---
|
||||
// CAN2 on PB12 (RX, AF9) / PB13 (TX, AF9) — repurposes SPI2/OSD pins (unused on balance bot)
|
||||
// --- CAN Bus Driver (Issue #597, remapped Issue #676) ---
|
||||
// CAN1 on PB8 (RX, AF9) / PB9 (TX, AF9) — SCL/SDA pads on Mamba F722S MK2
|
||||
// I2C1 freed: BME280 moved to I2C2 (PB10/PB11); PB8/PB9 repurposed for CAN1
|
||||
#define CAN_RPM_SCALE 10 // motor_cmd to RPM: 1 cmd count = 10 RPM
|
||||
#define CAN_TLM_HZ 1u // JLINK_TLM_CAN_STATS transmit rate (Hz)
|
||||
|
||||
|
||||
@ -1,6 +1,11 @@
|
||||
/* CAN bus driver for BLDC motor controllers (Issue #597)
|
||||
* CAN2 on PB12 (RX, AF9) / PB13 (TX, AF9) at 500 kbps
|
||||
* Filter bank 14 (first CAN2 bank; SlaveStartFilterBank=14)
|
||||
* CAN1 on PB8 (RX, AF9) / PB9 (TX, AF9) at 500 kbps (Issue #676 remap)
|
||||
* Filter bank 0 (CAN1 master; SlaveStartFilterBank=14)
|
||||
*
|
||||
* NOTE: Mamba F722S MK2 does not expose PB12/PB13 externally.
|
||||
* Waveshare CAN module wired to SCL pad (PB8 = CAN1_RX) and
|
||||
* SDA pad (PB9 = CAN1_TX). I2C1 is free (BME280 moved to I2C2).
|
||||
* CAN1 uses AF9 on PB8/PB9 — no conflict with other active peripherals.
|
||||
*/
|
||||
|
||||
#include "can_driver.h"
|
||||
@ -15,24 +20,22 @@ static can_std_frame_cb_t s_std_cb = NULL;
|
||||
|
||||
void can_driver_init(void)
|
||||
{
|
||||
/* CAN2 requires CAN1 master clock for shared filter RAM */
|
||||
__HAL_RCC_CAN1_CLK_ENABLE();
|
||||
__HAL_RCC_CAN2_CLK_ENABLE();
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
|
||||
/* PB12 = CAN2_RX, PB13 = CAN2_TX, AF9 */
|
||||
/* PB8 = CAN1_RX, PB9 = CAN1_TX, AF9 (Issue #676) */
|
||||
GPIO_InitTypeDef gpio = {0};
|
||||
gpio.Pin = GPIO_PIN_12 | GPIO_PIN_13;
|
||||
gpio.Pin = GPIO_PIN_8 | GPIO_PIN_9;
|
||||
gpio.Mode = GPIO_MODE_AF_PP;
|
||||
gpio.Pull = GPIO_NOPULL;
|
||||
gpio.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
gpio.Alternate = GPIO_AF9_CAN2;
|
||||
gpio.Alternate = GPIO_AF9_CAN1;
|
||||
HAL_GPIO_Init(GPIOB, &gpio);
|
||||
|
||||
/* 500 kbps @ APB1=54 MHz: PSC=6, BS1=13tq, BS2=4tq, SJW=1tq
|
||||
* bit_time = 6 × (1+13+4) / 54000000 = 2 µs → 500 kbps
|
||||
* sample point = (1+13)/18 = 77.8% */
|
||||
s_can.Instance = CAN2;
|
||||
s_can.Instance = CAN1;
|
||||
s_can.Init.Prescaler = CAN_PRESCALER;
|
||||
s_can.Init.Mode = CAN_MODE_NORMAL;
|
||||
s_can.Init.SyncJumpWidth = CAN_SJW_1TQ;
|
||||
@ -50,12 +53,11 @@ void can_driver_init(void)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Filter bank 14: 32-bit mask, FIFO0, accept ALL standard 11-bit frames.
|
||||
* FilterIdHigh=0, FilterMaskHigh=0 → mask=0 passes every standard ID.
|
||||
* FilterIdLow[2]=0 (IDE=0) → only standard frames; mask bit[2]=0 → don't
|
||||
* check IDE bit, but standard frames have IDE=0 by design so all pass. */
|
||||
/* Filter bank 0: 32-bit mask, FIFO0, accept ALL standard 11-bit frames.
|
||||
* CAN1 is master (SlaveStartFilterBank=14). FilterIdHigh=0, MaskHigh=0
|
||||
* → mask=0 passes every standard ID. Orin std-frame commands land here. */
|
||||
CAN_FilterTypeDef flt = {0};
|
||||
flt.FilterBank = 14u;
|
||||
flt.FilterBank = 0u;
|
||||
flt.FilterMode = CAN_FILTERMODE_IDMASK;
|
||||
flt.FilterScale = CAN_FILTERSCALE_32BIT;
|
||||
flt.FilterIdHigh = 0u;
|
||||
|
||||
12
src/main.c
12
src/main.c
@ -197,9 +197,9 @@ int main(void) {
|
||||
/* Init Jetson serial binary protocol on USART1 (PB6/PB7) at 921600 baud */
|
||||
jlink_init();
|
||||
|
||||
/* Init CAN2 bus — PB12/PB13, 500 kbps.
|
||||
* Register VESC and Orin CAN callbacks BEFORE can_driver_init() so filter
|
||||
* banks are configured with both callbacks ready. (Issue #674) */
|
||||
/* Init CAN1 bus — PB8/PB9, 500 kbps (Issues #597/#676/#674).
|
||||
* Register callbacks BEFORE can_driver_init() so both are ready when
|
||||
* filter banks activate. */
|
||||
can_driver_set_ext_cb(vesc_can_on_frame); /* VESC STATUS → FIFO1 */
|
||||
can_driver_set_std_cb(orin_can_on_frame); /* Orin cmds → FIFO0 */
|
||||
can_driver_init();
|
||||
@ -396,7 +396,7 @@ int main(void) {
|
||||
jlink_state.arm_req = 0u;
|
||||
if (!safety_remote_estop_active() &&
|
||||
mpu6000_is_calibrated() &&
|
||||
bal.state == BALANCE_DISARMED && fabsf(bal.pitch_deg) < 10.0f) {
|
||||
bal.state == BALANCE_DISARMED && fabsf(bal.pitch_deg) < 20.0f) {
|
||||
safety_arm_start(now);
|
||||
}
|
||||
}
|
||||
@ -581,7 +581,7 @@ int main(void) {
|
||||
/* Rising edge: start arm hold (motors enable after ARMING_HOLD_MS) */
|
||||
if (!safety_remote_estop_active() &&
|
||||
mpu6000_is_calibrated() &&
|
||||
bal.state == BALANCE_DISARMED && fabsf(bal.pitch_deg) < 10.0f) {
|
||||
bal.state == BALANCE_DISARMED && fabsf(bal.pitch_deg) < 20.0f) {
|
||||
safety_arm_start(now);
|
||||
}
|
||||
}
|
||||
@ -601,7 +601,7 @@ int main(void) {
|
||||
cdc_arm_request = 0;
|
||||
if (!safety_remote_estop_active() &&
|
||||
mpu6000_is_calibrated() &&
|
||||
bal.state == BALANCE_DISARMED && fabsf(bal.pitch_deg) < 10.0f) {
|
||||
bal.state == BALANCE_DISARMED && fabsf(bal.pitch_deg) < 20.0f) {
|
||||
safety_arm_start(now);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user