arduino-CAN icon indicating copy to clipboard operation
arduino-CAN copied to clipboard

Reduce the number of bytes over SPI for MCP2515Class::parsePacket() by up to 2.8x

Open timurrrr opened this issue 5 years ago • 1 comments

  1. Use the RX STATUS command instead of READ(CANINTF) to check availability of data to read. This reduces SPI usage for a simple "is data available" check from 3 bytes to 2.

  2. Use the READ RX BUFFER command to read the RXFn* registers as well as the received data. This requires doing only a single CS pull, and only N+6 bytes transferred over SPI. READ RX BUFFER also takes care of resetting the RXnIF flag.

If my math is right, the old code needed N+6 readRegister() calls for a standard frame, and N+9 readRegister() calls for an extended frame, plus one modifyRegister() call to reset the RXnIF flag. Each readRegister() call requires a CS pull and transferring 3 bytes over SPI.

For N = 8,

  • we now send 16 bytes over SPI vs 45 for a standard frame (>2.8x reduction!)
  • we now do just 2 CS pulls vs 16 for a standard frame (8x reduction!)

timurrrr avatar Jul 31 '20 08:07 timurrrr

Came up with an even better idea, force-pushed an update into the branch so you can avoid looking at the less optimal intermediate solution.

timurrrr avatar Aug 04 '20 21:08 timurrrr