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
Now added generate Saw Wave to DAC function in generate(); You will hear Stereo saw wave sound now.
more info: http://www.geocities.jp/micro_diys/i2s_test_sample/i2s_test_sample.html
i2s_dma.cpp@0:dc88722ab141, 2014-07-03 (annotated)
- 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?
User | Revision | Line number | New 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 |