|
1 | 1 | using PIOLib |
2 | 2 |
|
| 3 | +function shift_register_program(; ser_pin::Integer, clk_pin::Integer, rclk_pin::Integer, |
| 4 | + nbits::Integer, clkdiv::Real=1.0f0) |
| 5 | + 1 <= nbits <= 31 || error("nbits must be 1-31 (SET immediate is 5 bits, and 32 encodes as 0 in autopull threshold)") |
| 6 | + |
| 7 | + prog = build_program([ |
| 8 | + WrapTarget(), |
| 9 | + Mov{:none}(RegX(), RegY(); sideset=0), |
| 10 | + Label(:bitloop), |
| 11 | + Out(Pins(), 1; sideset=0), |
| 12 | + Jmp{:x_dec}(:bitloop; sideset=1), |
| 13 | + Set(Pins(), 1; sideset=0), |
| 14 | + Set(Pins(), 0; sideset=0), |
| 15 | + Wrap(), |
| 16 | + ]; sideset_bits=1) |
| 17 | + |
| 18 | + config = SMConfig(; |
| 19 | + out_pins=(ser_pin, 1), |
| 20 | + set_pins=(rclk_pin, 1), |
| 21 | + sideset_pin_base=clk_pin, |
| 22 | + sideset=(1, false, false), |
| 23 | + out_shift=(true, true, nbits), |
| 24 | + clkdiv=Float32(clkdiv), |
| 25 | + wrap=(prog.wrap_target, prog.wrap), |
| 26 | + ) |
| 27 | + |
| 28 | + prog, config |
| 29 | +end |
| 30 | + |
| 31 | +function setup_shift_register!(sm::StateMachine, nbits::Integer) |
| 32 | + exec!(sm, Set(RegY(), nbits - 1)) |
| 33 | +end |
| 34 | + |
| 35 | +shift_out!(sm::StateMachine, data::UInt32) = put!(sm, data) |
| 36 | + |
3 | 37 | # --- Pin assignments --- |
4 | 38 | const SER_PIN = 26 # Serial data (SER/DS) |
5 | 39 | const CLK_PIN = 19 # Shift clock (SRCLK/SHCP) |
|
0 commit comments