Closed Alrick-gr closed 1 year ago
Hi @Alrick-gr ,
I don't know about your TPDO settings and etc, but I can tell you that I'm using more than two PDOs with this code and there is no problem in the code itself. Check to see if PDO id are not colliding with another node sending same PDOs. Check your hardware and also log the CAN packets to see what is happening.
Hi @HamedJafarzadeh
Thank for your answer.
Here is my TPDO configuration :
I don t have any other device connected excepted a USB-to-CAN so my device is the only one to send. In my can analyser i can see my two first TPDOs and then nothing. Without canopen i can send every frame that i want so the hardware is good.
But i think there is a bigger problem because it seems that i can't send heartbeat.
Can you set the COBs like this :
0x0181 0x0281 0x0381
Note that TPDOs are usually like this : 0x180+nodeID, 0x280+nodeID , ....
Also introduce a Inhibit time of 10 to all of them.
What is your micrcontroller ?
Are you using the latest build of ObjectDictionary editor ?
With this configuration i have the same result
In this version of OD Editor, I think the +nodeID is implicitly included. I m using this version : v4.1-2-gff637a7. My µC is a STM32F412VET
Debug prv_send_can_message function and see if it manages to find a empty transmit mailbox . Look below, probably this is where you can investigate the issue and give us more details.
Also try to work with the event timer, set different values for each TPDO. Maybe there is noise on the line and it cannot transmit packets fast enough hence tx buffer overflows. Also make sure there are terminal resistor properly installed on the line.
Hum it seems that mail box 1 and 2 are never available
in debugger mode you can see that it will never increase freelevel for mailbox 1 and 2.
Maybe it comes from this.
I m using the HAL library.
If i use different event timer, nothing changes.
Terminal resistor are properly installed
Edit : i think that my debugger is totaly glitched
@HamedJafarzadeh any idea ?
@Alrick-gr Hi! Have you solve this issue? I think I have the same issue.
My issue detail : https://stackoverflow.com/questions/76226213/the-problem-of-sending-more-than-4-tpdo-using-canopennode By the way, my mcu is stm32f103zet6. Becase I don't have stm32f4、f3、G0、H7.So I ported this project to stm32f103. However, the same issue also occurs.
Hi @Ashenoneq I still not have solved the issue. I also can not send hearthbeat, is this alos your case ?
Hi @Alrick-gr
My heartbeat is working fine. I noticed that the prv_send_can_message
function did not get an empty mailbox
Hi! @HamedJafarzadeh @Alrick-gr I think I've found the problem. I added a break statement in CO_CANinterrupt_TX, and now all the PDOs are being sent correctly. Although it seems like there might be a slight issue with the ordering of the message IDs being sent.
for (i = CANmodule->txSize; i > 0U; --i, ++buffer)
{
/* Try to send message */
if (buffer->bufferFull)
{
if (prv_send_can_message(CANmodule, buffer))
{
buffer->bufferFull = false;
CANmodule->CANtxCount--;
CANmodule->bufferInhibitFlag = buffer->syncFlag;
break;
}
}
}
hi @Ashenoneq I also found a solution to my problem, i increased the size of the heap and now my TPDOs are sent normaly. But i still not have hearthbeat
hi @Ashenoneq I also found a solution to my problem, i increased the size of the heap and now my TPDOs are sent normaly. But i still not have hearthbeat
Can I take a look at your OD.c file?
yes here it is :
// clang-format off
/*******************************************************************************
CANopen Object Dictionary definition for CANopenNode v1 to v2
This file was automatically generated by CANopenEditor v4.1-2-gff637a7
https://github.com/CANopenNode/CANopenNode
https://github.com/CANopenNode/CANopenEditor
DON'T EDIT THIS FILE MANUALLY !!!!
*******************************************************************************/
// For CANopenNode V2 users, C macro `CO_VERSION_MAJOR=2` has to be added to project options
#ifndef CO_VERSION_MAJOR
#include "CO_driver.h"
#include "CO_OD.h"
#include "CO_SDO.h"
#elif CO_VERSION_MAJOR < 4
#include "301/CO_driver.h"
#include "CO_OD.h"
#include "301/CO_SDOserver.h"
#else
#error This Object dictionary is not compatible with CANopenNode v4.0 and up!
#endif
/*******************************************************************************
DEFINITION AND INITIALIZATION OF OBJECT DICTIONARY VARIABLES
*******************************************************************************/
/***** Definition for RAM variables *******************************************/
struct sCO_OD_RAM CO_OD_RAM = {
CO_OD_FIRST_LAST_WORD,
/*1001*/ 0x0L,
/*1002*/ 0x0000L,
/*1003*/ {0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L},
/*100D*/ 0x0L,
/*1010*/ {0x0003L},
/*1011*/ {0x0001L},
/*1013*/ 0x0000L,
/*1280*/ {{0x3L, 0x0000L, 0x0000L, 0x0L}},
/*1F89*/ 0x0000L,
/*2000*/ {0x00, 0x00, 0x00, 0x00},
/*2003*/ {0x1L, 0x1L},
/*2005*/ 0x0L,
/*2006*/ {0x32L, 0x3CL},
/*2007*/ {0x0000L, 0x0000L},
/*2008*/ 0x000CL,
/*2010*/ {0x00, 0x00, 0x00, 0x00},
/*2103*/ 0x00,
/*2104*/ 0x64,
/*2105*/ 0x0L,
/*2106*/ 0x0000L,
/*2200*/ {0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L, 0x0L},
CO_OD_FIRST_LAST_WORD,
};
/***** Definition for ROM variables *******************************************/
struct sCO_OD_ROM CO_OD_ROM = {
CO_OD_FIRST_LAST_WORD,
/*1000*/ 0x1234L,
/*1005*/ 0x40000080L,
/*1006*/ 0x0064L,
/*1007*/ 0x0000L,
/*1008*/ {'C', 'A', 'N', 'o', 'p', 'e', 'n', 'N', 'o', 'd', 'e'},
/*1009*/ {'3', '.', '0', '0'},
/*100A*/ {'3', '.', '0', '0'},
/*100C*/ 0x00,
/*1012*/ 0x0000L,
/*1014*/ 0x0080L,
/*1015*/ 0x64,
/*1016*/ {0x0000L, 0x0000L, 0x0000L, 0x0000L},
/*1017*/ 0x3E8,
/*1018*/ {0x4L, 0x0000L, 0x0000L, 0x0000L, 0x0000L},
/*1019*/ 0x0L,
/*1029*/ {0x0L, 0x0L, 0x1L, 0x0L, 0x0L, 0x0L},
/*1200*/ {{0x2L, 0x0600L, 0x0580L}},
/*1F80*/ 0x0000L,
/*2101*/ 0x3AL,
/*2102*/ 0x3E8,
CO_OD_FIRST_LAST_WORD,
};
/***** Definition for EEPROM variables *******************************************/
struct sCO_OD_EEPROM CO_OD_EEPROM = {
CO_OD_FIRST_LAST_WORD,
/*2001*/ {0x0L, 0x0L},
/*2002*/ {0x0L, 0x0L},
/*2004*/ {0x0L, 0x0L},
CO_OD_FIRST_LAST_WORD,
};
/***** Definition for PERSIST_COMM variables *******************************************/
struct sCO_OD_PERSIST_COMM CO_OD_PERSIST_COMM = {
CO_OD_FIRST_LAST_WORD,
/*1400*/ {{0x2L, 0x8000035CL, 0xFEL},
/*1401*/ {0x2L, 0x8000045CL, 0xFEL},
/*1402*/ {0x2L, 0x055CL, 0xFEL}},
/*1600*/ {{0x4L, 0x20000110L, 0x20000210L, 0x20000310L, 0x20000410L, 0x0000L, 0x0000L, 0x0000L, 0x0000L},
/*1601*/ {0x4L, 0x20100110L, 0x20100210L, 0x20100310L, 0x20100410L, 0x0000L, 0x0000L, 0x0000L, 0x0000L},
/*1602*/ {0x1L, 0x20050008L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L}},
/*1800*/ {{0x6L, 0x02DDL, 0xFEL, 0x0A, 0x0L, 0x64, 0x0L},
/*1801*/ {0x6L, 0x03DDL, 0xFEL, 0x0A, 0x0L, 0x64, 0x0L},
/*1802*/ {0x6L, 0x04DDL, 0xFEL, 0x0A, 0x0L, 0x64, 0x0L},
/*1803*/ {0x6L, 0x05DDL, 0xFEL, 0x0A, 0x0L, 0x64, 0x0L}},
/*1A00*/ {{0x4L, 0x20000110L, 0x20000210L, 0x20000310L, 0x20000410L, 0x0000L, 0x0000L, 0x0000L, 0x0000L},
/*1A01*/ {0x4L, 0x20100110L, 0x20100210L, 0x20100310L, 0x20100410L, 0x0000L, 0x0000L, 0x0000L, 0x0000L},
/*1A02*/ {0x1L, 0x20050008L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L},
/*1A03*/ {0x1L, 0x20080020L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L, 0x0000L}},
CO_OD_FIRST_LAST_WORD,
};
/*******************************************************************************
STRUCTURES FOR RECORD TYPE OBJECTS
*******************************************************************************/
/*0x1018*/ const CO_OD_entryRecord_t OD_record1018[5] = {
{(void*)&CO_OD_ROM.identity.maxSubIndex, 0x05, 0x1 },
{(void*)&CO_OD_ROM.identity.vendorID, 0x85, 0x4 },
{(void*)&CO_OD_ROM.identity.productCode, 0x85, 0x4 },
{(void*)&CO_OD_ROM.identity.revisionNumber, 0x85, 0x4 },
{(void*)&CO_OD_ROM.identity.serialNumber, 0x85, 0x4 },
};
/*0x1200*/ const CO_OD_entryRecord_t OD_record1200[3] = {
{(void*)&CO_OD_ROM.SDOServerParameter[0].maxSubIndex, 0x05, 0x1 },
{(void*)&CO_OD_ROM.SDOServerParameter[0].COB_IDClientToServer, 0x85, 0x4 },
{(void*)&CO_OD_ROM.SDOServerParameter[0].COB_IDServerToClient, 0x85, 0x4 },
};
/*0x1280*/ const CO_OD_entryRecord_t OD_record1280[4] = {
{(void*)&CO_OD_RAM.SDOClientParameter[0].maxSubIndex, 0x06, 0x1 },
{(void*)&CO_OD_RAM.SDOClientParameter[0].COB_IDClientToServer, 0x8E, 0x4 },
{(void*)&CO_OD_RAM.SDOClientParameter[0].COB_IDServerToClient, 0x8E, 0x4 },
{(void*)&CO_OD_RAM.SDOClientParameter[0].nodeIDOfTheSDOServer, 0x0E, 0x1 },
};
/*0x1400*/ const CO_OD_entryRecord_t OD_record1400[3] = {
{(void*)&CO_OD_PERSIST_COMM.RPDOCommunicationParameter[0].highestSubIndexSupported, 0x07, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.RPDOCommunicationParameter[0].COB_IDUsedByRPDO, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOCommunicationParameter[0].transmissionType, 0x0F, 0x1 },
};
/*0x1401*/ const CO_OD_entryRecord_t OD_record1401[3] = {
{(void*)&CO_OD_PERSIST_COMM.RPDOCommunicationParameter[1].highestSubIndexSupported, 0x07, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.RPDOCommunicationParameter[1].COB_IDUsedByRPDO, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOCommunicationParameter[1].transmissionType, 0x0F, 0x1 },
};
/*0x1402*/ const CO_OD_entryRecord_t OD_record1402[3] = {
{(void*)&CO_OD_PERSIST_COMM.RPDOCommunicationParameter[2].highestSubIndexSupported, 0x07, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.RPDOCommunicationParameter[2].COB_IDUsedByRPDO, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOCommunicationParameter[2].transmissionType, 0x0F, 0x1 },
};
/*0x1600*/ const CO_OD_entryRecord_t OD_record1600[9] = {
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[0].numberOfMappedApplicationObjectsInPDO, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[0].applicationObject1, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[0].applicationObject2, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[0].applicationObject3, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[0].applicationObject4, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[0].applicationObject5, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[0].applicationObject6, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[0].applicationObject7, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[0].applicationObject8, 0x8F, 0x4 },
};
/*0x1601*/ const CO_OD_entryRecord_t OD_record1601[9] = {
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[1].numberOfMappedApplicationObjectsInPDO, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[1].applicationObject1, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[1].applicationObject2, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[1].applicationObject3, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[1].applicationObject4, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[1].applicationObject5, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[1].applicationObject6, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[1].applicationObject7, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[1].applicationObject8, 0x8F, 0x4 },
};
/*0x1602*/ const CO_OD_entryRecord_t OD_record1602[9] = {
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[2].numberOfMappedApplicationObjectsInPDO, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[2].applicationObject1, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[2].applicationObject2, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[2].applicationObject3, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[2].applicationObject4, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[2].applicationObject5, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[2].applicationObject6, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[2].applicationObject7, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.RPDOMappingParameter[2].applicationObject8, 0x8F, 0x4 },
};
/*0x1800*/ const CO_OD_entryRecord_t OD_record1800[7] = {
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[0].highestSubIndexSupported, 0x07, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[0].COB_IDUsedByTPDO, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[0].transmissionType, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[0].inhibitTime, 0x8F, 0x2 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[0].compatibilityEntry, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[0].eventTimer, 0x8F, 0x2 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[0].SYNCStartValue, 0x0F, 0x1 },
};
/*0x1801*/ const CO_OD_entryRecord_t OD_record1801[7] = {
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[1].highestSubIndexSupported, 0x07, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[1].COB_IDUsedByTPDO, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[1].transmissionType, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[1].inhibitTime, 0x8F, 0x2 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[1].compatibilityEntry, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[1].eventTimer, 0x8F, 0x2 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[1].SYNCStartValue, 0x0F, 0x1 },
};
/*0x1802*/ const CO_OD_entryRecord_t OD_record1802[7] = {
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[2].highestSubIndexSupported, 0x07, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[2].COB_IDUsedByTPDO, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[2].transmissionType, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[2].inhibitTime, 0x8F, 0x2 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[2].compatibilityEntry, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[2].eventTimer, 0x8F, 0x2 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[2].SYNCStartValue, 0x0F, 0x1 },
};
/*0x1803*/ const CO_OD_entryRecord_t OD_record1803[7] = {
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[3].highestSubIndexSupported, 0x07, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[3].COB_IDUsedByTPDO, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[3].transmissionType, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[3].inhibitTime, 0x8F, 0x2 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[3].compatibilityEntry, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[3].eventTimer, 0x8F, 0x2 },
{(void*)&CO_OD_PERSIST_COMM.TPDOCommunicationParameter[3].SYNCStartValue, 0x0F, 0x1 },
};
/*0x1A00*/ const CO_OD_entryRecord_t OD_record1A00[9] = {
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[0].numberOfMappedApplicationObjectsInPDO, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[0].applicationObject1, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[0].applicationObject2, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[0].applicationObject3, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[0].applicationObject4, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[0].applicationObject5, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[0].applicationObject6, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[0].applicationObject7, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[0].applicationObject8, 0x8F, 0x4 },
};
/*0x1A01*/ const CO_OD_entryRecord_t OD_record1A01[9] = {
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[1].numberOfMappedApplicationObjectsInPDO, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[1].applicationObject1, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[1].applicationObject2, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[1].applicationObject3, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[1].applicationObject4, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[1].applicationObject5, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[1].applicationObject6, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[1].applicationObject7, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[1].applicationObject8, 0x8F, 0x4 },
};
/*0x1A02*/ const CO_OD_entryRecord_t OD_record1A02[9] = {
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[2].numberOfMappedApplicationObjectsInPDO, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[2].applicationObject1, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[2].applicationObject2, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[2].applicationObject3, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[2].applicationObject4, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[2].applicationObject5, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[2].applicationObject6, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[2].applicationObject7, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[2].applicationObject8, 0x8F, 0x4 },
};
/*0x1A03*/ const CO_OD_entryRecord_t OD_record1A03[9] = {
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[3].numberOfMappedApplicationObjectsInPDO, 0x0F, 0x1 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[3].applicationObject1, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[3].applicationObject2, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[3].applicationObject3, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[3].applicationObject4, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[3].applicationObject5, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[3].applicationObject6, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[3].applicationObject7, 0x8F, 0x4 },
{(void*)&CO_OD_PERSIST_COMM.TPDOMappingParameter[3].applicationObject8, 0x8F, 0x4 },
};
/*******************************************************************************
OBJECT DICTIONARY
*******************************************************************************/
const CO_OD_entry_t CO_OD[CO_OD_NoOfElements] = {
{0x1000, 0x00, 0x85, 4, (void*)&CO_OD_ROM.deviceType},
{0x1001, 0x00, 0x36, 1, (void*)&CO_OD_RAM.errorRegister},
{0x1002, 0x00, 0xB6, 4, (void*)&CO_OD_RAM.manufacturerStatusRegister},
{0x1003, 0x08, 0x8E, 4, (void*)&CO_OD_RAM.preDefinedErrorField[0]},
{0x1005, 0x00, 0x8D, 4, (void*)&CO_OD_ROM.COB_ID_SYNCMessage},
{0x1006, 0x00, 0x8D, 4, (void*)&CO_OD_ROM.communicationCyclePeriod},
{0x1007, 0x00, 0x8D, 4, (void*)&CO_OD_ROM.synchronousWindowLength},
{0x1008, 0x00, 0x05, 11, (void*)&CO_OD_ROM.manufacturerDeviceName},
{0x1009, 0x00, 0x05, 4, (void*)&CO_OD_ROM.manufacturerHardwareVersion},
{0x100A, 0x00, 0x05, 4, (void*)&CO_OD_ROM.manufacturerSoftwareVersion},
{0x100C, 0x00, 0x85, 2, (void*)&CO_OD_ROM.guardTime},
{0x100D, 0x00, 0x06, 1, (void*)&CO_OD_RAM.lifeTimeFactor},
{0x1010, 0x01, 0x8E, 4, (void*)&CO_OD_RAM.storeParameters[0]},
{0x1011, 0x01, 0x8E, 4, (void*)&CO_OD_RAM.restoreDefaultParameters[0]},
{0x1012, 0x00, 0x85, 4, (void*)&CO_OD_ROM.COB_ID_TIME},
{0x1013, 0x00, 0x8E, 4, (void*)&CO_OD_RAM.highResolutionTimeStamp},
{0x1014, 0x00, 0x85, 4, (void*)&CO_OD_ROM.COB_ID_EMCY},
{0x1015, 0x00, 0x8D, 2, (void*)&CO_OD_ROM.inhibitTimeEMCY},
{0x1016, 0x04, 0x8D, 4, (void*)&CO_OD_ROM.consumerHeartbeatTime[0]},
{0x1017, 0x00, 0x8D, 2, (void*)&CO_OD_ROM.producerHeartbeatTime},
{0x1018, 0x04, 0x00, 0, (void*)&OD_record1018},
{0x1019, 0x00, 0x0D, 1, (void*)&CO_OD_ROM.synchronousCounterOverflowValue},
{0x1029, 0x06, 0x0D, 1, (void*)&CO_OD_ROM.errorBehavior[0]},
{0x1200, 0x02, 0x00, 0, (void*)&OD_record1200},
{0x1280, 0x03, 0x00, 0, (void*)&OD_record1280},
{0x1400, 0x02, 0x00, 0, (void*)&OD_record1400},
{0x1401, 0x02, 0x00, 0, (void*)&OD_record1401},
{0x1402, 0x02, 0x00, 0, (void*)&OD_record1402},
{0x1600, 0x08, 0x00, 0, (void*)&OD_record1600},
{0x1601, 0x08, 0x00, 0, (void*)&OD_record1601},
{0x1602, 0x08, 0x00, 0, (void*)&OD_record1602},
{0x1800, 0x06, 0x00, 0, (void*)&OD_record1800},
{0x1801, 0x06, 0x00, 0, (void*)&OD_record1801},
{0x1802, 0x06, 0x00, 0, (void*)&OD_record1802},
{0x1803, 0x06, 0x00, 0, (void*)&OD_record1803},
{0x1A00, 0x08, 0x00, 0, (void*)&OD_record1A00},
{0x1A01, 0x08, 0x00, 0, (void*)&OD_record1A01},
{0x1A02, 0x08, 0x00, 0, (void*)&OD_record1A02},
{0x1A03, 0x08, 0x00, 0, (void*)&OD_record1A03},
{0x1F80, 0x00, 0x8D, 4, (void*)&CO_OD_ROM.NMTStartup},
{0x1F89, 0x00, 0x8E, 4, (void*)&CO_OD_RAM.bootTime},
{0x2000, 0x04, 0xBE, 2, (void*)&CO_OD_RAM.color0[0]},
{0x2001, 0x02, 0x0F, 1, (void*)&CO_OD_EEPROM.gain[0]},
{0x2002, 0x02, 0x0F, 1, (void*)&CO_OD_EEPROM.timing[0]},
{0x2003, 0x02, 0x0E, 1, (void*)&CO_OD_RAM.state[0]},
{0x2004, 0x02, 0x0F, 1, (void*)&CO_OD_EEPROM.luminosity[0]},
{0x2005, 0x00, 0x3E, 1, (void*)&CO_OD_RAM.temperature},
{0x2006, 0x02, 0x0E, 1, (void*)&CO_OD_RAM.limit_temperature[0]},
{0x2007, 0x02, 0x8E, 4, (void*)&CO_OD_RAM.update[0]},
{0x2008, 0x00, 0xBE, 4, (void*)&CO_OD_RAM.test_var},
{0x2010, 0x04, 0xBE, 2, (void*)&CO_OD_RAM.color1[0]},
{0x2101, 0x00, 0x05, 1, (void*)&CO_OD_ROM.CANNodeID},
{0x2102, 0x00, 0x8D, 2, (void*)&CO_OD_ROM.CANBitRate},
{0x2103, 0x00, 0x8E, 2, (void*)&CO_OD_RAM.SYNCCounter},
{0x2104, 0x00, 0x8E, 2, (void*)&CO_OD_RAM.SYNCTime},
{0x2105, 0x00, 0x0E, 1, (void*)&CO_OD_RAM.reset},
{0x2106, 0x00, 0x8E, 4, (void*)&CO_OD_RAM.powerOnCounter},
{0x2200, 0x0A, 0x0E, 1, (void*)&CO_OD_RAM.errorStatusBits[0]},
};
// clang-format on
It is exported in LEGACY mode
I'm sorry, I also don't know where the problem lies.
I had a similar issue sending more than 3 PDO´s every sync signal. Evertime I used more than 3 PDO´s, I got an overrun error. So first to avoid this overrun, I excluded the error part in "CO_CANsend()" function in the "CO_driver_STM32.c" file.
This stopped the error, but the messages still weren´t sent on the right timing. So I kept searching and found out, that it seems like, if a message cant´t be transmitted via "CO_CANsend" (this is indicated if "prv_send_can_message" can´t find a free mailbox, which are limited to 3 in my MCU) a flag (bufferFull) is set and a counter (CANtxCount) gets incremented. In the function "CO_CANinterruptTX" (which should be called by the CAN TX interrupt, erverytime a mailbox gets free state) the CANtxCount is checked if there are still messages left, that need to be sent. If there are messages, the CANtxArray is checked, which message has a bufferFull" flag, that indicates that this message is still pending and waits to be sent. If such a message was found, it is sent. I still had the issue, that this worked only for one extra PDO, so I was at a maximum of 4 PDO´s. The remaining PDO´s werent sent. The issue was, that the CANtxCount was set to 0 after the messages in the CANtxArray has been checked, but if you have multiple messages waiting in the buffer and only one mailbox that is free there is a problem.. So I decided to stop the CANtxCounter from resetting, so that if the next mailbox gets a free state it can send the remaining messages.
This solved my issue and I hope it could help a little bit.
thank youfor your answer @Kyroke.
I forgot to update the issue but i solved my problem by changing the size of the heap and stack.
Also i changed the timing in the function CO_process_TPDO
.
And now it works perfectly.
Hello, When I m using more thant 2 TPDOs (configured with the OD_editor), the 2 first TPDOs are sent and then, nothing happens. In
CO_CANsend
I have the errorCO_ERROR_TX_OVERFLOW
. If i only use 2 TPDOs, it works perfectly.When i put a breakpoint before
CO_process_TPDO
, then it works and send all TPDOS, but the device will no longer receive any commands.