spi: Don't decode data lines if CS isn't asserted
authorAndreas Sandberg <andreas@sandberg.pp.se>
Fri, 13 Feb 2015 21:42:01 +0000 (21:42 +0000)
committerUwe Hermann <uwe@hermann-uwe.de>
Fri, 3 Apr 2015 20:49:39 +0000 (22:49 +0200)
Avoid decoding and outputting data from the SPI bus if the CS pin
hasn't been asserted. This avoids confusing both users and stacked
decoders which otherwise end up seeing traffic intended for other
chips (or just noise).

Note: The old behavior of decoding all traffic is still in place if
no CS pin has been wired up to the decoder.

This fixes bug #559.

decoders/spi/pd.py

index 3abcd68d29a9c0f813ef06c3a3391b7c4dc58c1f..4a686ddd204a9fbff6b439f37e90db2f9ef14dda 100644 (file)
@@ -183,14 +183,16 @@ class Decoder(srd.Decoder):
         self.mosibits = [] if self.have_mosi else None
         self.bitcount = 0
 
         self.mosibits = [] if self.have_mosi else None
         self.bitcount = 0
 
+    def cs_asserted(self, cs):
+        active_low = (self.options['cs_polarity'] == 'active-low')
+        return (cs == 0) if active_low else (cs == 1)
+
     def handle_bit(self, miso, mosi, clk, cs):
         # If this is the first bit of a dataword, save its sample number.
         if self.bitcount == 0:
             self.ss_block = self.samplenum
     def handle_bit(self, miso, mosi, clk, cs):
         # If this is the first bit of a dataword, save its sample number.
         if self.bitcount == 0:
             self.ss_block = self.samplenum
-            self.cs_was_deasserted = False
-            if self.have_cs:
-                active_low = (self.options['cs_polarity'] == 'active-low')
-                self.cs_was_deasserted = (cs == 1) if active_low else (cs == 0)
+            self.cs_was_deasserted = \
+                not self.cs_asserted(cs) if self.have_cs else False
 
         ws = self.options['wordsize']
 
 
         ws = self.options['wordsize']
 
@@ -254,6 +256,10 @@ class Decoder(srd.Decoder):
             # Reset decoder state when CS# changes (and the CS# pin is used).
             self.reset_decoder_state()
 
             # Reset decoder state when CS# changes (and the CS# pin is used).
             self.reset_decoder_state()
 
+        # We only care about samples if CS# is asserted.
+        if self.have_cs and not self.cs_asserted(cs):
+            return
+
         # Ignore sample if the clock pin hasn't changed.
         if clk == self.oldclk:
             return
         # Ignore sample if the clock pin hasn't changed.
         if clk == self.oldclk:
             return