Страница 1 из 1
Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Чт дек 09, 2021 01:40:15
anatoliydenisenko44
Всем привет. Возможно я очередной спамер, но информации нужной мне не нашел на просторах интернет. И спустя 3 дня кручения и танцев с бубном - прошу о помощи.
В общем есть плата nucleo-144 h743zi2. И в ней есть CAN интерфейс, через который мне нужно реализовать протокол передачи.
В связке Uno + mcp2515 протокол был отработан и все работает как часы. Теперь надо все перенести на nucleo, и что не маловажно - это использование Arduino IDE.
В общем я ходил смотрел включал выключал порты на которых есть can интерфейс, но ничего не получилось.
Подумал я что надо бы попробовать подключить модуль mcp2515 через SPI. И тут встал вопрос а как же эти порты SPI мне обьявить в той же Arduino IDE?
Может у кого то есть примеры для других камней? или есть подсказка как и что именно с этой платой.
Я знаю что, вы скажите - пиши на STM32CUBEIde ( ребята, пока я в процессе обучения, сложный он, менее понятный)
Код: Выделить всё
#include <SPI.h>
#include <mcp2515.h>
#define MOSI PB5
#define MISO PB4
#define SCLK PB3
#define ledPin PC13
#define buttonPin PA0
byte data;
struct can_frame canMsg;
struct can_frame canMsg1;
struct can_frame canMsg2;
MCP2515 mcp2515(PA4);
void setup ()
{
while (!Serial);
Serial.begin(115200);
mcp2515.reset();
mcp2515.setBitrate(CAN_1000KBPS, MCP_8MHZ);
mcp2515.setNormalMode ();
//mcp2515.setLoopbackMode();
//mcp2515.setListenOnlyMode();
Serial.println("Example: Write to CAN");
canMsg1.can_id = 0x142;
canMsg1.can_dlc = 8;
canMsg1.data[0] = 0x88; //старт мотор
canMsg1.data[1] = 0x00;
canMsg1.data[2] = 0x00;
canMsg1.data[3] = 0x00;
canMsg1.data[4] = 0x00;
canMsg1.data[5] = 0x00;
canMsg1.data[6] = 0x00;
canMsg1.data[7] = 0x00;
canMsg2.can_id = 0x142;
canMsg2.can_dlc = 8;
canMsg2.data[0] = 0xA1;
canMsg2.data[1] = 0x00;
canMsg2.data[2] = 0x00;
canMsg2.data[3] = 0x00;
canMsg2.data[4] = 0x00;
canMsg2.data[5] = 0x50;
canMsg2.data[6] = 0x00;
canMsg2.data[7] = 0x00;
mcp2515.sendMessage(&canMsg1);
}
void loop(void)
{
mcp2515.sendMessage(&canMsg2);
Serial.println("Messages sent");
if (mcp2515.readMessage(&canMsg1) == MCP2515::ERROR_OK) {
Serial.print(canMsg.can_id, HEX); // print ID
Serial.print(" ");
for (int i = 0; i<10; i++) { // print the data
Serial.print(canMsg.data[i],HEX);
Serial.print(" ");
}
Serial.println();
}
delay(1000);
}
Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Чт дек 09, 2021 08:25:47
Dimon456
Давно хотел попробовать
Спойлер


Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Чт дек 09, 2021 08:35:49
anatoliydenisenko44
Та, как поставить платы в редактор я знаю. У меня больше вопрос как работать с портами а точнее с интерфейсами самой платы, psi, can bus.
Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Чт дек 09, 2021 08:52:18
Dimon456
Это же ардуино, там должно быть все заточено, должны быть хоть какие-то примеры.
По идеи ваш, выше приведенный, код должен собраться под любую плату.
У мну таких плат нету, есть f030 и f100, в списке поддерживаемых их нет, и пытаться проверять не буду.
Установщик ардуино должен скачать компилятор gcc_arm, одним словом, проверяйте сами.
Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Чт дек 09, 2021 09:07:32
oleg110592
[uquote="anatoliydenisenko44",url="/forum/viewtopic.php?p=4137854#p4137854"]Подумал я что надо бы попробовать подключить модуль mcp2515 через SPI. И тут встал вопрос а как же эти порты SPI мне обьявить в той же Arduino IDE?[/uquote]
вики страница АПИ stm32duino:
https://github.com/stm32duino/wiki/wiki/API#spiКод: Выделить всё
#include <SPI.h>
// MOSI MISO SCLK
SPIClass SPI3(PC12, PC11, PC10);
void setup() {
SPI3.begin(2); //Enables the SPI3 instance with default settings and attaches the CS pin
SPI3.beginTransaction(1, settings); //Attaches another CS pin and configure the SPI3 instance with other settings
SPI3.transfer(2, 0x52); //Transfers data to the first device
SPI3.transfer(1, 0xA4); //Transfers data to the second device. The SPI3 instance is configured with the right settings
SPI3.end() //SPI3 instance is disabled
}
Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Чт дек 09, 2021 14:18:17
Dimon456
Список поддерживаемых STM32 довольно широк
Спойлер

