On a XC7Z030-FBG484 I have to use the built-in CAN modules in the PS. The Linux kernel recognises both controllers and I can configure both of them. From CAN0 I route the Tx and Rx signals via EMIO to some pins directly without a synchronizer. On the outside those pins are connected to a CAN transceiver that is known to work. When I try to send a frame the controller successfully starts a frame with standard ID and DLC but it sends out only the first four bits of the first data byte and repeats these bits in a periodic manner.
I tried with different IDs and data length but the result is the same, a frame with the correct ID and DLC is started and the first four bits are send out repeatedly. Changing the bitrate doesn't change much. The screenshots below show the Tx line (top) and Rx line (bottom). This pattern is send until I disconnect the Rx line from the transceiver.
If needed I can provide additional informations like clock summary, register values before and after sending, device tree files and also a minimal bitstream. I tried to setup and send a message without the driver by directly mmapping /dev/mem with the same result, so I can rule out the canps driver.
The bitstream is generated in a non-project flow and the Linux image is made with yocto/bitbake with patched components, so maybe a configuration register is not set.