I have implemented a reduced set of CANopen, but enough to configure a couple of drives and run a motor using SDOs for config and PDOs to run. It took some work and really helps if you use a can sniffer like the Kvaser Leaf light (or you could program a teensy to do that if you're $ short and Time long) Only uses the standard 8 bytes of data for the SDOs and PDO, no extended packets. It's pretty specific to my higher level motor controller but the positional update is pretty generic to other systems. Using a slow update of 20ms but that could be easily improved. I ported a working implementation that was written around the Ti DSP F2812 can library.