spi: Fix off-by-one error in calculating cycles per data frame
authorAlbert Ou <albert@sifive.com>
Tue, 2 May 2017 19:35:34 +0000 (12:35 -0700)
committerAlbert Ou <albert@sifive.com>
Tue, 2 May 2017 19:35:34 +0000 (12:35 -0700)
Issue: Configuring the frame length to certain values causes incorrect
operation.

Symptoms: Certain frame lengths result in the master sending one extra
clock pulse.  The slave device may then become desynchronized.

Workaround: The following frame lengths are supported and can be used.
Do not use other frame lengths.
* Serial mode: 0, 2, 4, 6, 8
* Dual mode:   0, 1, 3, 5, 7, 8
* Quad mode:   0, 1, 2, 3, 5, 6, 7, 8

src/main/scala/devices/spi/SPIFIFO.scala

index a322a1b933004cfe35064d142ad595a037fbef7a..5bc6e823f90ca802e119b53104a5a52de4921aec 100644 (file)
@@ -41,7 +41,7 @@ class SPIFIFO(c: SPIParamsBase) extends Module {
 
   val proto = SPIProtocol.decode(io.link.fmt.proto).zipWithIndex
   val cnt_quot = Mux1H(proto.map { case (s, i) => s -> (io.ctrl.fmt.len >> i) })
-  val cnt_rmdr = Mux1H(proto.map { case (s, i) => s -> (io.ctrl.fmt.len(i, 0).orR) })
+  val cnt_rmdr = Mux1H(proto.map { case (s, i) => s -> (if (i > 0) io.ctrl.fmt.len(i-1, 0).orR else UInt(0)) })
   io.link.fmt <> io.ctrl.fmt
   io.link.cnt := cnt_quot + cnt_rmdr