annotate dac.pio @ 25:6070d2e66b4c

Cascade IRQs from DAC to control so manual & external trigger are the same.
author Daniel O'Connor <darius@dons.net.au>
date Tue, 25 Feb 2025 16:53:32 +1030
parents 9ad0dd5c638c
children e1d8fe3e418a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
1 ;
9
3acdebd7eec7 Make it actually work
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
2 ; Copyright (c) 2025 Daniel O'Connor
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
3 ;
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
4
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
5 .program dac
25
6070d2e66b4c Cascade IRQs from DAC to control so manual & external trigger are the same.
Daniel O'Connor <darius@dons.net.au>
parents: 22
diff changeset
6 .define DAC_IRQ 0
6070d2e66b4c Cascade IRQs from DAC to control so manual & external trigger are the same.
Daniel O'Connor <darius@dons.net.au>
parents: 22
diff changeset
7 .define DAC_TRIGGER_IRQ 0
6070d2e66b4c Cascade IRQs from DAC to control so manual & external trigger are the same.
Daniel O'Connor <darius@dons.net.au>
parents: 22
diff changeset
8 .define CTRL_TRIGGER_IRQ 1
9
3acdebd7eec7 Make it actually work
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
9 ; Need 1 side set pin, the clock
3acdebd7eec7 Make it actually work
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
10 .side_set 1
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
11
9
3acdebd7eec7 Make it actually work
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
12 ; Clock in a 0 byte
10
98880b18bcc1 Reset DAC PIO and use force trigger to do manual trigger.
Daniel O'Connor <darius@dons.net.au>
parents: 9
diff changeset
13 mov pins, null side 0
98880b18bcc1 Reset DAC PIO and use force trigger to do manual trigger.
Daniel O'Connor <darius@dons.net.au>
parents: 9
diff changeset
14 nop side 1
98880b18bcc1 Reset DAC PIO and use force trigger to do manual trigger.
Daniel O'Connor <darius@dons.net.au>
parents: 9
diff changeset
15 ; Wait for start trigger and clear IRQ
25
6070d2e66b4c Cascade IRQs from DAC to control so manual & external trigger are the same.
Daniel O'Connor <darius@dons.net.au>
parents: 22
diff changeset
16 wait 1 irq DAC_TRIGGER_IRQ side 0
6070d2e66b4c Cascade IRQs from DAC to control so manual & external trigger are the same.
Daniel O'Connor <darius@dons.net.au>
parents: 22
diff changeset
17 ; Trigger the control SM
6070d2e66b4c Cascade IRQs from DAC to control so manual & external trigger are the same.
Daniel O'Connor <darius@dons.net.au>
parents: 22
diff changeset
18 irq nowait CTRL_TRIGGER_IRQ side 0
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
19 ; Clock DAC and write data from the FIFO
9
3acdebd7eec7 Make it actually work
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
20 ; DAC clocks data in on the rising clock edge
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
21 .wrap_target
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
22 out pins 8 side 0
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
23 nop side 1
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
24 out pins 8 side 0
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
25 nop side 1
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
26 out pins 8 side 0
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
27 nop side 1
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
28 out pins 8 side 0
9
3acdebd7eec7 Make it actually work
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
29 nop side 1
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
30 .wrap
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
31
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
32 % c-sdk {
5
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
33 static inline void dac_program_init(PIO pio, uint sm, uint offset, uint pin, uint clkdiv) {
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
34 pio_sm_config c = dac_program_get_default_config(offset);
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
35
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
36 // Set the OUT base pin to the provided `pin` parameter.
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
37 // First 8 pins are data, last is clock
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
38 sm_config_set_out_pins(&c, pin, 9);
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
39 // Set the pin directions to output at the PIO
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
40 pio_sm_set_consecutive_pindirs(pio, sm, pin, 9, true);
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
41 // Connect these GPIOs to this PIO block
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
42 for (int i = 0; i < 9; i++)
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
43 pio_gpio_init(pio, pin + i);
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
44
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
45 sm_config_set_out_shift(
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
46 &c,
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
47 true, // Shift-to-right
9
3acdebd7eec7 Make it actually work
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
48 true, // Autopull enabled
5
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
49 32 // Autopull threshold (bits!)
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
50 );
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
51
9
3acdebd7eec7 Make it actually work
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
52 // Configure sideset pin to use for clock
3acdebd7eec7 Make it actually work
Daniel O'Connor <darius@dons.net.au>
parents: 5
diff changeset
53 sm_config_set_sideset_pins(&c, pin + 8);
2
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
54
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
55 // We only send, so disable the RX FIFO to make the TX FIFO deeper.
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
56 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
0d653f60dec8 Actually get data moving out.
Daniel O'Connor <darius@dons.net.au>
parents: 0
diff changeset
57
5
Daniel O'Connor <darius@dons.net.au>
parents: 2
diff changeset
58 sm_config_set_clkdiv(&c, clkdiv);
0
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
59
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
60 // Load our configuration, and start the program from the beginning
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
61 pio_sm_init(pio, sm, offset, &c);
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
62 pio_sm_set_enabled(pio, sm, true);
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
63 }
a55e39064a71 First commit of code that compiles.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
64 %}