Advertisement
teplofizik

test2.c (i2s)

Aug 7th, 2013
628
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.85 KB | None | 0 0
  1. // ***********************************************************
  2. //  test2.c
  3. //
  4. // ***********************************************************
  5.  
  6. #include "test2.h"
  7. #include "../drivers.h"
  8. #include "../bsp.h"
  9.  
  10. uint16_t Gamma[] = {
  11.     262, // до
  12. //    277, // до#
  13.     294, // ре
  14. //    311, // ре#
  15.     330, // ми
  16.     349, // фа
  17. //    370, // фа#
  18.     392, // соль
  19. //    415, // соль#
  20.     440, // ля
  21. //    466, // ля#
  22.     494, // си
  23.     523  // до
  24. };
  25.  
  26. const uint16_t Prescaler = 20;
  27.  
  28. uint16_t Frequency = 0;
  29. bool     On = false; // состояние левого канала
  30. bool     Ch = true; // текущий канал, первый - левый
  31.  
  32. static void test2_ChangeFrequency(void)
  33. {
  34.     static bool Dir = true; // Направление
  35.     static uint16_t Counter = Prescaler;
  36.    
  37.     // Изменение частоты каждые Prescaler+1 вызовов
  38.     if(Counter)
  39.     {
  40.         // предделитель
  41.         Counter--;
  42.         return;
  43.     }
  44.     else
  45.     {
  46.         Counter = Prescaler;
  47.     }
  48.    
  49.     if(Dir)
  50.     {
  51.         Frequency++;
  52.    
  53.         if(Frequency >= ((sizeof(Gamma) / sizeof(Gamma[0])) - 1))
  54.         {
  55.             Dir = false;
  56.         }
  57.     }
  58.     else
  59.     {
  60.         Frequency--;
  61.        
  62.         if(Frequency == 0)
  63.         {
  64.             Dir = true;
  65.         }
  66.     }
  67. }
  68.  
  69. // Инициализация процесса
  70. void test2_Init(void)
  71. {
  72.     // Таймер, смена частоты звука
  73.     timer_AddFunction(10, &test2_ChangeFrequency);
  74.    
  75.     // Включение внешнего ЦАП и его драйвера
  76.     cs43l22_AudioOn();
  77.    
  78.     // Звук: 43%
  79.     cs43l22_SetVolume(0x70);
  80. }
  81.  
  82. // Левый канал - молчит
  83. static void test2_SendLeft(void)
  84. {
  85.     i2s_Send(0x0000);
  86. }
  87.  
  88. // Правый канал - пищит
  89. static void test2_SendRight(void)
  90. {
  91.     i2s_Send((On) ? 0x7fff : 0x8000);
  92. }
  93.  
  94. // Пора отправлять следующий семпл
  95. static void test2_NextSample(void)
  96. {
  97.     static uint16_t Delay = 0;
  98.    
  99.     // Сменим состояние, если полупериод закончился
  100.     if(!Delay)
  101.     {
  102.         // Частоту берм из таблицы высот
  103.         Delay = 48000UL / Gamma[Frequency] / 2;
  104.         On = !On;
  105.     }
  106.     else
  107.     {
  108.         Delay--;
  109.     }
  110.    
  111.     // Меандр
  112.     // Семплы шлются по очереди двум каналам
  113.     if(Ch)
  114.     {
  115.         test2_SendLeft();
  116.     }
  117.     else
  118.     {
  119.         test2_SendRight();
  120.     }
  121.    
  122.     Ch = !Ch;
  123. }
  124.  
  125. // Отправка очередного семпла (по необходимости)
  126. void test2_Main(void)
  127. {
  128.     // Если буфер пуст, следующий семпл отправим
  129.     if(i2s_IsBufferFree()) test2_NextSample();
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement