Currently, 14 Sparkmaxes on 14 motors. No other faults. The 2 NEOs on Shooters are running at the same rotation and setting. the 2 NEO 550s on for Intake are also running the same (one follower).
Tripled checked the wiring. Table below indicates the increase/decrease utilization when CAN connection is reduced.
Reducing the status frames of things you don’t care about is probably a good first step. For instance, we set a higher interval for position status frames for motors that operated purely on velocity control, and vice versa. Your probably don’t care about the velocity of your swerve steer motors.
I think you can also set the control frame intervals but I think I don’t think you need to and it’s not super documented from what I can tell what it precisely does.
Also, avoid setting unnecessary things periodically if you are, like for instance pid constants or really anything that’s not a setpoint or duty cycle.
FWIW, we set the intervals of all the messages we really don’t care about to large (relatively) prime numbers. If you just set them all to X, then every X ticks you get a burst of them. This really lowered our bus utilization. For next robot we bought a CANivore (I think that’s the name) that lets us have 2 separate CAN busses.
This rate can be changed manually in code, but unlike other parameters, this setting does not persist through a power cycle.
So, I think you need to set them in code. I’d go as far as refraining from making any status frames more frequent than normal in the case of a power loss event or similar so you’re not relying on the faster frame timing (some of my most annoying issues with revlib were re: it’s handling of missing status frames iirc).
We got it down to about 65% ish. A big one was what you suggested from swerve steer motors. We also tried big prime number. These seems to do the trick. Thanks again.