From 1cddbdf08f1e0661db64644c902b7665985f59e1 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 6 Feb 2022 20:37:15 +0100 Subject: [PATCH] test-display: IR test --- test-display/config.h | 4 ++ test-display/main.c | 94 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 96 insertions(+), 2 deletions(-) diff --git a/test-display/config.h b/test-display/config.h index 312c7be..fe39e28 100644 --- a/test-display/config.h +++ b/test-display/config.h @@ -12,3 +12,7 @@ #define DEBUG_USART USART1 #define DEBUG_LED_BLUEPILL + +// Testing of IR receiver + +#undef IR_TEST diff --git a/test-display/main.c b/test-display/main.c index 8fd5636..a00c20a 100644 --- a/test-display/main.c +++ b/test-display/main.c @@ -55,6 +55,9 @@ static void gpio_init(void) // PB7 = SDA for display controller // PB6 = SCL for display controller gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_OPENDRAIN, GPIO6 | GPIO7); + + // PB8 = SFH5110 output (5V tolerant) + gpio_set_mode(GPIOC, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO8); } static void usart_init(void) @@ -118,7 +121,7 @@ static byte ctrl = 0x56; static void display_update(void) { - debug_puts("Display pdate\n"); + debug_puts("Display update\n"); byte cmds[4]; cmds[0] = 0; cmds[1] = ctrl; @@ -390,14 +393,101 @@ static void usb_init(void) usb_event_pending = 1; } +/*** Testing of IR receiver ***/ + +#ifdef IR_TEST + +static u16 get_bit(void) +{ +#if 1 + return !gpio_get(GPIOB, GPIO8); +#else + int x = 0; + x += !gpio_get(GPIOB, GPIO8); + x += !gpio_get(GPIOB, GPIO8); + x += !gpio_get(GPIOB, GPIO8); + x += !gpio_get(GPIOB, GPIO8); + return x >= 2; +#endif +} + +#define MAX_SAMPLES 1024 +u32 samples[MAX_SAMPLES]; + +static void ir_test_loop(void) +{ + debug_puts("\n\n### Infrared Remote Control receiver ###\n\n"); + + systick_set_reload(0xffffff); + systick_counter_enable(); + systick_interrupt_disable(); + systick_clear(); + + for (;;) { + gpio_set(GPIOC, GPIO13); + + if (get_bit()) { + debug_puts("Waiting for silence\n"); + while (get_bit()) + ; + } + debug_puts("Ready..."); + + u16 last = 0; + uint nsamp = 0; + u32 start; + + do { + start = systick_get_value(); + last = get_bit(); + } while (!last); + + gpio_clear(GPIOC, GPIO13); + + for (;;) { + u32 now; + u16 curr; + uint len; + do { + now = systick_get_value(); + len = (start - now) & 0xffffff; + if (len > 5000000) { + samples[nsamp++] = len; + goto timeout; + } + curr = get_bit(); + } while (curr == last); + samples[nsamp++] = len; + if (nsamp >= MAX_SAMPLES) + break; + start = now; + last = curr; + } + + timeout: + for (uint i=0; i