11using PIOLib
22
3+ const SHIFT_RIGHT = true # LSB first
4+ const SHIFT_LEFT = false # MSB first
5+
36function shift_register_program (pio:: PIOBlock ; ser_pin:: Integer , clk_pin:: Integer , rclk_pin:: Integer ,
47 nbits:: Integer , clkdiv:: Real = 1.0f0 )
58 1 <= nbits <= 31 || error (" nbits must be 1-31 (SET immediate is 5 bits, and 32 encodes as 0 in autopull threshold)" )
@@ -20,7 +23,7 @@ function shift_register_program(pio::PIOBlock; ser_pin::Integer, clk_pin::Intege
2023 set_pins= (rclk_pin, 1 ),
2124 sideset_pin_base= clk_pin,
2225 sideset= (1 , false , false ),
23- out_shift= (true , true , nbits),
26+ out_shift= (SHIFT_LEFT , true , nbits),
2427 clkdiv= Float32 (clkdiv),
2528 wrap= (prog. wrap_target, prog. wrap),
2629 )
122125# --- Flush ---
123126
124127function flush! (chain:: ShiftRegisterChain )
125- shift_out! (chain. sm, chain. state & 0x00FFFFFF )
128+ # Left-align: OSR shifts left, so MSB goes out first
129+ shift_out! (chain. sm, (chain. state & 0x00FFFFFF ) << (32 - NBITS))
126130end
127131
128132# --- Bulk writes (update shadow + flush) ---
0 commit comments