/* write to these registers for 12 bit left aligned data, as per data sheet \r
make sure 4 least sig bits set to 0 */\r
\r
-#define DAC_DHR12L1_ADDRESS 0x4000740c\r
-#define DAC_DHR12L2_ADDRESS 0x40007418\r
+#define DAC_DHR12R1_ADDRESS 0x40007408\r
+#define DAC_DHR12R2_ADDRESS 0x40007414\r
\r
-#define DAC_BUF_SZ 320\r
-#define FIFO_SZ 4*DAC_BUF_SZ\r
#define DAC_MAX 4096 /* maximum amplitude */\r
\r
+/* y=mx+c mapping of samples16 bit shorts to DAC samples. Table: 74\r
+ of data sheet indicates With DAC buffer on, DAC range is limited to\r
+ 0x0E0 to 0xF1C at VREF+ = 3.6 V, we have Vref=3.3V which is close.\r
+ */\r
+\r
+#define M ((3868.0-224.0)/65536.0)\r
+#define C 2047.0\r
+\r
static struct FIFO *dac1_fifo;\r
static struct FIFO *dac2_fifo;\r
\r
\r
int dac_underflow;\r
\r
-void dac_open(void) {\r
+void dac_open(int fifo_size) {\r
\r
memset(dac1_buf, 32768, sizeof(short)*DAC_BUF_SZ);\r
memset(dac2_buf, 32768, sizeof(short)*DAC_BUF_SZ);\r
\r
/* Create fifos */\r
\r
- dac1_fifo = fifo_create(FIFO_SZ);\r
- dac2_fifo = fifo_create(FIFO_SZ);\r
+ dac1_fifo = fifo_create(fifo_size);\r
+ dac2_fifo = fifo_create(fifo_size);\r
assert(dac1_fifo != NULL);\r
assert(dac2_fifo != NULL);\r
\r
\r
DMA_DeInit(DMA1_Stream5);\r
DMA_InitStructure.DMA_Channel = DMA_Channel_7; \r
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12L1_ADDRESS;\r
+ DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R1_ADDRESS;\r
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac1_buf;\r
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;\r
DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ;\r
\r
DMA_DeInit(DMA1_Stream6);\r
DMA_InitStructure.DMA_Channel = DMA_Channel_7; \r
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12L2_ADDRESS;\r
+ DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R2_ADDRESS;\r
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dac2_buf;\r
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;\r
DMA_InitStructure.DMA_BufferSize = DAC_BUF_SZ;\r
*/\r
\r
void DMA1_Stream5_IRQHandler(void) {\r
- int i, sam;\r
+ int i, j, sam;\r
short signed_buf[DAC_BUF_SZ/2];\r
\r
/* Transfer half empty interrupt - refill first half */\r
/* convert to unsigned */\r
\r
for(i=0; i<DAC_BUF_SZ/2; i++) {\r
- sam = (int)signed_buf[i] + 32768;\r
- dac1_buf[i] = (unsigned short)(sam & 0xfff000);\r
+ sam = (int)(M*(float)signed_buf[i] + C);\r
+ dac1_buf[i] = (unsigned short)sam;\r
}\r
\r
/* Clear DMA Stream Transfer Complete interrupt pending bit */\r
\r
/* convert to unsigned */\r
\r
- for(i=0; i<DAC_BUF_SZ/2; i++) {\r
- sam = (int)signed_buf[i] + 32768;\r
- dac1_buf[i+DAC_BUF_SZ/2] = (unsigned short)(sam & 0xfff000);\r
+ for(i=0, j=DAC_BUF_SZ/2; i<DAC_BUF_SZ/2; i++,j++) {\r
+ sam = (int)(M*(float)signed_buf[i] + C);\r
+ dac1_buf[j] = (unsigned short)sam;\r
}\r
\r
/* Clear DMA Stream Transfer Complete interrupt pending bit */\r
*/\r
\r
void DMA1_Stream6_IRQHandler(void) {\r
- int i, sam;\r
+ int i, j, sam;\r
short signed_buf[DAC_BUF_SZ/2];\r
\r
/* Transfer half empty interrupt - refill first half */\r
/* convert to unsigned */\r
\r
for(i=0; i<DAC_BUF_SZ/2; i++) {\r
- sam = (int)signed_buf[i] + 32768;\r
- dac2_buf[i] = (unsigned short)(sam & 0xfff000);\r
+ sam = (int)(M*(float)signed_buf[i] + C);\r
+ dac2_buf[i] = (unsigned short)sam;\r
}\r
\r
/* Clear DMA Stream Transfer Complete interrupt pending bit */\r
\r
/* convert to unsigned */\r
\r
- for(i=0; i<DAC_BUF_SZ/2; i++) {\r
- sam = (int)signed_buf[i] + 32768;\r
- dac2_buf[i+DAC_BUF_SZ/2] = (unsigned short)(sam & 0xfff000);\r
+ for(i=0, j=DAC_BUF_SZ/2; i<DAC_BUF_SZ/2; i++,j++) {\r
+ sam = (int)(M*(float)signed_buf[i] + C);\r
+ dac2_buf[j] = (unsigned short)sam;\r
}\r
\r
/* Clear DMA Stream Transfer Complete interrupt pending bit */\r