diff --git a/hwdefs.h b/hwdefs.h index 195cf77..3b4cc76 100644 --- a/hwdefs.h +++ b/hwdefs.h @@ -55,7 +55,7 @@ /**************************************************************************** * RPi pico specific defs. ****************************************************************************/ -#define CLK_FREQ 48000000L /* pico's ADC clock is 48M. */ +#define CLK_ADC_FREQ 48000000L /* pico's ADC clock is 48M. */ #define GPIO(x) (x) /* pico GPIO number to address. */ #define PLL_SYS_MHZ 250 /* system clock. */ diff --git a/piodco/dco.pio b/piodco/dco.pio index 03c2cdb..c472db8 100644 --- a/piodco/dco.pio +++ b/piodco/dco.pio @@ -1,17 +1,36 @@ .program dco + set x, 0 + .wrap_target + pull ifempty // 1 + out y, 8 // load 8-bit delay value in terms of cycles. 2 +LOOP0: + jmp y-- LOOP0 // do accurate delay. 3+t + set pins, 1 // set pins = 1. 4+t. - out x, 8 // load 8-bit delay value in terms of cycles. 1 -LOOPH: - jmp x-- LOOPH // do accurate delay. 2+x - set pins, 1 // set pins = 1. 3+x. - out x, 8 // load 8-bit delay value in terms of cycles. 4+y -LOOPL: - jmp x-- LOOPL // 5+y - set pins, 0 // 6+y - // CLK/6 max, ~250MHz/6 = 41.666(6)MHz output max frq + pull ifempty // 5+t + out y, 8 // load 8-bit delay value in terms of cycles. 6+t +LOOP1: + jmp y-- LOOP1 // 7+t + set pins, 0 // 8+t + // CLK/8 max, 250MHz/8 = 31.25 MHz output max frq. + // CLK/(255+8) min, 250MHz/263 = 950 kHz min frq. + // So, it covers 3..30 MHz HF band + 160 meter band. + pull ifempty + out y, 8 +LOOP2: + jmp y-- LOOP2 + set pins, 1 + + + pull ifempty + out y, 8 +LOOP3: + jmp y-- LOOP3 + set pins, 0 + .wrap % c-sdk { @@ -21,7 +40,7 @@ static inline void dco_program_init(PIO pio, uint sm, uint offset, uint pin) sm_config_set_out_pins(&c, pin, 1); pio_gpio_init(pio, pin); - sm_config_set_out_shift(&c, false, true, 32); + sm_config_set_out_shift(&c, false, true, 8); // Autopull. sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true); @@ -34,14 +53,14 @@ static inline void dco_program_init(PIO pio, uint sm, uint offset, uint pin) // static inline void dco_program_puts(PIO pio, uint sm, const uint32_t *s) { - pio_sm_put(pio, sm, s[0]); - pio_sm_put(pio, sm, s[1]); - pio_sm_put(pio, sm, s[2]); - pio_sm_put(pio, sm, s[3]); - pio_sm_put(pio, sm, s[4]); - pio_sm_put(pio, sm, s[5]); - pio_sm_put(pio, sm, s[6]); - pio_sm_put(pio, sm, s[7]); + pio_sm_put_blocking(pio, sm, s[0]); + pio_sm_put_blocking(pio, sm, s[1]); + pio_sm_put_blocking(pio, sm, s[2]); + pio_sm_put_blocking(pio, sm, s[3]); + pio_sm_put_blocking(pio, sm, s[4]); + pio_sm_put_blocking(pio, sm, s[5]); + pio_sm_put_blocking(pio, sm, s[6]); + pio_sm_put_blocking(pio, sm, s[7]); } %} diff --git a/piodco/piodco.c b/piodco/piodco.c index 531945f..58b105f 100644 --- a/piodco/piodco.c +++ b/piodco/piodco.c @@ -3,18 +3,32 @@ #include #include "../lib/assert.h" -int PioDCOInit(piodco *pdco, uint32_t ui32_clock_hz) +#include "build/dco.pio.h" + +int PioDCOInit(PioDco *pdco, uint32_t ui32_clock_hz) { assert_(pdco); - memset(pdco, 0, sizeof(piodco)); + memset(pdco, 0, sizeof(PioDco)); pdco->_clkfreq_hz = ui32_clock_hz; + pdco->_pio = pio0; + pdco->_gpio = 6; + pdco->_offset = pio_add_program(pdco->_pio, &dco_program); + pdco->_ism = pio_claim_unused_sm(pdco->_pio, true); + + dco_program_init(pdco->_pio, pdco->_ism, pdco->_offset, pdco->_gpio); + pdco->_pio_sm = dco_program_get_default_config(pdco->_offset); + + sm_config_set_set_pins(&pdco->_pio_sm, pdco->_gpio, 1); + pio_gpio_init(pdco->_pio, pdco->_gpio); + pio_sm_init(pdco->_pio, pdco->_ism, pdco->_offset, &pdco->_pio_sm); + pio_sm_set_enabled(pdco->_pio, pdco->_ism, true); return 0; } -int PioDCOSet(piodco *pdco, uint32_t ui32_frq_hz) +int PioDCOSet(PioDco *pdco, uint32_t ui32_frq_hz) { assert_(pdco); assert(pdco->_clkfreq_hz); @@ -27,17 +41,17 @@ int PioDCOSet(piodco *pdco, uint32_t ui32_frq_hz) return 0; } -void PioDCOStart(piodco *pdco) +void PioDCOStart(PioDco *pdco) { } -void PioDCOStop(piodco *pdco) +void PioDCOStop(PioDco *pdco) { } -void PioDCOTick(piodco *pdco) +void PioDCOTick(PioDco *pdco) { } diff --git a/piodco/piodco.h b/piodco/piodco.h index e620ca4..c828888 100644 --- a/piodco/piodco.h +++ b/piodco/piodco.h @@ -6,32 +6,30 @@ #include "pico/stdlib.h" #include "hardware/pio.h" - typedef struct { - //bool _brun; - PIO _pio; /* Worker PIO on this DCO. */ int _gpio; /* Pico' GPIO for DCO output. */ pio_sm_config _pio_sm; /* Worker PIO parameter. */ + int _ism; /* Index of state maschine. */ int _offset; /* Worker PIO u-program offset. */ uint32_t _phase_prompt; /* Last DCO phase val, [0...2PI). */ uint32_t _phase_increment; /* DCO phase increment, per 1 CLK. */ - uint32_t _ui32_pioreg[8]; /* Shift register into PIO. */ + uint32_t _ui32_pioreg[8]; /* Shift register to PIO. */ uint32_t _clkfreq_hz; /* CPU CLK freq, Hz. */ -} piodco; +} PioDco; -int PioDCOInit(piodco *pdco, uint32_t ui32_clock_hz); -int PioDCOSet(piodco *pdco, uint32_t ui32_frq_hz); +int PioDCOInit(PioDco *pdco, uint32_t ui32_clock_hz); +int PioDCOSet(PioDco *pdco, uint32_t ui32_frq_hz); -void PioDCOStart(piodco *pdco); -void PioDCOStop(piodco *pdco); +void PioDCOStart(PioDco *pdco); +void PioDCOStop(PioDco *pdco); -void PioDCOTick(piodco *pdco); +void PioDCOTick(PioDco *pdco); #endif diff --git a/test.c b/test.c index 821ccfb..4321fc5 100644 --- a/test.c +++ b/test.c @@ -5,14 +5,35 @@ #include "build/dco.pio.h" #include "hardware/vreg.h" +#include "./lib/assert.h" +#include "hwdefs.h" +#include "./dcoisr/dcoisr.h" + int main() { - //vreg_set_voltage(VREG_VOLTAGE_1_25); - set_sys_clock_khz(270000, true); + PioDco DCO; + DcoIsrContext ISRC; + + set_sys_clock_khz(PLL_SYS_MHZ * 1000L, true); gpio_init(PICO_DEFAULT_LED_PIN); gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); + assert_(0 == PioDCOInit(&DCO, PLL_SYS_MHZ * 1000000L)); + //DcoIsrInit(&ISRC, &DCO); + + uint32_t pval[8]; + memset((char *)pval, 0x00, 32); + for(;;) + { + gpio_put(PICO_DEFAULT_LED_PIN, 0); + dco_program_puts(DCO._pio, DCO._ism, pval); + + gpio_put(PICO_DEFAULT_LED_PIN, 1); + dco_program_puts(DCO._pio, DCO._ism, pval); + } + +/* const int offset = pio_add_program(pio0, &dco_program); const int ism = pio_claim_unused_sm(pio0, true); @@ -37,6 +58,7 @@ int main() gpio_put(PICO_DEFAULT_LED_PIN, 0); //sleep_ms(1000); } + */ /* pcb->c = bitdco_program_get_default_config(offset); pcb->pio = pio;