Залевши глубако в код CanFestival'я я понял, что функция canSend при "успехе" должна возвращять 0, а не 1. Хорошо это видно вот здесь:
CODE
//File: sdo.c
//function: _writeNetworkDict
//sendSDO -> return canSend
err = sendSDO(d, SDO_CLIENT, sdo);
if (err) {
MSG_ERR(0x1AD1, "SDO. Error while sending SDO to node : ", nodeId);
/* release the line */
resetSDOline(d, line);
return 0xFF;
}
Исправив это, функция ConfigureSlaveNode заработала на ура. зажимы «WAGO» включались/выключались, а вот колёса так и не крутились. Матерясь спаял "CAN-BUS" ввиде буквы Т, по концам D-Sub9(3шт.: для МК, для робота и 3й для CAN2USB-Interface, чтоб на компьютере мониторить).
Увидел следующие (ID: 1-WAGO; 3-Joystick; 4-MK (Master); A,B,C,D - 4 Мотора):
-Sync
-RPDOs от ID 1, 3, А-D (180h+NodeId)
-TPDOs от ID 1, 3 (200h+NodeId) <- ошибка А-D нету
-Heartbeat от ID 1, 3, 4, А-D
Отключил Joystick(3), запустил -> вместо него появился мотор А(см. скрин). Получается что МК только 2 TPDO обрабатывает(или успевает только 2).

Тут я вспомнил феномен с breakpont'ом. Дописал следующие чтоб отловить ТPDO с cobid 20Bh(2й мотор)
CODE
//File: pdo.c
//function: buildPDO
pdo->cob_id = (UNS16) UNS16_LE(*(UNS32*)TPDO_com->pSubindex[1].pObject & 0x7FF);
//TODO:DELETE AFTER TEST
if(pdo->cob_id == 523) //<-20Bh
prp_j = 0x00; //breakpoint line
И как следовало ожидать программа в этой строчке останавливается, а после в мониторинге появлается 20Bh один раз.
Вывод: МК обрабатывает только 2 TPDO, остальные теряются. При breakpoint'e Atollic TRUEStudio замечает что там что-то ещё есть.
Может мне кто-нибудь обяснить почему это так и как это исправить? может это "bug" в Atollic? или что-то интеррупты съедают?
Как вы вкрутили CanFestival в проэкт? как dll или просто .c/.h-фаилы импортировали? я импортировал, вот мои конфигурации:
CODE
//FILE: canfestival.h
#ifndef CANFESTIVAL_H_
#define CANFESTIVAL_H_
#include "applicfg.h"
#include "data.h"
// --------- to be called by user app ---------
void initTimer(void);
UNS8 canSend(CAN_PORT notused, Message *m);
UNS8 canChangeBaudRate(CAN_PORT port, char* baud);
#endif
//File: applicfg.h
#ifndef __APPLICFG_NONE__
#define __APPLICFG_NONE__
#include <string.h>
#include <stdio.h>
/* Integers */
#define INTEGER8 char
#define INTEGER16 short
#define INTEGER24 int
#define INTEGER32 int
#define INTEGER40 long long
#define INTEGER48 long long
#define INTEGER56 long long
#define INTEGER64 long long
/* Unsigned integers */
#define UNS8 unsigned char
#define UNS16 unsigned short
#define UNS32 unsigned int
#define UNS24 unsigned int
#define UNS40 unsigned long long
#define UNS48 unsigned long long
#define UNS56 unsigned long long
#define UNS64 unsigned long long
/* Reals */
#define REAL32 float
#define REAL64 double
#include "can.h"
/* Definition of error and warning macros */
/* -------------------------------------- */
#define MSG(...)
/* Definition of MSG_ERR */
/* --------------------- */
#define MSG_ERR(num, str, val)
/* Definition of MSG_WAR */
/* --------------------- */
#define MSG_WAR(num, str, val)
typedef void* CAN_HANDLE;
typedef void* CAN_PORT;
#endif
//File: config.h
#ifndef CONFIG_H_
#define CONFIG_H_
// Needed defines by Canfestival lib
#define MAX_CAN_BUS_ID 1
#define SDO_MAX_LENGTH_TRANSFERT 32
#define SDO_MAX_SIMULTANEOUS_TRANSFERTS 1
#define NMT_MAX_NODE_ID 128
#define SDO_TIMEOUT_MS 3000U
#define MAX_NB_TIMER 8
// CANOPEN_BIG_ENDIAN is not defined
#define CANOPEN_LITTLE_ENDIAN 1
//#define US_TO_TIMEVAL_FACTOR 8
#define REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERTS_TIMES(repeat)\
repeat
#define REPEAT_NMT_MAX_NODE_ID_TIMES(repeat)\
repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat \
repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat \
repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat repeat \
repeat repeat repeat repeat repeat repeat repeat repeat repeat
#define EMCY_MAX_ERRORS 8
#define REPEAT_EMCY_MAX_ERRORS_TIMES(repeat)\
repeat repeat repeat repeat repeat repeat repeat repeat
#endif
//File: timerscfg.h
#ifndef __TIMERSCFG_H__
#define __TIMERSCFG_H__
/* Time unit : us */
#define TIMEVAL UNS32
#define TIMEVAL_MAX 0xFFFF
#define MS_TO_TIMEVAL(ms) (ms * 125)
#define US_TO_TIMEVAL(us) (us>>3)
#endif
//File: can_STM32.h
#ifndef CAN_STM32_H_
#define CAN_STM32_H_
#include "config.h"
//#include "can_drv.h"
// Canfestivals includes
#include "can.h"
/************************* To be called by user app ***************************/
unsigned char canInit(unsigned int bitrate);
unsigned char canSend(CAN_PORT notused, Message *m);
unsigned char canReceive(Message *m);
unsigned char canChangeBaudRate_driver( CAN_HANDLE fd, char* baud);
#endif