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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers i2s_dma.cpp Source File

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