diff --git a/src/cli/dragonzap.c b/src/cli/dragonzap.c index 4f21195..92853a4 100644 --- a/src/cli/dragonzap.c +++ b/src/cli/dragonzap.c @@ -8,16 +8,6 @@ void cli_dragonzap_test(void); void cli_dragonzap_test(void) { - // TODO: test: - // * ADC0,1,2 input - // -> ADC0,1: OK - // -> ADC2: ≃0xB80 is 5.04V; not ≃0xC38? - // 2.48V measured at ADC2 pin... - // * DAC control - // * MAX4619 control (enable, switch) - // * crowbar 1,2 control - // * NXS0108 functionality - zap_init_default(); zap_dac_set_enable(zap_dac_a | zap_dac_b); zap_dac_set_mulx2(zap_dac_a | zap_dac_b); @@ -29,13 +19,13 @@ void cli_dragonzap_test(void) { } while (true) { - uint16_t adcv[3]; - for (int i = 0; i < 3; ++i) { + uint16_t adcv[2]; + for (int i = 0; i < 2; ++i) { adcv[i] = zap_adc_read(i); } - uint32_t vbus = zap_adc_get_vbus(); - float vbusf = vbus / (float)0x10000; - printf("ADC: 0x%04x, 0x%04x, 0x%04x = %.2f\n", adcv[0], adcv[1], adcv[2], vbusf); + /*uint32_t vbus = zap_adc_get_vbus(); + float vbusf = vbus / (float)0x10000;*/ + printf("ADC: 0x%04x, 0x%04x"/*", 0x%04x = %.2f"*/"\n", adcv[0], adcv[1]/*, adcv[2], vbusf*/); zap_dac_set_a(adcv[0]); zap_dac_set_b(adcv[1]); diff --git a/src/zap/zap.h b/src/zap/zap.h index 5e5ab97..7129953 100644 --- a/src/zap/zap.h +++ b/src/zap/zap.h @@ -23,7 +23,7 @@ enum zap_component { static inline void zap_init(enum zap_component zc) { if (zc & zap_adc) zap_adc_init(); if (zc & zap_crowbar) zap_crowbar_init(); - if (zc & zap_dac) zap_dac_init(); + if (zc & zap_dac) zap_dac_init(false); if (zc & zap_gpio) zap_gpio_init(false, true); if (zc & zap_max4619) zap_max_init(false, false); if (zc & zap_picoemp) zap_picoemp_init(); diff --git a/src/zap/zap_adc.c b/src/zap/zap_adc.c index 4b635a8..a9327c2 100644 --- a/src/zap/zap_adc.c +++ b/src/zap/zap_adc.c @@ -12,11 +12,11 @@ void zap_adc_init(void) { adc_gpio_init(ZAP_ADC_A); adc_gpio_init(ZAP_ADC_B); - adc_gpio_init(ZAP_ADC_REF); + //adc_gpio_init(ZAP_ADC_REF); } uint16_t zap_adc_read(int idx) { - if (idx < 0 || idx >= 3) return 0xf000; + if (idx < 0 || idx >= 2/*3*/) return 0xf000; adc_select_input(idx); return adc_read(); diff --git a/src/zap/zap_adc.h b/src/zap/zap_adc.h index f78fcac..6cb6791 100644 --- a/src/zap/zap_adc.h +++ b/src/zap/zap_adc.h @@ -16,16 +16,16 @@ static inline uint16_t zap_adc_read_b(void) { return zap_adc_read(1); } // sadly uuuh in practice it's 'a bit' noisy, assuming Vbus = 5V is // often more reliable than hand-tuning with this value, due to ADC // inaccuracies, mismatch between R500 and R501, and so on... -static inline uint32_t zap_adc_get_vbus(void) { - // Vbus value, 0x0fff = 3V3 - // (ADC2 value is Vbus divided down by 2) - uint32_t vbus = (zap_adc_read(2) + 0x57/*hacky offset correction*/) * 2; - - // shouldn't overflow - uint32_t vbusf = (vbus * (uint32_t)(3.3f * 0x10000)) / 0xfff; - - return vbusf; -} +//static inline uint32_t zap_adc_get_vbus(void) { +// // Vbus value, 0x0fff = 3V3 +// // (ADC2 value is Vbus divided down by 2) +// uint32_t vbus = (zap_adc_read(2) + 0x57/*hacky offset correction*/) * 2; +// +// // shouldn't overflow +// uint32_t vbusf = (vbus * (uint32_t)(3.3f * 0x10000)) / 0xfff; +// +// return vbusf; +//} #endif diff --git a/src/zap/zap_dac.c b/src/zap/zap_dac.c index 95693e1..0f71cd4 100644 --- a/src/zap/zap_dac.c +++ b/src/zap/zap_dac.c @@ -13,19 +13,22 @@ static enum zap_dac_ch gain, enable; static uint16_t va, vb; -void zap_dac_init(void) { +void zap_dac_init(bool shdn) { spi_init(ZAP_DAC_SPI, 1*1000*1000); // TODO: can we go higher? spi_set_format(ZAP_DAC_SPI, 16, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST); gpio_put(ZAP_DAC_NLATCH, true); gpio_put(ZAP_DAC_CS , true); + //gpio_put(ZAP_DAC_NSHDN , !shdn); gpio_set_dir(ZAP_DAC_NLATCH, GPIO_OUT); gpio_set_dir(ZAP_DAC_CS , GPIO_OUT); + //gpio_set_dir(ZAP_DAC_NSHDN , GPIO_OUT); gpio_set_function(ZAP_DAC_SCLK , GPIO_FUNC_SPI); gpio_set_function(ZAP_DAC_TX , GPIO_FUNC_SPI); gpio_set_function(ZAP_DAC_NLATCH, GPIO_FUNC_SIO); gpio_set_function(ZAP_DAC_CS , GPIO_FUNC_SIO); + //gpio_set_function(ZAP_DAC_NSHDN , GPIO_FUNC_SIO); enable = 0; gain = 3; // 1x for both @@ -34,9 +37,15 @@ void zap_dac_init(void) { } static void zap_flush(enum zap_dac_ch ch) { + // buffer is always enabled (in MCP49x2 case, doesn't exist in MCP48x2): + // limited BW isn't really an issue (we use the MAX4619 for that anyway), + // and output swing is also limited by the output buffer which has the same + // limitation. so, shrug + if (ch & zap_dac_a) { uint16_t v = va; v |= 0x8000*0; // channel A + v |= 0x4000; // buffered (MCP49x2, don't care on 48x2) if (gain & zap_dac_a) v |= 0x2000; if (enable & zap_dac_a) v |= 0x1000; @@ -49,6 +58,7 @@ static void zap_flush(enum zap_dac_ch ch) { if (ch & zap_dac_b) { uint16_t v = vb; v |= 0x8000*1; // channel B + v |= 0x4000; // buffered (MCP49x2, don't care on 48x2) if (gain & zap_dac_b) v |= 0x2000; if (enable & zap_dac_b) v |= 0x1000; diff --git a/src/zap/zap_dac.h b/src/zap/zap_dac.h index ebb860d..2f798ea 100644 --- a/src/zap/zap_dac.h +++ b/src/zap/zap_dac.h @@ -5,12 +5,17 @@ #include #include +#include + +#include "zap_pinout.h" + enum zap_dac_ch { zap_dac_a = 1, zap_dac_b = 2 }; -void zap_dac_init(void); +// "shdn": only relevant for MCP49x2 +void zap_dac_init(bool shdn); enum zap_dac_ch zap_dac_get_enable(void); void zap_dac_set_enable(enum zap_dac_ch ch); @@ -21,6 +26,11 @@ uint16_t zap_dac_get_b(void); void zap_dac_set_a(uint16_t a); void zap_dac_set_b(uint16_t b); +// only relevant for MCP49x2 +static inline void zap_dac_set_shutdown(bool shdn) { + //gpio_put(ZAP_DAC_NSHDN, !shdn); +} + static inline void zap_dac_set(uint16_t a, uint16_t b) { zap_dac_set_a(a); zap_dac_set_b(b); diff --git a/src/zap/zap_pinout.h b/src/zap/zap_pinout.h index f2edf0e..fce7272 100644 --- a/src/zap/zap_pinout.h +++ b/src/zap/zap_pinout.h @@ -20,10 +20,11 @@ #define ZAP_DAC_SCLK 18 #define ZAP_DAC_TX 19 #define ZAP_DAC_CS 20 +#define ZAP_DAC_NSHDN 28 #define ZAP_ADC_A 26 #define ZAP_ADC_B 27 -#define ZAP_ADC_REF 28 +/*#define ZAP_ADC_REF 28*/ #define ZAP_PICOEMP_PWM 14 #define ZAP_PICOEMP_CHG 15