а дальше полный бред, каким он был, таким и остался.
Очень очень долго сборка идет, можно два раза поспать.
Ардуиновский Blink под STM32F100RB в минимальной конфигурации
Скетч использует 7544 байт (5%) памяти устройства. Всего доступно 131072 байт.
Глобальные переменные используют 868 байт (10%) динамической памяти, оставляя 7324 байт для локальных переменных. Максимум: 8192 байт.
Спойлер
Код: Выделить всё
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Такой код
Спойлер
Код: Выделить всё
void setup ()
{
Serial.begin (9600); // Задаем скорость обмена uart-порта 9600
Serial.println ("Hello World!"); // Пишем в консоль "Hello World!"
}
void loop ()
{
}
Скетч использует 7692 байт (5%) памяти устройства. Всего доступно 131072 байт.
Глобальные переменные используют 868 байт (10%) динамической памяти, оставляя 7324 байт для локальных переменных. Максимум: 8192 байт.
В работе на реальном устройстве не проверялось, на на выходе создается hex bin elf map куча объектников, размер bin последнего кода 8176 байта.
Прямая загрузка из Ардуино иде не проверялась, так как требуется еще установить stm32cubeprg.
Вот кусок из map файла
Спойлер
Код: Выделить всё
0x20002000 _estack = (ORIGIN (RAM) + LENGTH (RAM))
0x00000200 _Min_Heap_Size = 0x200
0x00000400 _Min_Stack_Size = 0x400
.isr_vector 0x08000000 0x1d0
0x08000000 . = ALIGN (0x4)
*(.isr_vector)
.isr_vector 0x08000000 0x1d0 C:\Users\xxx\AppData\Local\Temp\arduino_cache_441161\core\core_cd72577ee8b54c7a4a749e3b95957d2b.a(startup_stm32yyxx.S.o)
0x08000000 g_pfnVectors
0x080001d0 . = ALIGN (0x4)
.text 0x080001d0 0x1b84
0x080001d0 . = ALIGN (0x4)
*(.text)
.text 0x080001d0 0x1510 C:\Users\xxx\AppData\Local\Temp\sketch_dec09a.ino.elf.c7TRF4.ltrans0.ltrans.o
0x080013bc _sbrk
0x080013f8 _close
0x080013fe _fstat
0x08001408 _isatty
0x0800140c _lseek
0x08001410 _read
0x08001414 _exit
0x08001416 _kill
0x08001428 _getpid
0x0800142c SysTick_Handler
0x0800143c SystemInit
0x0800148c USART1_IRQHandler
0x080014a4 USART2_IRQHandler
0x080014c0 USART3_IRQHandler
0x080014dc EXTI0_IRQHandler
0x080014e0 EXTI1_IRQHandler
0x080014e4 EXTI2_IRQHandler
0x080014e8 EXTI3_IRQHandler
0x080014ec EXTI4_IRQHandler
0x080014f0 EXTI9_5_IRQHandler
0x08001506 EXTI15_10_IRQHandler
0x0800151e TIM1_UP_TIM16_IRQHandler
0x08001520 TIM1_CC_IRQHandler
0x08001522 TIM2_IRQHandler
0x08001524 TIM3_IRQHandler
0x08001526 TIM4_IRQHandler
0x08001528 TIM6_DAC_IRQHandler
0x0800152a TIM7_IRQHandler
0x0800152c TIM1_BRK_TIM15_IRQHandler
0x0800152e TIM1_TRG_COM_TIM17_IRQHandler
0x08001530 _write
0x080016d4 __cxa_pure_virtual
0x080016d6 operator delete(void*)
0x080016da operator delete(void*, unsigned int)
*(.text*)
.text.__do_global_dtors_aux
0x080016e0 0x24 c:/users/xxx/appdata/local/arduino15/packages/stmicroelectronics/tools/xpack-arm-none-eabi-gcc/10.2.1-1.1/bin/../lib/gcc/arm-none-eabi/10.2.1/thumb/v7-m/nofp/crtbegin.o
.text.frame_dummy
0x08001704 0x1c c:/users/xxx/appdata/local/arduino15/packages/stmicroelectronics/tools/xpack-arm-none-eabi-gcc/10.2.1-1.1/bin/../lib/gcc/arm-none-eabi/10.2.1/thumb/v7-m/nofp/crtbegin.o
.text.startup 0x08001720 0x3ec C:\Users\xxx\AppData\Local\Temp\sketch_dec09a.ino.elf.c7TRF4.ltrans0.ltrans.o
0x080019a0 main
.text.exit 0x08001b0c 0x24 C:\Users\xxx\AppData\Local\Temp\sketch_dec09a.ino.elf.c7TRF4.ltrans0.ltrans.o
.text.Reset_Handler
0x08001b30 0x48 C:\Users\xxx\AppData\Local\Temp\arduino_cache_441161\core\core_cd72577ee8b54c7a4a749e3b95957d2b.a(startup_stm32yyxx.S.o)
0x08001b30 Reset_Handler
.text.Default_Handler
0x08001b78 0x2 C:\Users\xxx\AppData\Local\Temp\arduino_cache_441161\core\core_cd72577ee8b54c7a4a749e3b95957d2b.a(startup_stm32yyxx.S.o)
0x08001b78 RTC_Alarm_IRQHandler
0x08001b78 DebugMon_Handler
0x08001b78 HardFault_Handler
0x08001b78 PVD_IRQHandler
0x08001b78 PendSV_Handler
0x08001b78 NMI_Handler
0x08001b78 UsageFault_Handler
0x08001b78 SPI1_IRQHandler
0x08001b78 TAMPER_IRQHandler
0x08001b78 DMA1_Channel4_IRQHandler
0x08001b78 ADC1_IRQHandler
0x08001b78 RTC_IRQHandler
0x08001b78 DMA1_Channel7_IRQHandler
0x08001b78 I2C1_EV_IRQHandler
0x08001b78 DMA1_Channel6_IRQHandler
0x08001b78 RCC_IRQHandler
0x08001b78 DMA1_Channel1_IRQHandler
0x08001b78 Default_Handler
0x08001b78 CEC_IRQHandler
0x08001b78 MemManage_Handler
0x08001b78 SVC_Handler
0x08001b78 DMA1_Channel5_IRQHandler
0x08001b78 DMA1_Channel3_IRQHandler
0x08001b78 WWDG_IRQHandler
0x08001b78 DMA1_Channel2_IRQHandler
0x08001b78 FLASH_IRQHandler
0x08001b78 BusFault_Handler
0x08001b78 I2C1_ER_IRQHandler
И дополнительно +1,3 Гигабайта мусора на жестком диске.
Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Чт дек 09, 2021 15:32:44
Ярослав555
[uquote="Dimon456",url="/forum/viewtopic.php?p=4138109#p4138109"]а дальше полный бред, каким он был, таким и остался.
Очень очень долго сборка идет, можно два раза поспать.[/uquote]
Недавно мне пришлось делать проект под нордик через ардуину - захотел клиент и все тут. Я проклял все на свете, за то что связался с этим говном.
Во первых отладка - она типа есть, но еще типа нет. Как-то удалось подцепить джилинк и завести вижуал студию.
Очередной сюрприз - оптимизация жрет код, невозможно тлаживать. Иду без задней мысли в настройки, отрубаю опитимизацию и приехали! Эти дебилы так написали свои говноино библиотеки, что они без оптимизации не собираются! Потому что есть нереализованные виртуальные методы в класах. Когда работает оптимизацмя - они режутся и все вроде ок. Но стоит отрубить это все - и приехали.
Почему долго собирает? Потому что это говно (вижуал студия) сканирует библиотеки каждый раз при сборке.
Теперь про кан и H743. Чел, ты вообще даташит открывал? Ты видел структуру чипа, сколько там разных банок памяти, сколько там шин, что там есть кеш, какое тактирование сложное? Что там вообще-то не CAN, а FDCAN?
У меня есть проект на H743 с каном. И оно работает.
Не выделывайся - ставь CubeIde. Делай проект через визард - среда скачает РЕПОЗИТОРИЙ. И там в репозитории кроме библиотек будут рабочие ПРИМЕРЫ. Если у тебя задача не сложная, можно прямо взять готовый пример за основу и слегка переделать.
Более того, для таких чуваков даже сделали специальный ИМПОРТ примеров из репозитория куда надо. Файл-Импорт-Дженерал-Импорт стм32куб экзампл.
Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Чт дек 09, 2021 18:31:03
anatoliydenisenko44
Я платы установил, поддержку нужной мне stm32 все есть. На плате Uno + mcp2515 я протокол для управления реализовал, но там просто у ардуины один SPI и я в него.
И вот встал вопрос что бы реализовать это все для stm32 и arduino ide.
И я подключаю модуль mcp2515 в разметку по пинам SPI1

