ERRATIC RESULTS UNDER TESTING
The last few test runs have produced puzzling results. I saw mostly correct results going up the SPI link, but the first value sent was incorrect, then we were off by one for the next 285 words of the 321 word sector, then it repeated the 285th value over and over until the end. The SPI state machine did not complete nor reset.
With one run, I saw garbage values again and the integrated logic analyzer showed that the state machines for driving the SPI link froze after the first word, acting as if the SlaveSelect line was never asserted again by the Arduino master. The way that my state machines are set up, as soon as SlaveSelect is asserted we start over pumping out the first byte of the word to the SPI link module, but that wasn't happening.
STALL IMPLIES THAT SLAVE SELECT FAILS TO ACTIVATE
SlaveSelect is a signal that I set and reset from my Arduino code for every word that is exchanged over the SPI link. That is, I assert select, exchange two bytes, then drop the selection line, thus delineating every word on the link. An overall signal, SPItransaction, is asserted to start a multiword transaction and dropped at the end of the 325 word exchange.
A signal from the Arduino Mega 2560, with 5V logic levels, is converted by my level shifter MOS transistors to the 3.3V levels of the FPGA board. My Arduino itself produces both 5V and 3.3V to power the two sides of the level shifter. Previous oscilloscope probes showed very good swings of logic levels, so that when the +5 dropped to near 0 on the Arduino side I would have the +3.3V level on the FPGA side drop near zero.
WIRING OR LEVELS OR METASTABLE OR SOMETHING ELSE
I don't have the scope here where I am testing, but that is the next step in investigating this weird behavior. A number of possibilities exist:
- The Arduino output may not drive low enough to produce an asserted low level at the FPGA
- The level shifter may be misbehaving
- Resistance in my makeshift wiring and connections may be producing invalid logic levels at the FPGA input
- The FPGA may reach a metastable invalid state if SlaveSelect changes near a clock edge
- Timing issues in the routing on the FPGA chip may produce state machine errors or other logical 'farts'