Advertisement
teplofizik

cs43l22.c

Aug 7th, 2013
1,233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.50 KB | None | 0 0
  1. //
  2. // Интерфейс к внешнему ЦАП CS43L22
  3. //
  4.  
  5. #include "cs43l22.h"
  6. #include "../drivers.h"
  7.  
  8. // Символьные обозначения регистров
  9. typedef enum
  10. {
  11.     REG_ID                = 0x01,
  12.     REG_POWER_CTL1        = 0x02,
  13.     REG_POWER_CTL2        = 0x04,
  14.     REG_CLOCKING_CTL      = 0x05,
  15.     REG_INTERFACE_CTL1    = 0x06,
  16.     REG_INTERFACE_CTL2    = 0x07,
  17.     REG_PASSTHR_A_SELECT  = 0x08,
  18.     REG_PASSTHR_B_SELECT  = 0x09,
  19.     REG_ANALOG_ZC_SR_SETT = 0x0A,
  20.     REG_PASSTHR_GANG_CTL  = 0x0C,
  21.     REG_PLAYBACK_CTL1     = 0x0D,
  22.     REG_MISC_CTL          = 0x0E,
  23.     REG_PLAYBACK_CTL2     = 0x0F,
  24.     REG_PASSTHR_A_VOL     = 0x14,
  25.     REG_PASSTHR_B_VOL     = 0x15,
  26.     REG_PCMA_VOL          = 0x1a,
  27.     REG_PCMB_VOL          = 0x1b,
  28.     REG_BEEP_FREQ_ON_TIME = 0x1c,
  29.     REG_BEEP_VOL_OFF_TIME = 0x1d,
  30.     REG_BEEP_TONE_CFG     = 0x1e,
  31.     REG_TONE_CTL          = 0x1f,
  32.     REG_MASTER_A_VOL      = 0x20,
  33.     REG_MASTER_B_VOL      = 0x21,
  34.     REG_HEADPHONE_A_VOL   = 0x22,
  35.     REG_HEADPHONE_B_VOL   = 0x23,
  36.     REG_SPEAKER_A_VOL     = 0x24,
  37.     REG_SPEAKER_B_VOL     = 0x25,
  38.     REG_CH_MIXER_SWAP     = 0x26,
  39.     REG_LIMIT_CTL1        = 0x27,
  40.     REG_LIMIT_CTL2        = 0x28,
  41.     REG_LIMIT_ATTACK_RATE = 0x29,
  42.     REG_OVF_CLK_STATUS    = 0x2e,
  43.     REG_BATT_COMPENSATION = 0x2f,
  44.     REG_VP_BATTERY_LEVEL  = 0x30,
  45.     REG_SPEAKER_STATUS    = 0x31,
  46.     REG_TEMPMONITOR_CTL   = 0x32,
  47.     REG_THERMAL_FOLDBACK  = 0x33,
  48.     REG_CHARGE_PUMP_FREQ  = 0x34
  49. } TCS43L22Register;
  50.  
  51. // Адрес микросхемы 0x94, модуль 0 (I2C1)
  52. static const TI2CDevice Device = { 0x00, 0x94 };
  53.  
  54. static void cs43l22_Transmitted(TI2CStatus Status)
  55. {
  56.    
  57. }
  58.  
  59. static void cs43l22_WriteLock(TCS43L22Register Reg, uint8_t Value)
  60. {
  61.     uint8_t Temp = Value;
  62.    
  63.     // Запишем и ждём завершения отправки
  64.     i2c_Write(&Device, (uint8_t)Reg, &Temp, sizeof(Temp), (void *)0);
  65. }
  66.  
  67. // Сброс
  68. void cs43l22_Reset(void)
  69. {
  70.     // RESET опустить
  71.     gpio_LowLevel(PORTD, 4);
  72.  
  73.     // Подождём
  74.     delay(10000UL);
  75.  
  76.     // RESET поднять
  77.     gpio_HighLevel(PORTD, 4);
  78. }
  79.  
  80. // Инициализация
  81. void cs43l22_Init(void)
  82. {
  83.     // Выведем из состояния сброса
  84.     // PD4 - ~Reset
  85.     gpio_DigitalOutput(PORTD, 4);
  86.  
  87.     // Сброс
  88.     cs43l22_Reset();
  89.    
  90.     // Настройка кодека
  91.     // PDN = 0x01, Powered Down
  92.     cs43l22_WriteLock(REG_POWER_CTL1, 0x01);
  93.    
  94.     // PDN_HP = 2, Headphone channel is always ON.
  95.     // PDN_HP = 3, Speaker channel is always OFF.
  96.     cs43l22_WriteLock(REG_POWER_CTL2, 0xaf);
  97.    
  98.     // AUTO = 1, Auto-detection of Speed Mode enabled
  99.     // MCLKDIV2 = 1, MCLK signal into DAC divided by 2
  100.     cs43l22_WriteLock(REG_CLOCKING_CTL, 0x81);
  101.    
  102.     // DACDIF = 1, DAC Interface Format: I2S, up to 24-bit data
  103.     cs43l22_WriteLock(REG_INTERFACE_CTL1, 0x04);
  104.    
  105.     // Максимальная громкость: +12 dB
  106.     cs43l22_WriteLock(REG_MASTER_A_VOL, 0x18);
  107.     cs43l22_WriteLock(REG_MASTER_B_VOL, 0x18);
  108.    
  109.     // Определение нуля не надо, да и чего-то там ещё
  110.     cs43l22_WriteLock(REG_ANALOG_ZC_SR_SETT, 0x00);
  111.    
  112.     // DIGSFT = 0, Does not occur with a soft ramp
  113.     // DEEMPHASIS = 1, config. digital de-emphasis filter response
  114.     cs43l22_WriteLock(REG_MISC_CTL, 0x04);
  115.  
  116.     // Отключить ограничитель
  117.     cs43l22_WriteLock(REG_LIMIT_CTL1, 0x00);
  118.    
  119.     // Подстроить уровни
  120.     // TREB = 0b0000, treble gain +12.0 dB
  121.     // BASS = 0b1111, gain of the bass shelving filter -10.5 dB
  122.     cs43l22_WriteLock(REG_TONE_CTL, 0x0f);
  123.  
  124.     // Подстроить громколсть обоих каналов
  125.     // PCMxVOL: +5 dB
  126.     cs43l22_WriteLock(REG_PCMA_VOL, 0x0a);
  127.     cs43l22_WriteLock(REG_PCMB_VOL, 0x0a);
  128. }
  129.  
  130. // Установить громкость звука
  131. void cs43l22_SetVolume(uint8_t Volume)
  132. {
  133.     // 0x19 - минимальный уровень звука, -102 dB
  134.     uint8_t Value = (Volume + 0x19) & 0xFF;
  135.    
  136.     i2c_Write(&Device, (uint8_t)REG_MASTER_A_VOL, &Value, sizeof(Value), &cs43l22_Transmitted);
  137.     i2c_Write(&Device, (uint8_t)REG_MASTER_B_VOL, &Value, sizeof(Value), &cs43l22_Transmitted);
  138. }
  139.  
  140. // Включить аудио
  141. void cs43l22_AudioOn(void)
  142. {
  143.     uint8_t Value = 0x9e;
  144.    
  145.     // Powered Up
  146.     i2c_Write(&Device, (uint8_t)REG_POWER_CTL1, &Value, sizeof(Value), &cs43l22_Transmitted);
  147.    
  148.     // Включить i2s
  149.     i2s_AudioOn();
  150. }
  151.  
  152. // Выключить аудио
  153. void cs43l22_AudioOff(void)
  154. {
  155.     uint8_t Value = 0x01;
  156.    
  157.     // Powered Down
  158.     i2c_Write(&Device, (uint8_t)REG_POWER_CTL1, &Value, sizeof(Value), &cs43l22_Transmitted);
  159.    
  160.     // Выключить i2s
  161.     i2s_AudioOff();
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement