|
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