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

Committer:
p_igmon
Date:
Thu Jul 03 11:59:07 2014 +0000
Revision:
0:dc88722ab141
Part of MicroGen4 Music Syntesizer program.
; I2S DMA Stereo DAC (PCM1781)
; http://www.geocities.jp/micro_diys/index2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p_igmon 0:dc88722ab141 1 #include "synthesizer.h"
p_igmon 0:dc88722ab141 2
p_igmon 0:dc88722ab141 3 extern Serial pc;
p_igmon 0:dc88722ab141 4 extern DigitalOut myled;
p_igmon 0:dc88722ab141 5
p_igmon 0:dc88722ab141 6 extern I2S_HandleTypeDef hi2s2;
p_igmon 0:dc88722ab141 7 extern DMA_HandleTypeDef hdma_i2s2_ext_tx;
p_igmon 0:dc88722ab141 8
p_igmon 0:dc88722ab141 9
p_igmon 0:dc88722ab141 10 S16 DMA_Buffer[DMA_BUFFERSIZE];
p_igmon 0:dc88722ab141 11 //S16 * DMA_Buffer = (S16 *)0x20008000;
p_igmon 0:dc88722ab141 12 __IO BUFFER_StateTypeDef BufferOffset = DMA_Idle;
p_igmon 0:dc88722ab141 13
p_igmon 0:dc88722ab141 14
p_igmon 0:dc88722ab141 15 static const PinMap PinMap_I2S_MCK[] = {
p_igmon 0:dc88722ab141 16 {PC_6, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
p_igmon 0:dc88722ab141 17 // {PC_7, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
p_igmon 0:dc88722ab141 18 {NC, NC, 0}
p_igmon 0:dc88722ab141 19 };
p_igmon 0:dc88722ab141 20
p_igmon 0:dc88722ab141 21 static const PinMap PinMap_I2S_CK[] = {
p_igmon 0:dc88722ab141 22 {PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
p_igmon 0:dc88722ab141 23 {PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
p_igmon 0:dc88722ab141 24 // {PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
p_igmon 0:dc88722ab141 25 // {PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
p_igmon 0:dc88722ab141 26 {NC, NC, 0}
p_igmon 0:dc88722ab141 27 };
p_igmon 0:dc88722ab141 28
p_igmon 0:dc88722ab141 29 static const PinMap PinMap_I2S_WS[] = {
p_igmon 0:dc88722ab141 30 {PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
p_igmon 0:dc88722ab141 31 {PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
p_igmon 0:dc88722ab141 32 // {PA_15, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
p_igmon 0:dc88722ab141 33 {NC, NC, 0}
p_igmon 0:dc88722ab141 34 };
p_igmon 0:dc88722ab141 35
p_igmon 0:dc88722ab141 36 static const PinMap PinMap_I2S_SD[] = {
p_igmon 0:dc88722ab141 37 {PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
p_igmon 0:dc88722ab141 38 {PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
p_igmon 0:dc88722ab141 39 // {PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
p_igmon 0:dc88722ab141 40 // {PD_6, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)},
p_igmon 0:dc88722ab141 41 {NC, NC, 0}
p_igmon 0:dc88722ab141 42 };
p_igmon 0:dc88722ab141 43
p_igmon 0:dc88722ab141 44
p_igmon 0:dc88722ab141 45
p_igmon 0:dc88722ab141 46 void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s)
p_igmon 0:dc88722ab141 47 {
p_igmon 0:dc88722ab141 48 if(hi2s->Instance == I2S2)
p_igmon 0:dc88722ab141 49 {
p_igmon 0:dc88722ab141 50 BufferOffset = DMA_FullComplete;
p_igmon 0:dc88722ab141 51 HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t*)&DMA_Buffer[0], DMA_BUFFERSIZE);
p_igmon 0:dc88722ab141 52 }
p_igmon 0:dc88722ab141 53 }
p_igmon 0:dc88722ab141 54
p_igmon 0:dc88722ab141 55 void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
p_igmon 0:dc88722ab141 56 {
p_igmon 0:dc88722ab141 57 if(hi2s->Instance == I2S2) BufferOffset = DMA_HalfComplete;
p_igmon 0:dc88722ab141 58 }
p_igmon 0:dc88722ab141 59
p_igmon 0:dc88722ab141 60
p_igmon 0:dc88722ab141 61
p_igmon 0:dc88722ab141 62 void init_dmabuffer(void){
p_igmon 0:dc88722ab141 63 int16_t *ptr0 = (int16_t*)&DMA_Buffer[0];
p_igmon 0:dc88722ab141 64 for (int i =0;i < DMA_BUFFERSIZE/2 ;i++){
p_igmon 0:dc88722ab141 65 *ptr0++ = 0;// Lch
p_igmon 0:dc88722ab141 66 *ptr0++ = 0;// Rch
p_igmon 0:dc88722ab141 67 }
p_igmon 0:dc88722ab141 68 }
p_igmon 0:dc88722ab141 69
p_igmon 0:dc88722ab141 70
p_igmon 0:dc88722ab141 71 void i2s_dma_init(void) {
p_igmon 0:dc88722ab141 72 pinmap_pinout(PC_6, PinMap_I2S_MCK);
p_igmon 0:dc88722ab141 73 pinmap_pinout(PB_13, PinMap_I2S_CK);
p_igmon 0:dc88722ab141 74 pinmap_pinout(PB_12, PinMap_I2S_WS);
p_igmon 0:dc88722ab141 75 pinmap_pinout(PB_15, PinMap_I2S_SD);
p_igmon 0:dc88722ab141 76
p_igmon 0:dc88722ab141 77 pin_mode(PC_6, PullUp);
p_igmon 0:dc88722ab141 78 pin_mode(PB_13, PullUp);
p_igmon 0:dc88722ab141 79 pin_mode(PB_12, PullUp);
p_igmon 0:dc88722ab141 80 pin_mode(PB_15, PullUp);
p_igmon 0:dc88722ab141 81
p_igmon 0:dc88722ab141 82 init_dmabuffer();
p_igmon 0:dc88722ab141 83
p_igmon 0:dc88722ab141 84 HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t *)&DMA_Buffer[0],DMA_BUFFERSIZE / 2);
p_igmon 0:dc88722ab141 85
p_igmon 0:dc88722ab141 86 /* for debug */
p_igmon 0:dc88722ab141 87 /*
p_igmon 0:dc88722ab141 88 pc.printf("DMA CR =%4x \n\r" ,DMA1_Stream4->CR);
p_igmon 0:dc88722ab141 89 pc.printf("DMA FCR =%4x \n\r" ,DMA1_Stream4->FCR);
p_igmon 0:dc88722ab141 90
p_igmon 0:dc88722ab141 91 pc.printf("DMA M0AR =%4x M1AR =%4x PAR = %4x \n\r" ,DMA1_Stream4->M0AR ,DMA1_Stream4->M1AR ,DMA1_Stream4->PAR);
p_igmon 0:dc88722ab141 92 pc.printf("I2S CR2 = %4x \n\r" ,SPI2->CR2);
p_igmon 0:dc88722ab141 93 pc.printf("I2S SR = %4x \n\r" ,SPI2->SR);
p_igmon 0:dc88722ab141 94 pc.printf("I2S I2SCFGR = %4x \n\r" ,SPI2->I2SCFGR);
p_igmon 0:dc88722ab141 95 pc.printf("I2S I2SPR = %4x \n\r" ,SPI2->I2SPR);
p_igmon 0:dc88722ab141 96 pc.printf("RCC->PLLI2SCFGR = %4x \n\r" ,RCC->PLLI2SCFGR);
p_igmon 0:dc88722ab141 97 */
p_igmon 0:dc88722ab141 98
p_igmon 0:dc88722ab141 99 // HAL_RCC_MCOConfig(uint32_t RCC_MCO2, RCC_MCO2SOURCE_PLLI2SCLK, RCC_MCODIV_5);
p_igmon 0:dc88722ab141 100 }
p_igmon 0:dc88722ab141 101