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
i2s_dma.cpp
00001 #include "synthesizer.h" 00002 00003 extern Serial pc; 00004 extern DigitalOut myled; 00005 00006 extern I2S_HandleTypeDef hi2s2; 00007 extern DMA_HandleTypeDef hdma_i2s2_ext_tx; 00008 00009 00010 S16 DMA_Buffer[DMA_BUFFERSIZE]; 00011 //S16 * DMA_Buffer = (S16 *)0x20008000; 00012 __IO BUFFER_StateTypeDef BufferOffset = DMA_Idle; 00013 00014 00015 static const PinMap PinMap_I2S_MCK[] = { 00016 {PC_6, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, 00017 // {PC_7, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, 00018 {NC, NC, 0} 00019 }; 00020 00021 static const PinMap PinMap_I2S_CK[] = { 00022 {PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, 00023 {PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, 00024 // {PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, 00025 // {PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, 00026 {NC, NC, 0} 00027 }; 00028 00029 static const PinMap PinMap_I2S_WS[] = { 00030 {PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, 00031 {PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, 00032 // {PA_15, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, 00033 {NC, NC, 0} 00034 }; 00035 00036 static const PinMap PinMap_I2S_SD[] = { 00037 {PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, 00038 {PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, 00039 // {PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, 00040 // {PD_6, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, 00041 {NC, NC, 0} 00042 }; 00043 00044 00045 00046 void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s) 00047 { 00048 if(hi2s->Instance == I2S2) 00049 { 00050 BufferOffset = DMA_FullComplete; 00051 HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t*)&DMA_Buffer[0], DMA_BUFFERSIZE); 00052 } 00053 } 00054 00055 void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s) 00056 { 00057 if(hi2s->Instance == I2S2) BufferOffset = DMA_HalfComplete; 00058 } 00059 00060 00061 00062 void init_dmabuffer(void){ 00063 int16_t *ptr0 = (int16_t*)&DMA_Buffer[0]; 00064 for (int i =0;i < DMA_BUFFERSIZE/2 ;i++){ 00065 *ptr0++ = 0;// Lch 00066 *ptr0++ = 0;// Rch 00067 } 00068 } 00069 00070 00071 void i2s_dma_init(void) { 00072 pinmap_pinout(PC_6, PinMap_I2S_MCK); 00073 pinmap_pinout(PB_13, PinMap_I2S_CK); 00074 pinmap_pinout(PB_12, PinMap_I2S_WS); 00075 pinmap_pinout(PB_15, PinMap_I2S_SD); 00076 00077 pin_mode(PC_6, PullUp); 00078 pin_mode(PB_13, PullUp); 00079 pin_mode(PB_12, PullUp); 00080 pin_mode(PB_15, PullUp); 00081 00082 init_dmabuffer(); 00083 00084 HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t *)&DMA_Buffer[0],DMA_BUFFERSIZE / 2); 00085 00086 /* for debug */ 00087 /* 00088 pc.printf("DMA CR =%4x \n\r" ,DMA1_Stream4->CR); 00089 pc.printf("DMA FCR =%4x \n\r" ,DMA1_Stream4->FCR); 00090 00091 pc.printf("DMA M0AR =%4x M1AR =%4x PAR = %4x \n\r" ,DMA1_Stream4->M0AR ,DMA1_Stream4->M1AR ,DMA1_Stream4->PAR); 00092 pc.printf("I2S CR2 = %4x \n\r" ,SPI2->CR2); 00093 pc.printf("I2S SR = %4x \n\r" ,SPI2->SR); 00094 pc.printf("I2S I2SCFGR = %4x \n\r" ,SPI2->I2SCFGR); 00095 pc.printf("I2S I2SPR = %4x \n\r" ,SPI2->I2SPR); 00096 pc.printf("RCC->PLLI2SCFGR = %4x \n\r" ,RCC->PLLI2SCFGR); 00097 */ 00098 00099 // HAL_RCC_MCOConfig(uint32_t RCC_MCO2, RCC_MCO2SOURCE_PLLI2SCLK, RCC_MCODIV_5); 00100 } 00101
Generated on Wed Jul 13 2022 10:27:32 by 1.7.2