MCP2515 CAN Controller

As I mentioned in the previous article, I'll use MCP2515 CAN controller for inter-module communication (initially, at least) for the Analog3 Project. Datasheet of this device is available at the product page. MCP2515 consists of CAN protocol engine, data buffers,  controller, and SPI interface as illustrated in the picture below. You need to attach a processor to make this device functional.  In early phase of the project, I'm thinking of using a Raspberry Pi as the Master Of Modules (mom) and Arduino's for dummy synthesizer modules.  Arduino is not a realistic solution for Analog3 both in terms of cost and performance.  So, I'm thinking of implementing a common synthesizer module…

Changing the Strategy for Analog3

I've been trying for a year to make my own serial interface protocol to exchange data among synth modules.  Though it showed some progress, I kind of giving up this approach.  The problem is complexity of serial interface controller.  A controller for multi-master serial interface is complex.  Implementing using a generic device is more costly in many sense than I expected.  I started with Arduino.  This was the easiest approach but channel was too slow.  I could only achieve 50kbps.  Then I tried implementing it into AVR using assembler language.  It went 100kbps but it was about the limit.  The most serious problem with MPU was that the processing is…

Raspberry Pi I2C clock-stretching problem

The I2C slave that I'm developing has been failing intermittently.  I finally noticed this was a known bug in Raspberry Pi that mishandles clock stretching. I2C slave may delay response by holding SCL low.  However, when the slave does it, the I2C master in Raspberry Pi gives very short clock for the first bit of the next byte.  The symptom can be seen as following picture. More detail explanation can be read in this link: http://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html In order to workaround this, I set data rate in I2C slave module higher.  The communication rate is 400 kbps, but I set the data rate 1000 kbps.  It worked for me.  Here is…

SPI / RX collision test

Done collision test between SPI and RX in the comm driver.  The driver would receive RX signal any time, even while the host processor is accessing the driver via SPI to send or retrieve data.  Currently, the serial RX is handled in external input interrupt handler, so any bug in RX handler may break registers (i.e., states) for SPI communication.  I actually saw those bugs several times.  The bugs are fixed now and load test has passed.  In the test, the load generator keeps sending data via serial channel.  I've changed the timing of data retrieval in the host of the receiver so that SPI / RX collisions frequently happen. …