И что мне делать дальше что бы это чудо начало работать?
Код: Выделить всё
#include <SPI.h>
#include <mcp2515.h>
#include <ros2arduino.h>
#include <user_config.h>
//#define VSPI_CLOCK_PIN 39 //4
//#define VSPI_MOSI_PIN 36 // 15
//#define VSPI_MISO_PIN 38//32
#define VSPI_CS_MCP2515_PIN 5//34//25
#define RMD_X6_READ_PID_DATA (0x30)
#define RMD_X6_WRITE_PID_TO_RAM (0x31)
#define RMD_X6_WRITE_PID_TO_ROM (0x32)
#define RMD_X6_READ_ACCELERATION (0x33)
#define RMD_X6_WRITE_ACCELERATION (0x34)
#define RMD_X6_READ_ENCODE_DATA (0x90)
#define RMD_X6_WRITE_ENCODER_OFFSET (0x91)
#define RMD_X6_WRITE_CURRENT_POSITION (0x19)
#define RMD_X6_READ_MULTI_TURNS_ANGLE (0x92)
#define RMD_X6_READ_SINGLE_CIRCLE_ANGLE (0x94)
#define RMD_X6_READ_MOTOR_STATUS (0x9A)
#define RMD_X6_CLEAR_MOTOR_ERROR_FLAG (0x9B)
#define RMD_X6_READ_MOTOR_STATUS_2 (0x9C)
#define RMD_X6_READ_MOTOR_STATUS_3 (0x9D)
#define RMD_X6_MOTOR_OFF (0x80)
#define RMD_X6_MOTOR_STOP (0x81)
#define RMD_X6_MOTOR_RUNNING (0x88)
#define RMD_X6_TORQUE_CLOSED_LOOP (0xA1)
#define RMD_X6_SPEED_CLOSED_LOOP (0xA2)
#define RMD_X6_POSITION_CTRL_1 (0xA3)
#define RMD_X6_POSITION_CTRL_2 (0xA4)
#define RMD_X6_POSITION_CTRL_3 (0xA5)
#define RMD_X6_POSITION_CTRL_4 (0xA6)
#define RMD_X6_POSITION (0xA7)
#define RMD_X6_STATUS_NULL (0x00)
struct can_frame canMsg;
MCP2515 can(VSPI_CS_MCP2515_PIN); //10
//RMD_X6_CAN_MSG_ID
unsigned long leftFrontWheel = 0x142; // передний левый
unsigned long leftBackWheel = 0x141; // задний левый
unsigned long rightFrontWheel = 0x144; // передний правый
unsigned long rightBackWheel = 0x143; // задний правый
long wheelSpeed = 500;
long wheelPos = 3600;
//long GenPos1=-2600; //Left
//long GenPos2= 2600; //Righ
int8_t temperatureMotor;
int16_t torqueCurrentMotor;
int16_t speedMotor;
uint16_t encoderMotor;
void motorRun(unsigned long id)
{
canMsg.can_id = id;
canMsg.can_dlc = 8;
canMsg.data[0] = RMD_X6_MOTOR_RUNNING;
canMsg.data[1] = RMD_X6_STATUS_NULL;
canMsg.data[2] = RMD_X6_STATUS_NULL;
canMsg.data[3] = RMD_X6_STATUS_NULL;
canMsg.data[4] = RMD_X6_STATUS_NULL;
canMsg.data[5] = RMD_X6_STATUS_NULL;
canMsg.data[6] = RMD_X6_STATUS_NULL;
canMsg.data[7] = RMD_X6_STATUS_NULL;
can.sendMessage(&canMsg);
}
void motorStop(unsigned long id)
{
canMsg.can_id = id;
canMsg.can_dlc = 8;
canMsg.data[0] = RMD_X6_MOTOR_STOP;
canMsg.data[1] = RMD_X6_STATUS_NULL;
canMsg.data[2] = RMD_X6_STATUS_NULL;
canMsg.data[3] = RMD_X6_STATUS_NULL;
canMsg.data[4] = RMD_X6_STATUS_NULL;
canMsg.data[5] = RMD_X6_STATUS_NULL;
canMsg.data[6] = RMD_X6_STATUS_NULL;
canMsg.data[7] = RMD_X6_STATUS_NULL;
can.sendMessage(&canMsg);
}
void motorOff(unsigned long id)
{
canMsg.can_id = id;
canMsg.can_dlc = 8;
canMsg.data[0] = RMD_X6_MOTOR_OFF;//RMD_X6_MOTOR_STOP;
canMsg.data[1] = RMD_X6_STATUS_NULL;
canMsg.data[2] = RMD_X6_STATUS_NULL;
canMsg.data[3] = RMD_X6_STATUS_NULL;
canMsg.data[4] = RMD_X6_STATUS_NULL;
canMsg.data[5] = RMD_X6_STATUS_NULL;
canMsg.data[6] = RMD_X6_STATUS_NULL;
canMsg.data[7] = RMD_X6_STATUS_NULL;
can.sendMessage(&canMsg);
}
void readReply()
{
Serial.print(canMsg.can_id, HEX); // print ID
Serial.print(" ");
Serial.print(canMsg.can_dlc, HEX); // print DLC
Serial.print(" ");
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
Serial.print(canMsg.data[i],HEX);
Serial.print(" ");
}
Serial.println();
// Get motor temperature
temperatureMotor = (int8_t)canMsg.data[1];
// Get motor torque current
torqueCurrentMotor = (int16_t(canMsg.data[2]) << 8) |
canMsg.data[3];
// Get motor speed
speedMotor = (int16_t(canMsg.data[4]) << 8) |
canMsg.data[5];
// Get motor encoder
encoderMotor = (uint16_t(canMsg.data[6]) << 8) |
canMsg.data[7];
// Cover dps to rpm
speedMotor = speedMotor*60;
speedMotor = speedMotor/360;
Serial.print(temperatureMotor);
Serial.print(" ");
Serial.print(torqueCurrentMotor);
Serial.print(" ");
Serial.print(speedMotor);
Serial.print(" ");
Serial.print(encoderMotor);
Serial.print(" ");
}
void setPosition(unsigned long id, long wheelPos)
{
// Convert 1degree/LSB to 0.01degree/LSB
wheelPos = wheelPos * 100;
wheelPos = wheelPos * 6;
canMsg.can_id = id;
canMsg.can_dlc = 8;
canMsg.data[0] = RMD_X6_POSITION_CTRL_1;
canMsg.data[1] = RMD_X6_STATUS_NULL;
canMsg.data[2] = RMD_X6_STATUS_NULL;
canMsg.data[3] = RMD_X6_STATUS_NULL;
canMsg.data[4] = wheelPos;
canMsg.data[5] = wheelPos >> 8;
canMsg.data[6] = wheelPos >> 16;
canMsg.data[7] = wheelPos >> 24;
can.sendMessage(&canMsg);
delay(3);
}
void setVelocity(unsigned long id, long wheelSpeed)
{
// Cover rpm to dps
wheelSpeed = wheelSpeed*360;
wheelSpeed = wheelSpeed/60;
// Cover 1dsp/LSB to 0.01dsp/LSB
wheelSpeed = wheelSpeed * 100;
canMsg.can_id = id;
canMsg.can_dlc = 8;
canMsg.data[0] = RMD_X6_SPEED_CLOSED_LOOP;
canMsg.data[1] = RMD_X6_STATUS_NULL;
canMsg.data[2] = RMD_X6_STATUS_NULL;
canMsg.data[3] = RMD_X6_STATUS_NULL;
canMsg.data[4] = wheelSpeed;
canMsg.data[5] = wheelSpeed >> 8;
canMsg.data[6] = wheelSpeed >> 16;
canMsg.data[7] = wheelSpeed >> 24;
can.sendMessage(&canMsg);
delay(3);
}
void moveForward() {
setVelocity(leftFrontWheel, wheelSpeed);
setVelocity(leftBackWheel, wheelSpeed);
setVelocity(rightFrontWheel, wheelSpeed);
setVelocity(rightBackWheel, wheelSpeed);
}
void moveBackward() {
setVelocity(leftFrontWheel, -wheelSpeed);
setVelocity(leftBackWheel, -wheelSpeed);
setVelocity(rightFrontWheel, -wheelSpeed);
setVelocity(rightBackWheel, -wheelSpeed);
}
void moveSidewaysRight() {
setVelocity(leftFrontWheel, wheelSpeed);
setVelocity(leftBackWheel, -wheelSpeed);
setVelocity(rightFrontWheel, -wheelSpeed);
setVelocity(rightBackWheel, wheelSpeed);
}
void moveSidewaysLeft() {
setVelocity(leftFrontWheel, -wheelSpeed);
setVelocity(leftBackWheel, wheelSpeed);
setVelocity(rightFrontWheel, wheelSpeed);
setVelocity(rightBackWheel, -wheelSpeed);
}
void rotateLeft() {
setVelocity(leftFrontWheel, -wheelSpeed);
setVelocity(leftBackWheel, -wheelSpeed);
setVelocity(rightFrontWheel, wheelSpeed);
setVelocity(rightBackWheel, wheelSpeed);
}
void rotateRight() {
setVelocity(leftFrontWheel, wheelSpeed);
setVelocity(leftBackWheel, wheelSpeed);
setVelocity(rightFrontWheel, -wheelSpeed);
setVelocity(rightBackWheel, -wheelSpeed);
}
void moveRightForward() {
setVelocity(leftFrontWheel, wheelSpeed);
setVelocity(leftBackWheel, 0);
setVelocity(rightFrontWheel, 0);
setVelocity(rightBackWheel, wheelSpeed);
}
void moveRightBackward() {
setVelocity(leftFrontWheel, 0);
setVelocity(leftBackWheel, -wheelSpeed);
setVelocity(rightFrontWheel, -wheelSpeed);
setVelocity(rightBackWheel, 0);
}
void moveLeftForward() {
setVelocity(leftFrontWheel, 0);
setVelocity(leftBackWheel, wheelSpeed);
setVelocity(rightFrontWheel, wheelSpeed);
setVelocity(rightBackWheel, 0);
}
void moveLeftBackward() {
setVelocity(leftFrontWheel, -wheelSpeed);
setVelocity(leftBackWheel, 0);
setVelocity(rightFrontWheel, 0);
setVelocity(rightBackWheel, -wheelSpeed);
}
void stopMoving() {
motorStop(leftFrontWheel);
motorStop(leftBackWheel);
motorStop(rightFrontWheel);
motorStop(rightBackWheel);
}
void offMoving() {
motorOff(leftFrontWheel);
motorOff(leftBackWheel);
motorOff(rightFrontWheel);
motorOff(rightBackWheel);
}
void whellsRun() {
motorRun(leftFrontWheel);
motorRun(leftBackWheel);
motorRun(rightFrontWheel);
motorRun(rightBackWheel);
}
void setup() {
//
Serial.begin(115200);
can.reset();
can.setBitrate(CAN_1000KBPS, MCP_8MHZ);
can.setNormalMode();
// SPIClass mffVSPI = SPIClass(VSPI);
// mffVSPI.begin(VSPI_CLOCK_PIN, VSPI_MISO_PIN, VSPI_MOSI_PIN);
//pinMode(VSPI_MOSI_PIN, INPUT_PULLUP);
//pinMode(VSPI_MISO_PIN, INPUT_PULLUP);
// MCP_CAN mffCAN(VSPI_CS_MCP2515_PIN);
//mffCAN.begin(mffVSPI, MCP_ANY, CAN_250KBPS, MCP_8MHZ);
// mffCAN.setMode(MCP_NORMAL);
Serial.println("Initialized");
whellsRun();
Serial.println("Initialized Successfully!Write to CAN");
}
void loop() {
Serial.println("Messages loop");
//moveLeftBackward();
setVelocity(rightFrontWheel, -wheelSpeed);
setVelocity(rightBackWheel, -wheelSpeed);
// stopMoving();
//offMoving();
Serial.println("Messages sent");
if (can.readMessage(&canMsg) == MCP2515::ERROR_OK) {
readReply();
}
Serial.println();
delay(100);
}
Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Чт дек 09, 2021 18:49:34
Dimon456
anatoliydenisenko44 писал(а):по пинам SPI1
судя по тому что в примере выше
Код: Выделить всё
#include <SPI.h>
// MOSI MISO SCLK
SPIClass SPI3(PC12, PC11, PC10);
в вашем последнем коде не указан какой SPI используется, надо смотреть какой SPI по умолчанию прописан в фале SPI.h
Я бы еще и этот файлик mcp2515.h перетряс, может там еще что указано.
Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Ср дек 15, 2021 06:29:35
do-vitas
anatoliydenisenko44, а зачем вам mcp2515 у вас же can есть в контролере вам нужен приемопередатчик что-то типа TJA1040T. Я делал летом такой тока f373 все работало тока на LL.
Re: Stm32 (nucleo-h743zi2) SPI, CAN
Добавлено: Ср дек 15, 2021 14:55:40
optima
Тоже не понимаю зачем 2515, при том что у вас на борту CAN FD а это существенный плюс по сравнению с обычным CAN. Поэтому и трансивер желателен на минимум 5 мбс