This library provides functions to support use of the AK4954A audio codec found on the CY8CKIT-028-TFT shield.
#include "cyhal.h"
#include "cybsp.h"
#include "mtb_ak4954a.h"
#include "wave.h"
#define AUDIO_SYS_CLOCK_HZ (98304000)
#define MCLK_FREQ_HZ (4096000)
#define MCLK_DUTY_CYCLE (50.0)
static cyhal_i2c_t i2c;
cyhal_clock_t pll_clock;
cyhal_clock_t audio_clock;
cyhal_pwm_t mclk_pwm;
cyhal_i2s_t i2s;
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
};
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 = 48000
};
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();
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
__enable_irq();
i2c_init(&i2c, CYBSP_I2C_SDA, CYBSP_I2C_SCL);
cyhal_i2c_configure(&i2c, &i2c_config);
rslt = cyhal_clock_allocate(&pll_clock, CYHAL_CLOCK_BLOCK_PLL);
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_get(&audio_clock, &CYHAL_CLOCK_HF[1]);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_clock_init(&audio_clock);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_clock_set_source(&audio_clock, &pll_clock);
CY_ASSERT(rslt == CY_RSLT_SUCCESS);
rslt = cyhal_clock_set_enabled(&audio_clock, true, true);
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(1);
rslt = cyhal_i2s_init(&i2s, &i2s_pins, NULL, NC, &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);
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(;;) { }
}
The follow blocks of code can be used to illustrate other functionality. In the example above, replace the code following the "Setup complete" comment with one of these code blocks.