Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Stm32 (nucleo-h743zi2) SPI, CAN

Чт дек 09, 2021 01:40:15

Всем привет. Возможно я очередной спамер, но информации нужной мне не нашел на просторах интернет. И спустя 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

Давно хотел попробовать
СпойлерИзображение
Изображение

Re: Stm32 (nucleo-h743zi2) SPI, CAN

Чт дек 09, 2021 08:35:49

Та, как поставить платы в редактор я знаю. У меня больше вопрос как работать с портами а точнее с интерфейсами самой платы, psi, can bus.

Re: Stm32 (nucleo-h743zi2) SPI, CAN

Чт дек 09, 2021 08:52:18

Это же ардуино, там должно быть все заточено, должны быть хоть какие-то примеры.

По идеи ваш, выше приведенный, код должен собраться под любую плату.

У мну таких плат нету, есть f030 и f100, в списке поддерживаемых их нет, и пытаться проверять не буду.
Установщик ардуино должен скачать компилятор gcc_arm, одним словом, проверяйте сами.

Re: Stm32 (nucleo-h743zi2) SPI, CAN

Чт дек 09, 2021 09:07:32

Подумал я что надо бы попробовать подключить модуль mcp2515 через SPI. И тут встал вопрос а как же эти порты SPI мне обьявить в той же Arduino IDE?

вики страница АПИ 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

Список поддерживаемых 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

а дальше полный бред, каким он был, таким и остался.

Очень очень долго сборка идет, можно два раза поспать.


Недавно мне пришлось делать проект под нордик через ардуину - захотел клиент и все тут. Я проклял все на свете, за то что связался с этим говном.
Во первых отладка - она типа есть, но еще типа нет. Как-то удалось подцепить джилинк и завести вижуал студию.
Очередной сюрприз - оптимизация жрет код, невозможно тлаживать. Иду без задней мысли в настройки, отрубаю опитимизацию и приехали! Эти дебилы так написали свои говноино библиотеки, что они без оптимизации не собираются! Потому что есть нереализованные виртуальные методы в класах. Когда работает оптимизацмя - они режутся и все вроде ок. Но стоит отрубить это все - и приехали.

Почему долго собирает? Потому что это говно (вижуал студия) сканирует библиотеки каждый раз при сборке.

Теперь про кан и H743. Чел, ты вообще даташит открывал? Ты видел структуру чипа, сколько там разных банок памяти, сколько там шин, что там есть кеш, какое тактирование сложное? Что там вообще-то не CAN, а FDCAN?

У меня есть проект на H743 с каном. И оно работает.

Не выделывайся - ставь CubeIde. Делай проект через визард - среда скачает РЕПОЗИТОРИЙ. И там в репозитории кроме библиотек будут рабочие ПРИМЕРЫ. Если у тебя задача не сложная, можно прямо взять готовый пример за основу и слегка переделать.
Более того, для таких чуваков даже сделали специальный ИМПОРТ примеров из репозитория куда надо. Файл-Импорт-Дженерал-Импорт стм32куб экзампл.

Re: Stm32 (nucleo-h743zi2) SPI, CAN

Чт дек 09, 2021 18:31:03

Я платы установил, поддержку нужной мне 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

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

anatoliydenisenko44, а зачем вам mcp2515 у вас же can есть в контролере вам нужен приемопередатчик что-то типа TJA1040T. Я делал летом такой тока f373 все работало тока на LL.

Re: Stm32 (nucleo-h743zi2) SPI, CAN

Ср дек 15, 2021 14:55:40

Тоже не понимаю зачем 2515, при том что у вас на борту CAN FD а это существенный плюс по сравнению с обычным CAN. Поэтому и трансивер желателен на минимум 5 мбс
Ответить