// // Created by zemon on 24.06.2021. // #include #include "max9860.h" #include "max9860_regs.h" bool xAudioCodecSetClock(tI2cIO *i2c, MAX9860_ClocksState clocksState) { uint8_t I2C_Out[4] = {0}; I2C_Out[0] = MAX9860_REG_SYSTEM_CLOCK; I2C_Out[1] = 0x00 | ((clocksState.MCLK_TO_PCLK_Prescaler & 0b11) << 4) | ((clocksState.IntegerClockMode & 0b11) << 1) | ((clocksState.EXACTLY_16KHZ & 0b1) << 0); I2C_Out[2] = 0x00 | ((clocksState.PLL_Enable & 0b1) << 7) | (((uint8_t) (clocksState.LRCLK_Driver >> 8)) & 0b01111111); I2C_Out[3] = ((uint8_t) (clocksState.LRCLK_Driver & 0xFF)); return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 4, MAX9860_IO_TIMEOUT) == 4; } bool xAudioCodecSetInterface(tI2cIO *i2c, MAX9860_AudioInterfaceState interface) { uint8_t I2C_Out[3] = {0}; I2C_Out[0] = MAX9860_REG_INTERFACE; I2C_Out[1] = 0x00 | ((interface.MasterMode & 0b1) << 7) | ((interface.LRCLK_Invert & 0b1) << 6) | ((interface.DAC_BCLK_Invert & 0b1) << 5) | ((interface.DAC_DelayMode & 0b1) << 4) | ((interface.SDOUT_HighImpedanceMode & 0b1) << 3) | ((interface.TDM_ModeSelect & 0b1) << 2); I2C_Out[2] = 0x00 | ((interface.ADC_BCLK_Invert & 0b1) << 5) | ((interface.ADC_Delay_Mode & 0b1) << 4) | ((interface.StereoEnable & 0b1) << 3) | ((interface.BCLK_Select & 0b111) << 0); return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 3, MAX9860_IO_TIMEOUT) == 3; } bool xAudioCodecSetDigitalFilters(tI2cIO *i2c, MAX9860_DigitalFiltersState filters) { uint8_t I2C_Out[2] = {0}; I2C_Out[0] = MAX9860_REG_VOICE_FILTERING; I2C_Out[1] = 0x00 | ((filters.ADC_DigitalFilter & 0b1111) << 4) | ((filters.DAC_DigitalFilter & 0b1111) << 0); return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 2, MAX9860_IO_TIMEOUT) == 2; } bool xAudioCodecSetDigitalLevelControls(tI2cIO *i2c, MAX9860_DigitalLevelControlState levels) { uint8_t I2C_Out[4] = {0}; I2C_Out[0] = MAX9860_REG_DAC_ATTENUATION; I2C_Out[1] = levels.DAC_LevelAdjust; I2C_Out[2] = 0x00 | ((levels.ADC_OutputLevelRight & 0b1111) << 4) | ((levels.ADC_OutputLevelLeft & 0b1111) << 0); I2C_Out[3] = 0x00 | ((levels.DAC_Gain & 0b11) << 5) | ((levels.Sidetone & 0b11111) << 0); return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 4, MAX9860_IO_TIMEOUT) == 4; } bool xAudioCodecSetMicrophoneInput(tI2cIO *i2c, MAX9860_MicrophoneInputState micro) { uint8_t I2C_Out[2] = {0}; I2C_Out[0] = MAX9860_REG_MICROPHONE_GAIN; I2C_Out[1] = 0x00 | ((micro.MicrophonePreampGain & 0b11) << 5) | ((micro.MicrophoneProgrammableGain & 0b11111) << 0); return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 2, MAX9860_IO_TIMEOUT) == 2; } bool xAudioCodecSetAutomaticGainControlAndNoiseGate( tI2cIO *i2c, MAX9860_AutomaticGainControlAndNoiseGateState values ) { uint8_t I2C_Out[3] = {0}; I2C_Out[0] = MAX9860_REG_MICROPHONE_AGC; I2C_Out[1] = 0x00 | ((values.NoiseGateSource & 0b1) << 7) | ((values.ReleaseTime & 0b111) << 4) | ((values.AttackTime & 0b11) << 2) | ((values.HoldTime & 0b11) << 0); I2C_Out[2] = 0x00 | ((values.NoiseGateThreshold & 0b1111) << 4) | ((values.AutomaticGainControlThreshold & 0b1111) << 0); return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 3, MAX9860_IO_TIMEOUT) == 3; } bool xAudioCodecSetPowerManagement(tI2cIO *i2c, MAX9860_PowerManagementState values) { uint8_t I2C_Out[3] = {0}; I2C_Out[0] = MAX9860_REG_SYSTEM_SHUTDOWN; I2C_Out[1] = 0x00 | ((values.FullPowerOn & 0b1) << 7) | ((values.DAC_Enabled & 0b1) << 3) | ((values.ADC_EnabledLeft & 0b1) << 1) | ((values.ADC_EnabledRight & 0b1) << 0); return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 2, MAX9860_IO_TIMEOUT) == 2; } uint16_t xAudioCodecDebugGetRAW(tI2cIO *i2c, uint8_t *raw) { return I2cRead(i2c, MAX9860_ADDRESS_READ, raw, MAX9860_TOTAL_REG_COUNT, MAX9860_IO_TIMEOUT); } uint16_t xAudioCodecDebugSetRAW(tI2cIO *i2c, uint8_t *raw) { return I2cRead(i2c, MAX9860_ADDRESS_WRITE, raw, MAX9860_TOTAL_REG_COUNT, MAX9860_IO_TIMEOUT); } uint16_t xAudioCodecReadStatus(tI2cIO *i2c, uint8_t statuses[3]) { uint8_t I2C_Out[4] = {0}; I2C_Out[0] = MAX9860_REG_STATUS_INTERRUPTS_VALUES; uint16_t write = I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 1, MAX9860_IO_TIMEOUT); uint16_t reed = I2cRead(i2c, MAX9860_ADDRESS_READ, I2C_Out + 1, 3, MAX9860_IO_TIMEOUT); memcpy(statuses, I2C_Out + 1, reed); return reed; } //void PowerSuportInitAudioDevice(PowerSupportEnvironment* env){ // HAL_StatusTypeDef error; // // uint8_t I2C_Out[16] = {0}; // uint8_t I2C_In[17] = {0}; // // // 0 1 2 3 4 5 6 7 8 9 0A 0B 0C 0D 0E 0F 10 // // 0x00 0x00 0x00 0x10 0x1E 0x3F 0x24 0x00 0x00 0x06 0x33 0x00 0x4A 0x00 0x00 0x00 0x8A // // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // I2C_Out[0] = 0x03; //Address // I2C_Out[1] = 0x10; //0x03 System Clock // I2C_Out[2] = 0x10; //0x04 Stereo Audio Clock / Control High // I2C_Out[3] = 0x62; //0x05 Stereo Audio Clock / Control Low // I2C_Out[4] = 0x40; //0x06 Interface // I2C_Out[5] = 0x00; //0x07 Interface // I2C_Out[6] = 0x00; //0x08 Voice Filter // I2C_Out[7] = 0x08; //0x09 DAC Attenuation DAC Level Adjust -10:0x1A // I2C_Out[8] = 0x33; //0x0A ADC Output Levels DA Level 4:[left -10:0xD][right -10:0xD] // I2C_Out[9] = 0x00; //0x0B DAC Gain and Sidetone 0 2:[DVG 00] 5:[DVST -10:0x00] // I2C_Out[10] = 0x4A; //0x0C Microphone Gain -- 0 2:[MicPreAmp 00] 5:[Mic PGA 0x14] // I2C_Out[11] = 0x00; //0x0D Reserved // I2C_Out[12] = 0x00; //0x0E Microphone AGC // I2C_Out[13] = 0x00; //0x0F Noise Gate, Microphone AGC // I2C_Out[14] = 0x8A; //0x10 System Shutdown // // error = HAL_I2C_Master_Transmit(env->audioI2c, 0x20, I2C_Out, 15, 500); // // I2C_Out[0] = 0x00; // error = HAL_I2C_Master_Receive(env->audioI2c, 0x21, I2C_In, 17, 500); //}