Added tlv320aic3104_ctrl.* with codec select

- TlvReadReg
- TlvWriteReg
- TlvPageSelect
master
unicod 3 weeks ago
parent 5f61eb0157
commit 7ca66e3e91

@ -0,0 +1,22 @@
#ifndef __TLV320AIC3104_CTRL_H__
#define __TLV320AIC3104_CTRL_H__
#include <stdint.h>
typedef enum CODEC_SELECT_en {
CODEC_A = 0,
CODEC_B = 1,
} CODEC_SELECT;
typedef enum TLV_PAGE_SELECT_en {
TLV_PAGE_0 = 0,
TLV_PAGE_1 = 1,
} TLV_PAGE_SELECT;
extern int16_t TlvPageSelect(CODEC_SELECT codec, TLV_PAGE_SELECT page);
extern int16_t TlvReadReg(CODEC_SELECT codec, TLV_PAGE_SELECT page, uint8_t reg);
extern int16_t TlvWriteReg(CODEC_SELECT codec, TLV_PAGE_SELECT page, uint8_t reg, uint8_t val);
#endif

@ -0,0 +1,90 @@
/***************************************************************************//**
* @file tlv320aic3104_ctrl.c
* @brief Control functions for TLV320AIC3104 audio codec using I2C
*//****************************************************************************/
//------------------------------C library---------------------------------------
#include <stdint.h>
//----------------------------user includes-------------------------------------
#include "tlv320aic3104_ctrl.h"
#include "i2c_master.h"
#include "main.h"
//------------------------------------------------------------------------------
/* Private macros ------------------------------------------------------------*/
// Codecs on different I2C buses
#define I2C_CODEC_A I2C1
#define I2C_CODEC_B I2C3
#define CODEC_I2C_ADDR 0x30 // left-aligned 7-bit slave address
/* Private variables ---------------------------------------------------------*/
static uint8_t PageSelect[2] = {0xFF, 0xFF}; // current page selected for each codec, to optimize page switching
/* Functions -----------------------------------------------------------------*/
/***************************************************************************//**
* @brief Read register value from codec
* @param codec: codec select (0 for CODEC_A, 1 for CODEC_B)
* @param page: page select (0 or 1)
* @param reg: register address (0-127)
* @return register value (0-255) on success, negative error code on failure
*//****************************************************************************/
int16_t TlvReadReg(CODEC_SELECT codec, TLV_PAGE_SELECT page, uint8_t reg) {
if (page != PageSelect[codec]) {
int err = TlvPageSelect(codec, page);
if (err < 0) return err;
}
if (reg) reg--; // workaround: reading gives regaddr+1 positions back at (datasheet is wrong...)
uint8_t val = 0;
int err = I2C_ReadReg((codec == CODEC_A) ? I2C_CODEC_A : I2C_CODEC_B,
CODEC_I2C_ADDR,
&reg, 1,
&val, 1);
if (err < 0) return err;
return val;
}
/***************************************************************************//**
* @brief Write register value to codec
* @param codec: codec select (0 for CODEC_A, 1 for CODEC_B)
* @param reg: register address (0-127)
* @param val: register value to write (0-255)
* @return 0 on success, negative error code on failure
*//****************************************************************************/
int16_t TlvWriteReg(CODEC_SELECT codec, TLV_PAGE_SELECT page, uint8_t reg, uint8_t val) {
if (page != PageSelect[codec]) {
int err = TlvPageSelect(codec, page);
if (err < 0) return err;
}
uint8_t data[2] = {reg, val};
int err = I2C_Write((codec == CODEC_A) ? I2C_CODEC_A : I2C_CODEC_B,
CODEC_I2C_ADDR,
data, 2);
return err;
}
/***************************************************************************//**
* @brief Write register value to codec
* @param codec: codec select (0 for CODEC_A, 1 for CODEC_B)
* @param reg: register address (0-127)
* @param val: register value to write (0-255)
* @return 0 on success, negative error code on failure
*//****************************************************************************/
int16_t TlvPageSelect(CODEC_SELECT codec, TLV_PAGE_SELECT page) {
if (codec > CODEC_B) codec = CODEC_B; // clamp codec select
PageSelect[codec] = page; // update current page for the codec
uint8_t reg = 0; // page select register address is 0
uint8_t data[2] = {reg, page};
int err = I2C_Write((codec == CODEC_A) ? I2C_CODEC_A : I2C_CODEC_B,
CODEC_I2C_ADDR,
data, 2);
return err;
}
Loading…
Cancel
Save