You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Hi, I am trying to use your code for a simple application on the STM32 listed in the title. I have used your SimpleCan.cpp and SimpleCan.h as supporting libraries, unaltered.
However, after debugging the code below, I have found that the program gets stuck in the init function of the can instance "can1" (in the startCan() function.
I was wondering if you could please tell me why this could be happening?
I apologise because I cannot give you any serial outputs. I am programming the STM32 with a SWD interface through an ST-Link, but the serial prints aren't being received through the SWDIO pin for some reason.
Sketch:
// Written for STM32G4C6T6
#include <Arduino.h>
#include <SimpleCan.h>
#include <pinDef.h>
#include <IWatchdog.h>
#define HAL_FDCAN_MODULE_ENABLED
#define debug true // set to true to enable debug messages
// A0 to A14, D0 to D4
const int adcPins[15] = {A0, A1, A2, A3, A4, A5 , A6, A7, A8, A9, A10, A11, A12, A13, A14};
const int digitalPins[5] = {D0, D1, D2, D3, D4};
const unsigned int LED = PB9;
uint8_t values[20];
SimpleCan can1(NC, NC);
void setup() {
// set up LED
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
// start watchdog
IWatchdog.begin(5000000); // 5 second watchdog
if (IWatchdog.isReset(true)) {
debugPrint("Watchdog reset detected");
digitalWrite(LED, HIGH);
}
// set up ADCs and digital pins
for (int i = 0; i < 20; i++) {
pinMode(adcPins[i], INPUT_ANALOG);
}
for (int i = 0; i < 5; i++) {
pinMode(digitalPins[i], INPUT);
}
// Blink twice
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);
delay(200);
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);
delay(2000);
// start serial for debugging
if (debug) {
Serial.begin(115200);
}
// start CAN bus
startCan(); // Code getting stuck within this function<--------------------------------------------------------------------
digitalWrite(LED, LOW);
delay(100);
}
void loop() {
// put your main code here, to run repeatedly:
for (int i = 0; i < 20; i++) {
values[i] = map(analogRead(adcPins[i]), 0, 1024, 0, 12000); // map ADC to V*1000 value
}
for (int i = 0; i < 5; i++) {
values[i] = digitalRead(digitalPins[i]);
}
// send CAN messages
sendCan(0);
sendCan(1);
sendCan(2);
sendCan(3);
sendCan(4);
IWatchdog.reload();
delay(10);
}
void startCan() {
// configure the CAN bus and start comunications
can1.init(CanSpeed::Kbit250); // Code specifically getting stuck within this function<------------------------------------------
if (can1.start () != HAL_OK) {
debugPrint("CAN bus failed to start");
digitalWrite(LED, HIGH);
// wait 1 second and try again
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
startCan();
} else {
debugPrint("CAN bus started");
}
}
void debugPrint(char* message) {
if (debug) {
Serial.println(message);
}
}
void sendCan(unsigned char messageNumber) {
// send it on the CAN bus
FDCAN_TxHeaderTypeDef TxHeader;
uint8_t TxData[8];
TxHeader.Identifier = 0x300 + messageNumber;
TxHeader.IdType = FDCAN_STANDARD_ID;
TxHeader.TxFrameType = FDCAN_DATA_FRAME;
TxHeader.DataLength = FDCAN_DLC_BYTES_64;
TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
TxHeader.MessageMarker = 0;
TxData[0] = lowByte(values[0 + messageNumber * 4]);
TxData[1] = highByte(values[0 + messageNumber * 4]);
TxData[2] = lowByte(values[1 + messageNumber * 4]);
TxData[3] = highByte(values[1 + messageNumber * 4]);
TxData[4] = lowByte(values[2 + messageNumber * 4]);
TxData[5] = highByte(values[2 + messageNumber * 4]);
TxData[6] = lowByte(values[3 + messageNumber * 4]);
TxData[7] = highByte(values[3 + messageNumber * 4]);
if (debug) {
Serial.print("Sending CAN message ");
Serial.print(messageNumber);
Serial.print(" with data: ");
Serial.print(TxData[0]);
Serial.print(" ");
Serial.print(TxData[1]);
Serial.print(" ");
Serial.print(TxData[2]);
Serial.print(" ");
Serial.print(TxData[3]);
Serial.print(" ");
Serial.print(TxData[4]);
Serial.print(" ");
Serial.print(TxData[5]);
Serial.print(" ");
Serial.print(TxData[6]);
Serial.print(" ");
Serial.println(TxData[7]);
}
if (can1.addMessageToTxFifoQ(&TxHeader, TxData) == HAL_OK) {
debugPrint("Ok.");
} else {
debugPrint("Failed.");
digitalWrite(LED, HIGH);
}
}
The text was updated successfully, but these errors were encountered:
Hi, I am trying to use your code for a simple application on the STM32 listed in the title. I have used your SimpleCan.cpp and SimpleCan.h as supporting libraries, unaltered.
However, after debugging the code below, I have found that the program gets stuck in the init function of the can instance "can1" (in the startCan() function.
I was wondering if you could please tell me why this could be happening?
I apologise because I cannot give you any serial outputs. I am programming the STM32 with a SWD interface through an ST-Link, but the serial prints aren't being received through the SWDIO pin for some reason.
Sketch:
The text was updated successfully, but these errors were encountered: