CANopen is a higher-level communication protocol stack built on top of CAN. This means that it uses the same physical layer on the uCs with CAN transceivers, but it enforces additional rules on the CAN frames to create a standard way of organizing messages. The frame is a packet containing COB ID, RTR, Message Length, and Data. It provides specifications for a master node controlling slave nodes, state machines for each node, and more. CANopen is not just a single protocol, but a family of protocols using different communication models. The main protocol we use is PDO, which has two variations, transmit PDO and receive PDO. More information about CANopen can be found on Wikipedia.
The CANopen stack is an open source library for implementing CANopen in embedded systems. We've integrated the CANopen stack into EVT-core, so we are able to implement each of our boards as CANopen nodes fairly easily. Compared to other communication protocols, CANopen is more complicated to implement in the code, but the CANopen stack handles a lot of the complexity for us. You can read more about the CANopen stack on the CANopen stack website. We've also summarized some implementation information in this doc.