Part of MicroGen4 Music Synthesizer Program. (But not test it yet.) I2S ,DMA ,Stereo ,16Bit Dac(PCM1781) See detail: http://www.geocities.jp/micro_diys/index2

Dependencies:   mbed

Now added generate Saw Wave to DAC function in generate(); You will hear Stereo saw wave sound now. /media/uploads/p_igmon/i2s_sample_test_audacity.png

more info: http://www.geocities.jp/micro_diys/i2s_test_sample/i2s_test_sample.html

Revision:
0:dc88722ab141
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i2s_dma.cpp	Thu Jul 03 11:59:07 2014 +0000
@@ -0,0 +1,101 @@
+#include "synthesizer.h"
+
+extern Serial pc;
+extern DigitalOut myled;
+
+extern I2S_HandleTypeDef hi2s2;
+extern DMA_HandleTypeDef hdma_i2s2_ext_tx;
+
+
+S16 DMA_Buffer[DMA_BUFFERSIZE];
+//S16 * DMA_Buffer = (S16 *)0x20008000;
+__IO BUFFER_StateTypeDef BufferOffset = DMA_Idle;
+
+
+static const PinMap PinMap_I2S_MCK[] = {
+    {PC_6,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
+//    {PC_7,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
+    {NC,    NC,    0}
+};
+
+static const PinMap PinMap_I2S_CK[] = {
+    {PB_10,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
+    {PB_13,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
+//    {PD_3,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
+//    {PC_10,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
+    {NC,    NC,    0}
+};
+
+static const PinMap PinMap_I2S_WS[] = {
+    {PB_12,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
+    {PB_9,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
+//    {PA_15,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
+    {NC,    NC,    0}
+};
+
+static const PinMap PinMap_I2S_SD[] = {
+    {PC_3,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
+    {PB_15,  SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
+//    {PC_12,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
+//    {PD_6,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)},
+    {NC,    NC,    0}
+};
+
+
+
+void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s)
+{
+  if(hi2s->Instance == I2S2)
+  {
+    BufferOffset = DMA_FullComplete;
+    HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t*)&DMA_Buffer[0], DMA_BUFFERSIZE); 
+  }
+}
+
+void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
+{
+    if(hi2s->Instance == I2S2) BufferOffset = DMA_HalfComplete;
+}
+
+
+
+void init_dmabuffer(void){
+    int16_t *ptr0 = (int16_t*)&DMA_Buffer[0];
+    for (int i =0;i < DMA_BUFFERSIZE/2 ;i++){
+        *ptr0++ = 0;// Lch 
+        *ptr0++ = 0;// Rch 
+    }
+}
+
+   
+void i2s_dma_init(void) {
+    pinmap_pinout(PC_6, PinMap_I2S_MCK);
+    pinmap_pinout(PB_13, PinMap_I2S_CK);
+    pinmap_pinout(PB_12, PinMap_I2S_WS);
+    pinmap_pinout(PB_15, PinMap_I2S_SD);
+
+    pin_mode(PC_6, PullUp);
+    pin_mode(PB_13, PullUp);
+    pin_mode(PB_12, PullUp);
+    pin_mode(PB_15, PullUp);
+
+    init_dmabuffer();
+
+    HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t *)&DMA_Buffer[0],DMA_BUFFERSIZE / 2); 
+
+/*   for debug */
+/*
+    pc.printf("DMA CR =%4x \n\r"  ,DMA1_Stream4->CR);
+    pc.printf("DMA FCR =%4x \n\r"  ,DMA1_Stream4->FCR);
+
+    pc.printf("DMA M0AR =%4x M1AR =%4x PAR = %4x \n\r"  ,DMA1_Stream4->M0AR  ,DMA1_Stream4->M1AR ,DMA1_Stream4->PAR);
+    pc.printf("I2S CR2 = %4x \n\r" ,SPI2->CR2);
+    pc.printf("I2S SR = %4x \n\r" ,SPI2->SR);
+    pc.printf("I2S I2SCFGR = %4x \n\r" ,SPI2->I2SCFGR);
+    pc.printf("I2S I2SPR = %4x \n\r" ,SPI2->I2SPR);
+    pc.printf("RCC->PLLI2SCFGR = %4x \n\r" ,RCC->PLLI2SCFGR);
+*/
+ 
+//    HAL_RCC_MCOConfig(uint32_t RCC_MCO2, RCC_MCO2SOURCE_PLLI2SCLK, RCC_MCODIV_5);
+}
+