This library provides functions to support use of the AK4954A audio codec found on the CY8CKIT-028-TFT shield.
NOTE: This example is targeted for Arduino-based boards.
#include "cyhal.h"
#include "cybsp.h"
#include "mtb_ak4954a.h"
#include "wave.h"
#define AUDIO_SYS_CLOCK_HZ (98000000u)
#define MCLK_FREQ_HZ (4083000u)
#define MCLK_DUTY_CYCLE (50.0f)
cyhal_clock_t pll_clock;
cyhal_clock_t audio_clock;
cyhal_clock_t system_clock;
cyhal_pwm_t mclk_pwm;
cyhal_i2s_t i2s;
cyhal_i2c_t i2c;
const cyhal_i2c_cfg_t i2c_config = {
.is_slave = false,
.address = 0,
.frequencyhal_hz = 400000
};
const cyhal_i2s_pins_t i2s_pins = {
.sck = CYBSP_D1,
.ws = CYBSP_D2,
.data = CYBSP_D3,
.mclk = NC
};
const cyhal_i2s_config_t i2s_config = {
.is_tx_slave = false,
.is_rx_slave = false,
.mclk_hz = 0,
.channel_length = 32,
.word_length = 16,
.sample_rate_hz = 16000
};
void i2s_isr_handler(void *arg, cyhal_i2s_event_t event)
{
(void) arg;
(void) event;
cyhal_i2s_stop_tx(&i2s);
}
int main(void)
{
cy_rslt_t rslt;
rslt = cybsp_init();
if(CY_RSLT_SUCCESS != rslt)
{
CY_ASSERT(0);
}
__enable_irq();
rslt = cyhal_clock_reserve(&pll_clock, &CYHAL_CLOCK_PLL[0]);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_clock_set_frequency(&pll_clock, AUDIO_SYS_CLOCK_HZ, NULL);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_clock_set_enabled(&pll_clock, true, true);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_clock_reserve(&audio_clock, &CYHAL_CLOCK_HF[1]);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_clock_set_source(&audio_clock, &pll_clock);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
cyhal_clock_set_divider(&audio_clock, 4);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
cyhal_clock_set_enabled(&audio_clock, true, true);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_clock_reserve(&system_clock, &CYHAL_CLOCK_HF[0]);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_clock_set_source(&system_clock, &pll_clock);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_pwm_init(&mclk_pwm, CYBSP_D0, NULL);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_pwm_set_duty_cycle(&mclk_pwm, MCLK_DUTY_CYCLE, MCLK_FREQ_HZ);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_pwm_start(&mclk_pwm);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
cyhal_system_delay_ms(1u);
rslt = cyhal_i2s_init(&i2s, &i2s_pins, NULL, &i2s_config, &audio_clock);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
cyhal_i2s_register_callback(&i2s, i2s_isr_handler, NULL);
cyhal_i2s_enable_event(&i2s, CYHAL_I2S_ASYNC_TX_COMPLETE,
CYHAL_ISR_PRIORITY_DEFAULT, true);
cyhal_i2c_init(&i2c, CYBSP_I2C_SDA, CYBSP_I2C_SCL, NULL);
cyhal_i2c_configure(&i2c, &i2c_config);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
cyhal_i2s_start_tx(&i2s);
rslt = cyhal_i2s_write_async(&i2s, wave_data, WAVE_SIZE);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
for(;;) { }
}
cy_rslt_t mtb_ak4954a_init(cyhal_i2c_t *i2c_inst)
Initialize the I2C communication with the audio codec and do basic configuration of the codec.
Definition: mtb_ak4954a.c:41
void mtb_ak4954a_adjust_volume(uint8_t volume)
This function updates the volume of both the left and right channels of the headphone output.
Definition: mtb_ak4954a.c:245
#define AK4954A_HP_VOLUME_DEFAULT
Default Value (0.0dB)
Definition: mtb_ak4954a.h:1141
void mtb_ak4954a_activate(void)
Activates the codec - This function is called in conjunction with ak4954A_deactivate API after succes...
Definition: mtb_ak4954a.c:258
© Cypress Semiconductor Corporation (an Infineon company) or an affiliate of Cypress Semiconductor Corporation, 2019-2024.