|
1 | 1 | #include "RP2350PIOCurrentSense.h"
|
2 | 2 |
|
3 |
| - RP2350PIOCurrentSense::RP2350PIOCurrentSense(float gain, uint32_t max_adc_value, int pinSCK, int pinCSB, int pinD0, int pinTRIG) : CurrentSense() { |
| 3 | + RP2350PIOCurrentSense::RP2350PIOCurrentSense(PIO pio, float gain, uint32_t max_adc_value, int pinSCK, int pinCSB, int pinD0, int pinTRIG) : CurrentSense() { |
| 4 | + this->pio = pio; |
4 | 5 | this->pinSCK = pinSCK;
|
5 | 6 | this->pinCSB = pinCSB;
|
6 | 7 | this->pinD0 = pinD0;
|
|
28 | 29 | // TODO init timer to trigger PIO conversions at required frequency (check driver settings)
|
29 | 30 | // TDB: do we need config input to know which timer slice and channel to use? or can we pick automatically?
|
30 | 31 | // TODO start everything up
|
31 |
| - |
| 32 | + // TODO implement offset and calibration like other current sensor classes. |
32 | 33 | float sck_hz = 20e6;
|
33 |
| - PIO pio = pio0; |
34 |
| - int sm = pio_claim_unused_sm(pio0, true); |
| 34 | + int sm = pio_claim_unused_sm(this->pio, true); |
35 | 35 | //if (sm < 0) { pio = pio1; sm = pio_claim_unused_sm(pio1, true); } //For now, let say we have to use PIO0, this is simpler for quick DMA setup
|
36 |
| - |
| 36 | + |
37 | 37 | // --- patch program instructions with chosen trigger pin ---
|
38 | 38 | size_t prog_len = bu79100g_parallel3_program.length;
|
39 | 39 | uint16_t insns[prog_len];
|
|
43 | 43 | struct pio_program prog = bu79100g_parallel3_program; // copy metadata
|
44 | 44 | prog.instructions = insns;
|
45 | 45 |
|
46 |
| - uint off = pio_add_program(pio, &prog); |
| 46 | + uint off = pio_add_program(this->pio, &prog); |
47 | 47 | pio_sm_config c = bu79100g_parallel3_program_get_default_config(off);
|
48 | 48 |
|
49 | 49 | // Map pins to the SM
|
|
52 | 52 | sm_config_set_sideset_pins(&c, this->pinSCK); // SCK (sideset)
|
53 | 53 |
|
54 | 54 | // Put pins into PIO control
|
55 |
| - pio_gpio_init(pio, this->pinSCK); |
56 |
| - pio_gpio_init(pio, this->pinCSB); |
57 |
| - pio_gpio_init(pio, this->pinD0); |
58 |
| - pio_gpio_init(pio, this->pinD1); |
59 |
| - pio_gpio_init(pio, this->pinD2); |
| 55 | + pio_gpio_init(this->pio, this->pinSCK); |
| 56 | + pio_gpio_init(this->pio, this->pinCSB); |
| 57 | + pio_gpio_init(this->pio, this->pinD0); |
| 58 | + pio_gpio_init(this->pio, this->pinD1); |
| 59 | + pio_gpio_init(this->pio, this->pinD2); |
60 | 60 |
|
61 | 61 | // Directions (from the SM’s point of view)
|
62 | 62 | pio_sm_set_consecutive_pindirs(pio, sm, this->pinSCK, 1, true); // SCK out
|
|
0 commit comments