@@ -19,9 +19,10 @@ type SPI3w struct {
1919 dma dmaChannel
2020 offset uint8
2121
22- statusEn bool
23- lastStatus uint32
24- pinMask uint32
22+ statusEn bool
23+ programWrapTarget uint8
24+ lastStatus uint32
25+ pinMask uint32
2526}
2627
2728func NewSPI3w (sm pio.StateMachine , dio , clk machine.Pin , baud uint32 ) (* SPI3w , error ) {
@@ -33,15 +34,42 @@ func NewSPI3w(sm pio.StateMachine, dio, clk machine.Pin, baud uint32) (*SPI3w, e
3334
3435 // https://github.com/embassy-rs/embassy/blob/c4a8b79dbc927e46fcc71879673ad3410aa3174b/cyw43-pio/src/lib.rs#L90
3536 sm .TryClaim () // SM should be claimed beforehand, we just guarantee it's claimed.
36-
3737 Pio := sm .PIO ()
38- offset , err := Pio .AddProgram (spi3wInstructions , spi3wOrigin )
38+ assm := pio.AssemblerV0 {
39+ SidesetBits : 1 ,
40+ }
41+ const (
42+ origin = - 1
43+ wloopOff = 0
44+ rloopOff = 5
45+ endOff = 7
46+ )
47+ var program = [... ]uint16 {
48+ // .wrap_target
49+ // write out x-1 bits.
50+ wloopOff :// Write/Output loop.
51+ assm .Out (pio .OutDestPins , 1 ).Side (0 ).Encode (), // 0: out pins, 1 side 0
52+ assm .Jmp (wloopOff , pio .JmpXNZeroDec ).Side (1 ).Encode (), // 1: jmp x--, 0 side 1
53+ assm .Jmp (endOff , pio .JmpYZero ).Side (0 ).Encode (), // 2: jmp !y, 7 side 0
54+ assm .Set (pio .SetDestPindirs , 0 ).Side (0 ).Encode (), // 3: set pindirs, 0 side 0
55+ assm .Nop ().Side (0 ).Encode (), // 4: nop side 0
56+ // read in y-1 bits.
57+ rloopOff :// Read/input loop
58+ assm .In (pio .InSrcPins , 1 ).Side (1 ).Encode (), // 5: in pins, 1 side 1
59+ assm .Jmp (rloopOff , pio .JmpYNZeroDec ).Side (0 ).Encode (), // 6: jmp y--, 5 side 0
60+ // Wait for SPI packet on IRQ.
61+ endOff :// Wait on input pin.
62+ assm .WaitPin (true , 0 ).Side (0 ).Encode (), // 7: wait 1 pin, 0 side 0
63+ assm .IRQSet (false , 0 ).Side (0 ).Encode (), // 8: irq nowait 0 side 0
64+ }
65+ const a = len (program ) - 1
66+
67+ offset , err := Pio .AddProgram (program [:], origin )
3968 if err != nil {
4069 return nil , err
4170 }
42-
71+ cfg := assm . DefaultStateMachineConfig ( offset , program [:])
4372 // Configure state machine.
44- cfg := spi3wProgramDefaultConfig (offset )
4573 cfg .SetOutPins (dio , 1 )
4674 cfg .SetSetPins (dio , 1 )
4775 cfg .SetInPins (dio , 1 )
@@ -84,6 +112,8 @@ func NewSPI3w(sm pio.StateMachine, dio, clk machine.Pin, baud uint32) (*SPI3w, e
84112 sm : sm ,
85113 offset : offset ,
86114 pinMask : pinMask ,
115+
116+ programWrapTarget : wloopOff ,
87117 }
88118 return spiw , nil
89119}
@@ -259,7 +289,7 @@ func (spi *SPI3w) prepTx(readbits, writebits uint32) {
259289 spi .sm .SetY (readbits )
260290 var asm pio.AssemblerV0
261291 spi .sm .Exec (asm .Set (pio .SetDestPindirs , 1 ).Encode ()) // Set Pindir out.
262- spi .sm .Jmp (spi .offset + spi3wWrapTarget , pio .JmpAlways )
292+ spi .sm .Jmp (spi .offset + spi . programWrapTarget , pio .JmpAlways )
263293
264294 spi .sm .SetEnabled (true )
265295}
0 commit comments