Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Интерфейс к внешнему ЦАП CS43L22
- //
- #include "cs43l22.h"
- #include "../drivers.h"
- // Символьные обозначения регистров
- typedef enum
- {
- REG_ID = 0x01,
- REG_POWER_CTL1 = 0x02,
- REG_POWER_CTL2 = 0x04,
- REG_CLOCKING_CTL = 0x05,
- REG_INTERFACE_CTL1 = 0x06,
- REG_INTERFACE_CTL2 = 0x07,
- REG_PASSTHR_A_SELECT = 0x08,
- REG_PASSTHR_B_SELECT = 0x09,
- REG_ANALOG_ZC_SR_SETT = 0x0A,
- REG_PASSTHR_GANG_CTL = 0x0C,
- REG_PLAYBACK_CTL1 = 0x0D,
- REG_MISC_CTL = 0x0E,
- REG_PLAYBACK_CTL2 = 0x0F,
- REG_PASSTHR_A_VOL = 0x14,
- REG_PASSTHR_B_VOL = 0x15,
- REG_PCMA_VOL = 0x1a,
- REG_PCMB_VOL = 0x1b,
- REG_BEEP_FREQ_ON_TIME = 0x1c,
- REG_BEEP_VOL_OFF_TIME = 0x1d,
- REG_BEEP_TONE_CFG = 0x1e,
- REG_TONE_CTL = 0x1f,
- REG_MASTER_A_VOL = 0x20,
- REG_MASTER_B_VOL = 0x21,
- REG_HEADPHONE_A_VOL = 0x22,
- REG_HEADPHONE_B_VOL = 0x23,
- REG_SPEAKER_A_VOL = 0x24,
- REG_SPEAKER_B_VOL = 0x25,
- REG_CH_MIXER_SWAP = 0x26,
- REG_LIMIT_CTL1 = 0x27,
- REG_LIMIT_CTL2 = 0x28,
- REG_LIMIT_ATTACK_RATE = 0x29,
- REG_OVF_CLK_STATUS = 0x2e,
- REG_BATT_COMPENSATION = 0x2f,
- REG_VP_BATTERY_LEVEL = 0x30,
- REG_SPEAKER_STATUS = 0x31,
- REG_TEMPMONITOR_CTL = 0x32,
- REG_THERMAL_FOLDBACK = 0x33,
- REG_CHARGE_PUMP_FREQ = 0x34
- } TCS43L22Register;
- // Адрес микросхемы 0x94, модуль 0 (I2C1)
- static const TI2CDevice Device = { 0x00, 0x94 };
- static void cs43l22_Transmitted(TI2CStatus Status)
- {
- }
- static void cs43l22_WriteLock(TCS43L22Register Reg, uint8_t Value)
- {
- uint8_t Temp = Value;
- // Запишем и ждём завершения отправки
- i2c_Write(&Device, (uint8_t)Reg, &Temp, sizeof(Temp), (void *)0);
- }
- // Сброс
- void cs43l22_Reset(void)
- {
- // RESET опустить
- gpio_LowLevel(PORTD, 4);
- // Подождём
- delay(10000UL);
- // RESET поднять
- gpio_HighLevel(PORTD, 4);
- }
- // Инициализация
- void cs43l22_Init(void)
- {
- // Выведем из состояния сброса
- // PD4 - ~Reset
- gpio_DigitalOutput(PORTD, 4);
- // Сброс
- cs43l22_Reset();
- // Настройка кодека
- // PDN = 0x01, Powered Down
- cs43l22_WriteLock(REG_POWER_CTL1, 0x01);
- // PDN_HP = 2, Headphone channel is always ON.
- // PDN_HP = 3, Speaker channel is always OFF.
- cs43l22_WriteLock(REG_POWER_CTL2, 0xaf);
- // AUTO = 1, Auto-detection of Speed Mode enabled
- // MCLKDIV2 = 1, MCLK signal into DAC divided by 2
- cs43l22_WriteLock(REG_CLOCKING_CTL, 0x81);
- // DACDIF = 1, DAC Interface Format: I2S, up to 24-bit data
- cs43l22_WriteLock(REG_INTERFACE_CTL1, 0x04);
- // Максимальная громкость: +12 dB
- cs43l22_WriteLock(REG_MASTER_A_VOL, 0x18);
- cs43l22_WriteLock(REG_MASTER_B_VOL, 0x18);
- // Определение нуля не надо, да и чего-то там ещё
- cs43l22_WriteLock(REG_ANALOG_ZC_SR_SETT, 0x00);
- // DIGSFT = 0, Does not occur with a soft ramp
- // DEEMPHASIS = 1, config. digital de-emphasis filter response
- cs43l22_WriteLock(REG_MISC_CTL, 0x04);
- // Отключить ограничитель
- cs43l22_WriteLock(REG_LIMIT_CTL1, 0x00);
- // Подстроить уровни
- // TREB = 0b0000, treble gain +12.0 dB
- // BASS = 0b1111, gain of the bass shelving filter -10.5 dB
- cs43l22_WriteLock(REG_TONE_CTL, 0x0f);
- // Подстроить громколсть обоих каналов
- // PCMxVOL: +5 dB
- cs43l22_WriteLock(REG_PCMA_VOL, 0x0a);
- cs43l22_WriteLock(REG_PCMB_VOL, 0x0a);
- }
- // Установить громкость звука
- void cs43l22_SetVolume(uint8_t Volume)
- {
- // 0x19 - минимальный уровень звука, -102 dB
- uint8_t Value = (Volume + 0x19) & 0xFF;
- i2c_Write(&Device, (uint8_t)REG_MASTER_A_VOL, &Value, sizeof(Value), &cs43l22_Transmitted);
- i2c_Write(&Device, (uint8_t)REG_MASTER_B_VOL, &Value, sizeof(Value), &cs43l22_Transmitted);
- }
- // Включить аудио
- void cs43l22_AudioOn(void)
- {
- uint8_t Value = 0x9e;
- // Powered Up
- i2c_Write(&Device, (uint8_t)REG_POWER_CTL1, &Value, sizeof(Value), &cs43l22_Transmitted);
- // Включить i2s
- i2s_AudioOn();
- }
- // Выключить аудио
- void cs43l22_AudioOff(void)
- {
- uint8_t Value = 0x01;
- // Powered Down
- i2c_Write(&Device, (uint8_t)REG_POWER_CTL1, &Value, sizeof(Value), &cs43l22_Transmitted);
- // Выключить i2s
- i2s_AudioOff();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement