Guest User

Untitled

a guest
Jun 22nd, 2021
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.62 KB | None | 0 0
  1. /*
  2.  * AUDIO_SELECTOR_FACTORY.c
  3.  *
  4.  *  Created on: May 3, 2021
  5.  *      Author: Christopher
  6.  */
  7.  
  8. #include <dspFactory.h>
  9. #include <i2sFactory.h>
  10. #include <inputSourceFactory.h>
  11. #include <opcode.h>
  12. #include "stm32h753xx.h"
  13.  
  14.  
  15. void INPUT_AUDIO_SELECTOR (int INPUT_TYPE, int BIT_RATE, int SAMPLING_RATE) {
  16.     RCC->APB2ENR |= (RCC_APB2ENR_SPI1EN);
  17.     RCC->APB1LENR |= (RCC_APB1LENR_SPI3EN);
  18.     //DECONFIG I2S
  19.      SPI1->CR1 |= SPI_CR1_CSUSP;
  20.      SPI3->CR1 |= SPI_CR1_CSUSP;
  21.  
  22.     while (((SPI1->CR1) & (SPI_CR1_CSTART)));
  23.     while (((SPI3->CR1) & (SPI_CR1_CSTART)));
  24.  
  25.     DMA1_Stream0->CR &= ~DMA_SxCR_EN;
  26.     DMA1_Stream1->CR &= ~DMA_SxCR_EN;
  27.     DMA1_Stream3->CR &= ~DMA_SxCR_EN;
  28.  
  29.     SPI1->CR1 &= ~SPI_CR1_SPE;
  30.     SPI3->CR1 &= ~SPI_CR1_SPE;
  31.  
  32.     RCC -> CR &= ~(RCC_CR_PLL2ON);
  33.  
  34.     //CONFIG I2S
  35.  
  36.     switch (SAMPLING_RATE) {
  37.  
  38.     case 192000:
  39.  
  40.         RCC -> PLLCKSELR &= ~(RCC_PLLCKSELR_DIVM2);
  41.         RCC -> PLLCKSELR |=  (RCC_PLLCKSELR_DIVM2_DIV10);
  42.  
  43.         RCC -> PLL2FRACR = 0;
  44.         RCC -> PLL2FRACR = (RCC_PLL2FRACR_FRACN2_7209);
  45.  
  46.         RCC -> PLLCFGR   &= ~((RCC_PLLCFGR_PLL2VCOSEL) |
  47.                               (RCC_PLLCFGR_PLL2RGE)    |
  48.                               (RCC_PLLCFGR_PLL2FRACEN) |
  49.                               (RCC_PLLCFGR_DIVP2EN)    |
  50.                               (RCC_PLLCFGR_DIVQ2EN)    |
  51.                               (RCC_PLLCFGR_DIVR2EN));
  52.  
  53.         RCC -> PLLCFGR   |= (RCC_PLLCFGR_PLL2VCOSEL_WIDE_RANGE) |
  54.                             (RCC_PLLCFGR_PLL2RGE_8MHz_16MHz)    |
  55.                             (RCC_PLLCFGR_DIVP2EN)               |
  56.                             (RCC_PLLCFGR_PLL2FRACEN);
  57.  
  58.         RCC -> PLL2DIVR  &= ~((RCC_PLL2DIVR_N2) |
  59.                               (RCC_PLL2DIVR_P2));
  60.  
  61.         RCC -> PLL2DIVR  |= (RCC_PLL2DIVR_N2_122) |
  62.                             (RCC_PLL2DIVR_P2_4);
  63.  
  64.  
  65.  
  66.                break;
  67.     case 96000:
  68.  
  69.         RCC -> PLLCKSELR &= ~(RCC_PLLCKSELR_DIVM2);
  70.         RCC -> PLLCKSELR |=  (RCC_PLLCKSELR_DIVM2_DIV10);
  71.  
  72.         RCC -> PLL2FRACR = 0;
  73.         RCC -> PLL2FRACR = (RCC_PLL2FRACR_FRACN2_7209);
  74.  
  75.         RCC -> PLLCFGR   &= ~((RCC_PLLCFGR_PLL2VCOSEL) |
  76.                               (RCC_PLLCFGR_PLL2RGE)    |
  77.                               (RCC_PLLCFGR_PLL2FRACEN) |
  78.                               (RCC_PLLCFGR_DIVP2EN)    |
  79.                               (RCC_PLLCFGR_DIVQ2EN)    |
  80.                               (RCC_PLLCFGR_DIVR2EN));
  81.  
  82.         RCC -> PLLCFGR   |= (RCC_PLLCFGR_PLL2VCOSEL_WIDE_RANGE) |
  83.                             (RCC_PLLCFGR_PLL2RGE_8MHz_16MHz)    |
  84.                             (RCC_PLLCFGR_DIVP2EN)               |
  85.                             (RCC_PLLCFGR_PLL2FRACEN);
  86.  
  87.         RCC -> PLL2DIVR  &= ~((RCC_PLL2DIVR_N2) |
  88.                               (RCC_PLL2DIVR_P2));
  89.  
  90.         RCC -> PLL2DIVR  |= (RCC_PLL2DIVR_N2_122) |
  91.                             (RCC_PLL2DIVR_P2_8);
  92.  
  93.  
  94.               break;
  95.     case 48000:
  96.  
  97.         RCC -> PLLCKSELR &= ~(RCC_PLLCKSELR_DIVM2);
  98.         RCC -> PLLCKSELR |=  (RCC_PLLCKSELR_DIVM2_DIV4);
  99.  
  100.         RCC -> PLL2FRACR = 0;
  101.         RCC -> PLL2FRACR = (RCC_PLL2FRACR_FRACN2_1835);
  102.  
  103.         RCC -> PLLCFGR   &= ~((RCC_PLLCFGR_PLL2VCOSEL) |
  104.                               (RCC_PLLCFGR_PLL2RGE)    |
  105.                               (RCC_PLLCFGR_PLL2FRACEN) |
  106.                               (RCC_PLLCFGR_DIVP2EN)    |
  107.                               (RCC_PLLCFGR_DIVQ2EN)    |
  108.                               (RCC_PLLCFGR_DIVR2EN));
  109.  
  110.         RCC -> PLLCFGR   |= (RCC_PLLCFGR_PLL3VCOSEL_WIDE_RANGE) |
  111.                             (RCC_PLLCFGR_PLL3RGE_8MHz_16MHz)    |
  112.                             (RCC_PLLCFGR_DIVP3EN)               |
  113.                             (RCC_PLLCFGR_PLL3FRACEN);
  114.  
  115.         RCC -> PLL3DIVR  &= ~((RCC_PLL3DIVR_N3) |
  116.                               (RCC_PLL3DIVR_P3));
  117.  
  118.         RCC -> PLL3DIVR  |= (RCC_PLL3DIVR_N3_52) |
  119.                             (RCC_PLL3DIVR_P3_17);
  120.  
  121.  
  122.                break;
  123.     case 44100:
  124.  
  125.         RCC -> PLLCKSELR &= ~(RCC_PLLCKSELR_DIVM2);
  126.         RCC -> PLLCKSELR |=  (RCC_PLLCKSELR_DIVM2_DIV4);
  127.  
  128.         RCC -> PLL2FRACR = 0;
  129.         RCC -> PLL2FRACR = (RCC_PLL2FRACR_FRACN2_1835);
  130.  
  131.         RCC -> PLLCFGR   &= ~((RCC_PLLCFGR_PLL2VCOSEL) |
  132.                               (RCC_PLLCFGR_PLL2RGE)    |
  133.                               (RCC_PLLCFGR_PLL2FRACEN) |
  134.                               (RCC_PLLCFGR_DIVP2EN)    |
  135.                               (RCC_PLLCFGR_DIVQ2EN)    |
  136.                               (RCC_PLLCFGR_DIVR2EN));
  137.  
  138.         RCC -> PLLCFGR   |= (RCC_PLLCFGR_PLL2VCOSEL_WIDE_RANGE) |
  139.                             (RCC_PLLCFGR_PLL2RGE_8MHz_16MHz)    |
  140.                             (RCC_PLLCFGR_DIVP2EN)               |
  141.                             (RCC_PLLCFGR_PLL2FRACEN);
  142.  
  143.         RCC -> PLL2DIVR  &= ~((RCC_PLL2DIVR_N2) |
  144.                               (RCC_PLL2DIVR_P2));
  145.  
  146.         RCC -> PLL2DIVR  |= (RCC_PLL2DIVR_N2_28) |
  147.                             (RCC_PLL2DIVR_P2_10);
  148.  
  149.  
  150.                break;
  151.  
  152.     }
  153.  
  154.     RCC -> D2CCIP1R &= ~(RCC_D2CCIP1R_SPI123SEL);
  155.     RCC -> D2CCIP1R |=  (RCC_D2CCIP1R_SPI123SEL_PLL2_P_CK);
  156.  
  157.     RCC -> CR &= ~(RCC_CR_PLL2ON);
  158.     RCC -> CR |=  (RCC_CR_PLL2ON);
  159.  
  160.     while (!((RCC -> CR) & (RCC_CR_PLL2RDY)));
  161.  
  162.  
  163.     SPI1->I2SCFGR = 0x00;
  164.     SPI1->CFG1 &= ~((SPI_CFG1_RXDMAEN) |
  165.                     (SPI_CFG1_TXDMAEN));
  166.  
  167.                      SPI1->CFG1 |= (SPI_CFG1_RXDMAEN) |
  168.                                    (SPI_CFG1_TXDMAEN);
  169.                      SPI1->I2SCFGR |= (SPI_I2SCFGR_MCKOE)              |
  170.                                       (SPI_I2SCFGR_I2SDIV_2)           |
  171.                                       (SPI_I2SCFGR_DATFMT_LEFT)        |
  172.                                       (SPI_I2SCFGR_I2SSTD_I2S)         |
  173.                                       (SPI_I2SCFGR_I2SCFG_MASTER_FULLDUPLEX) |
  174.                                       (SPI_I2SCFGR_I2SMOD_I2S);
  175.  
  176.                     SPI3->I2SCFGR = 0x00;
  177.                     SPI3->CFG1 &= ~((SPI_CFG1_RXDMAEN) |
  178.                                     (SPI_CFG1_TXDMAEN));
  179.  
  180.                                          SPI3->CFG1 |= (SPI_CFG1_TXDMAEN);
  181.                                          SPI3->I2SCFGR |= (SPI_I2SCFGR_MCKOE)              |
  182.                                                           (SPI_I2SCFGR_I2SDIV_2)           |
  183.                                                           (SPI_I2SCFGR_DATFMT_LEFT)        |
  184.                                                           (SPI_I2SCFGR_I2SSTD_I2S)         |
  185.                                                           (SPI_I2SCFGR_I2SCFG_MASTER_TRANSMIT) |
  186.                                                           (SPI_I2SCFGR_I2SMOD_I2S);
  187.  
  188.     switch (INPUT_TYPE) {
  189.  
  190.     case input_Source_Inline:
  191.  
  192.         /* SPI1->CR1 |= SPI_CR1_CSUSP;
  193.          while (!((SPI1->CR1) & (SPI_CR1_CSTART)));
  194.          DMA1_Stream0->CR &= ~DMA_SxCR_EN;
  195.          DMA1_Stream1->CR &= ~DMA_SxCR_EN;
  196.          SPI1->CR1 &= ~SPI_CR1_SPE; */
  197.  
  198.  
  199.  
  200.         break;
  201.  
  202.  
  203.     case input_Source_Bluetooth:
  204.          //Disable everything else besides BT
  205.         break;
  206.     }
  207.  
  208.     switch (BIT_RATE) {
  209.  
  210.     case 16:
  211.             SPI1->I2SCFGR |= (SPI_I2SCFGR_DATLEN_16BIT);
  212.             SPI1->I2SCFGR |= (SPI_I2SCFGR_CHLEN_32BIT);
  213.  
  214.             SPI3->I2SCFGR |= (SPI_I2SCFGR_DATLEN_16BIT);
  215.             SPI3->I2SCFGR |= (SPI_I2SCFGR_CHLEN_32BIT);
  216.             break;
  217.  
  218.     case 24:
  219.             SPI1->I2SCFGR |= (SPI_I2SCFGR_DATLEN_24BIT);
  220.             SPI1->I2SCFGR |= (SPI_I2SCFGR_CHLEN_32BIT);
  221.  
  222.             SPI3->I2SCFGR |= (SPI_I2SCFGR_DATLEN_24BIT);
  223.             SPI3->I2SCFGR |= (SPI_I2SCFGR_CHLEN_32BIT);
  224.             break;
  225.  
  226.         }
  227.  
  228.      DMA1_Stream0->CR |= DMA_SxCR_EN;
  229.      DMA1_Stream1->CR |= DMA_SxCR_EN;
  230.      DMA1_Stream3->CR |= DMA_SxCR_EN;
  231.  
  232.      SPI1->CR1 |= SPI_CR1_SPE;
  233.      SPI1->CR1 |= SPI_CR1_CSTART;
  234.  
  235.      SPI3->CR1 |= SPI_CR1_SPE;
  236.      SPI3->CR1 |= SPI_CR1_CSTART;
  237.      SET_I2S_INTERRUPT();
  238.  
  239. }
  240.  
  241. void audioSelectorInlineHandler() {
  242.     init_audioProfile(input_Source_Inline);
  243.     INPUT_AUDIO_SELECTOR(input_Source_Inline, 24, 96000);
  244. }
  245.  
  246. void audioSelectorBluetoothHandler() {
  247. //INPUT_AUDIO_SELECTOR(input_Source_Bluetooth, 16, 44100);
  248. }
  249.  
Advertisement
Add Comment
Please, Sign In to add comment