From 876518391a0061913d7cd1bf5ffc32210f1e3c9f Mon Sep 17 00:00:00 2001 From: drowe67 Date: Thu, 7 Aug 2014 07:21:14 +0000 Subject: [PATCH] dac driver now scales to DAC limits with buffer enabled, variable size dac FIFOs to accomodate UTs, sounds Ok on speech signals now git-svn-id: https://svn.code.sf.net/p/freetel/code@1787 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/stm32/inc/stm32f4_dac.h | 4 ++- codec2-dev/stm32/src/dac_play.c | 4 +-- codec2-dev/stm32/src/dac_ut.c | 2 +- codec2-dev/stm32/src/power_ut.c | 2 +- codec2-dev/stm32/src/sm1000_main.c | 2 +- codec2-dev/stm32/src/stm32f4_dac.c | 48 +++++++++++++++++------------- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/codec2-dev/stm32/inc/stm32f4_dac.h b/codec2-dev/stm32/inc/stm32f4_dac.h index 9950f36a..d0b82592 100644 --- a/codec2-dev/stm32/inc/stm32f4_dac.h +++ b/codec2-dev/stm32/inc/stm32f4_dac.h @@ -28,7 +28,9 @@ #ifndef __STM32F4_DAC__ #define __STM32F4_DAC__ -void dac_open(void); +#define DAC_BUF_SZ 320 + +void dac_open(int fifo_sz); int dac1_write(short buf[], int n); /* DAC1 pin PA4 */ int dac2_write(short buf[], int n); /* DAC2 pin PA5 */ diff --git a/codec2-dev/stm32/src/dac_play.c b/codec2-dev/stm32/src/dac_play.c index afed3f8c..a8a1565f 100644 --- a/codec2-dev/stm32/src/dac_play.c +++ b/codec2-dev/stm32/src/dac_play.c @@ -29,13 +29,13 @@ #include "stm32f4_dac.h" #include "gdb_stdio.h" -#define N 2000 +#define N (5*DAC_BUF_SZ) int main(void) { short buf[N]; FILE *fplay; - dac_open(); + dac_open(2*N); while(1) { fplay = fopen("stm_in.raw", "rb"); diff --git a/codec2-dev/stm32/src/dac_ut.c b/codec2-dev/stm32/src/dac_ut.c index 039c6da3..40b13a44 100644 --- a/codec2-dev/stm32/src/dac_ut.c +++ b/codec2-dev/stm32/src/dac_ut.c @@ -44,7 +44,7 @@ short aSine[] = { }; int main(void) { - dac_open(); + dac_open(4*DAC_BUF_SZ); while (1) { diff --git a/codec2-dev/stm32/src/power_ut.c b/codec2-dev/stm32/src/power_ut.c index a42286ea..416fc956 100644 --- a/codec2-dev/stm32/src/power_ut.c +++ b/codec2-dev/stm32/src/power_ut.c @@ -122,7 +122,7 @@ int main(int argc, char *argv[]) { gpio_init(); machdep_timer_init (); adc_open(); - dac_open(); + dac_open(4*DAC_BUF_SZ); printf("Starting power_ut\n"); diff --git a/codec2-dev/stm32/src/sm1000_main.c b/codec2-dev/stm32/src/sm1000_main.c index 90c926c8..ed930fdd 100644 --- a/codec2-dev/stm32/src/sm1000_main.c +++ b/codec2-dev/stm32/src/sm1000_main.c @@ -38,7 +38,7 @@ int main(void) { /* init all the drivers for various peripherals */ sm1000_leds_switches_init(); - dac_open(); + dac_open(4*DAC_BUF_SZ); adc_open(); f = freedv_open(FREEDV_MODE_1600); diff --git a/codec2-dev/stm32/src/stm32f4_dac.c b/codec2-dev/stm32/src/stm32f4_dac.c index 31fa7348..3f0d520c 100644 --- a/codec2-dev/stm32/src/stm32f4_dac.c +++ b/codec2-dev/stm32/src/stm32f4_dac.c @@ -35,13 +35,19 @@ /* write to these registers for 12 bit left aligned data, as per data sheet make sure 4 least sig bits set to 0 */ -#define DAC_DHR12L1_ADDRESS 0x4000740c -#define DAC_DHR12L2_ADDRESS 0x40007418 +#define DAC_DHR12R1_ADDRESS 0x40007408 +#define DAC_DHR12R2_ADDRESS 0x40007414 -#define DAC_BUF_SZ 320 -#define FIFO_SZ 4*DAC_BUF_SZ #define DAC_MAX 4096 /* maximum amplitude */ +/* y=mx+c mapping of samples16 bit shorts to DAC samples. Table: 74 + of data sheet indicates With DAC buffer on, DAC range is limited to + 0x0E0 to 0xF1C at VREF+ = 3.6 V, we have Vref=3.3V which is close. + */ + +#define M ((3868.0-224.0)/65536.0) +#define C 2047.0 + static struct FIFO *dac1_fifo; static struct FIFO *dac2_fifo; @@ -54,15 +60,15 @@ static void dac2_config(void); int dac_underflow; -void dac_open(void) { +void dac_open(int fifo_size) { memset(dac1_buf, 32768, sizeof(short)*DAC_BUF_SZ); memset(dac2_buf, 32768, sizeof(short)*DAC_BUF_SZ); /* Create fifos */ - dac1_fifo = fifo_create(FIFO_SZ); - dac2_fifo = fifo_create(FIFO_SZ); + dac1_fifo = fifo_create(fifo_size); + dac2_fifo = fifo_create(fifo_size); assert(dac1_fifo != NULL); assert(dac2_fifo != NULL); @@ -155,7 +161,7 @@ static void dac1_config(void) DMA_DeInit(DMA1_Stream5); DMA_InitStructure.DMA_Channel = DMA_Channel_7; - DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12L1_ADDRESS; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R1_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac1_buf; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ; @@ -213,7 +219,7 @@ static void dac2_config(void) DMA_DeInit(DMA1_Stream6); DMA_InitStructure.DMA_Channel = DMA_Channel_7; - DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12L2_ADDRESS; + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R2_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac2_buf; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ; @@ -266,7 +272,7 @@ static void dac2_config(void) */ void DMA1_Stream5_IRQHandler(void) { - int i, sam; + int i, j, sam; short signed_buf[DAC_BUF_SZ/2]; /* Transfer half empty interrupt - refill first half */ @@ -282,8 +288,8 @@ void DMA1_Stream5_IRQHandler(void) { /* convert to unsigned */ for(i=0; i