Comments (19)
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.
from canopenstm32.
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.
from canopenstm32.
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 ?
from canopenstm32.
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
from canopenstm32.
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.
from canopenstm32.
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.
from canopenstm32.
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
from canopenstm32.
@HamedJafarzadeh any idea ?
from canopenstm32.
@Alrick-gr Hi! Have you solve this issue? I think I have the same issue.
from canopenstm32.
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.
from canopenstm32.
Hi @Ashenoneq
I still not have solved the issue.
I also can not send hearthbeat, is this alos your case ?
from canopenstm32.
Hi @Alrick-gr
My heartbeat is working fine. I noticed that the prv_send_can_message
function did not get an empty mailbox
from canopenstm32.
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;
}
}
}
from canopenstm32.
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
from canopenstm32.
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?
from canopenstm32.
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
from canopenstm32.
I'm sorry, I also don't know where the problem lies.
from canopenstm32.
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.
from canopenstm32.
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.
from canopenstm32.
Related Issues (20)
- Missing CO_new() in canopen_app_process ? HOT 6
- Remove the dependency on TICK timer
- Timer interrupt needs to be stopped during reset communication procedure
- Overflow flag in STM32L4xx HOT 5
- TPDO not working on STM32F1 HOT 3
- Issue with running on STM32H735-DK
- STM32F4DISCOVERY CAN port cannot communicate HOT 3
- More just as request for help than an actual issue. HOT 1
- SDO download fails with message flood HOT 2
- connectivity issue with Nucleo-F103RB HOT 6
- node ID is not added to COB ID in EDS file HOT 4
- error handling requirement HOT 1
- STM32H735 Example Nothing after bootup Message HOT 2
- Configuring the micro as MASTER problem, CO_NMT_sendCommand() not defined. HOT 3
- STM32H735_DK Example Issue With SDO HOT 1
- How can I detect that an slave node is connected to the CAN bus before the HeartBeat message HOT 2
- Trying to communicate with CAN 500kbps HOT 9
- Trying to receive SDO messages in SDO client over CO_SDOclient_receive HOT 2
- Need to use other CAN thats not CANopen
- How to enable (so that they work) interrupts on tx and rx HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from canopenstm32.