代码取自STC的Ai8051U实验盒的I2S相关例程,涉及I2C数据通讯的处理就不罗列了,I2C的通讯使用端口模拟的方式实现的。,两个关键的处理函数代码如下:
void AIC23_Init(void) {
/* P_AIC23_CS = 0; //CS = 0, 2024-6-18,对于2024-7-12和2024-7-21版本,CS直接接地了
P2n_standard(Pin4+Pin3); //SDA SCL设置为准双向口
P1n_standard(Pin7); //CS设置为准双向口
*/
P5n_standard(Pin1+Pin0); //SDA SCL设置为准双向口
P5PU = 0x02;
// 写【复位用寄存器】,复位芯片
AIC23_WriteCmd(R_ResetRegister, AIC23_Reset); //Reset
} // 配置芯片工作参数
void AIC32_InitSet(void) {
// 写【线路输入用左声道音量控制寄存器】
// 开启左右声道同步更新,非静音,设置音量
AIC23_WriteCmd(R_LineInVolume_L, (LinVol_LRS | LinVol_Mute | LinVol_Value));
// 写【线路输入用右声道音量控制寄存器】
// 开启左右声道同步更新,非静音,设置音量
AIC23_WriteCmd(R_LineInVolume_R, (RinVol_RLS | RinVol_Mute | RinVol_Value));
// 写【耳机用左声道音量控制寄存器】
// 开启左右声道同步更新,启用左声道过零检测,设置音量
AIC23_WriteCmd(R_HeadphoneVolume_L, (LhpVol_LRS | LhpVol_LZC | LhpVol_Value));
// 写【耳机用右声道音量控制寄存器】
// 开启左右声道同步更新,启用左声道过零检测,设置音量
AIC23_WriteCmd(R_HeadphoneVolume_R, (RhpVol_RLS | RhpVol_RZC | RhpVol_Value));
// 写【模拟音频通道控制寄存器】
// STA[2:0]=0 ,STE=0,DAC=1;Byp=1;MICM=1;INSEL=0;MICB=0
//AIC23_WriteCmd(R_AnalogAudioCtrl, (SidetoneAtten | SidetoneEnable | DAC_Select | Bypass | InputSelect | MIC_Mute | MIC_Boost));
// 写【数字音频通道控制寄存器】
// 禁用软静音,禁用去加重控制,禁用ADC高通滤波器
AIC23_WriteCmd(R_DigitalAudioCtrl, (DAC_Mute | De_emphasis | ADC_HighPassF));
// 写【省电控制寄存器】
// 开设备
AIC23_WriteCmd(R_PowerControl, 0);
#if defined (I2S_MASTER_TRANSMITTER)
// 选择tlv320aic23b工作于接收DAC模式
// 写【模拟音频通道控制寄存器】
// STA[2:0]=0 : 侧音-6db
// STE=0 :
// DAC=1 : 使用DAC
// Byp=1 : 使能旁路
// INSEL=0 : ADC来源为线路输入
// MICM=1 : 麦克风静音
// MICB=0 : 麦克风不增强
AIC23_WriteCmd(R_AnalogAudioCtrl, (SidetoneAtten | SidetoneEnable | DAC_Select | Bypass | InputSelect | MIC_Mute | MIC_Boost));\
// 写【数字音频接口格式寄存器】
// AIC_Master (1<<6) //0=Slave, 1=Master
// DAC_LR_Swap (0<<5) //0=disable, 1=enable
// DAC_LR_Phase (0<<4) //????
// AIC_DataLength (0<<2) //0=16bit, 1=20bit, 2=24bit, 3=32bit
// AIC_DataFormat 2 //0=MSB first, right aligned, 1=MSB first, left alihned, 2=I2S format, MSB first,left -1 aligned, 3=DSP format,
// 禁止左右交换,
AIC23_WriteCmd(R_DigitalAudioFormat, (DAC_LR_Swap | DAC_LR_Phase | AIC_DataLength | AIC_DataFormat));
#elif defined (I2S_SLAVE_RECEIVER)
// 选择tlv320aic23b工作于接收ADC模式
// 写【模拟音频通道控制寄存器】
// STA[2:0]=0 : 侧音-6db
// STE=0 :
// DAC=1 : 使用DAC
// Byp=1 : 使能旁路
// INSEL=0 : ADC来源为线路输入
// MICM=1 : 麦克风静音
// MICB=0 : 麦克风不增强
AIC23_WriteCmd(R_AnalogAudioCtrl, (SidetoneAtten | SidetoneEnable | Bypass | InputSelect | MIC_Mute | MIC_Boost));
// 写【数字音频接口格式寄存器】
// AIC_Master (1<<6) // 0=Slave, 1=Master
// DAC_LR_Swap (0<<5) // 0=disable, 1=enable
// DAC_LR_Phase (0<<4) //????
// AIC_DataLength (0<<2) //0=16bit, 1=20bit, 2=24bit, 3=32bit
// AIC_DataFormat 2 //0=MSB first, right aligned, 1=MSB first, left alihned, 2=I2S format, MSB first,left -1 aligned, 3=DSP format,
// 主机模式,禁止左右声道交换,MSB在LRCIN上升沿之后的第一个BCLK上升沿可用,16位数据长度,I2S模式
AIC23_WriteCmd(R_DigitalAudioFormat, (AIC_Master | DAC_LR_Swap | DAC_LR_Phase | AIC_DataLength | AIC_DataFormat));
#endif
// 写【采样率寄存器】,设置采样率
AIC23_WriteCmd(R_SampleRate, (MclkOutputDiv | MclkInputDiv | AIC_SampleRate | AIC_BOSR | AIC_ClockMode));
// 写【数字音频接口激活开关寄存器】
AIC23_WriteCmd(R_DigitalInterfaceEn, DigitalInterface);
}宏定义【I2S_MASTER_TRANSMITTER】被定义为有效,所以 TLV320AIC23 是工作于主机模式的。
一、初始化函数:AIC23_Init
它的初始化处理实际上就一条关键指令:
AIC23_WriteCmd(R_PowerControl, 0);
向复位寄存器写入0,触发复位,不知道是否会按照默认值初始化各个寄存器。
二、配置参数函数:AIC32_InitSet
这里除了需要参考寄存器的设置说明理解外,额外需要说明的一点是配置TLV320AIC23的【数字音频接口格式寄存器】时,设置为主机模式还是从机模式的疑惑。
1、TLV320AIC23本身是可以进行ADC和DAC处理,根据程序注释,工作于DAC模式时,使用Master方式,而用ADC时,使用Slave模式。
2、根据TLV320AIC23的资料,I2S串行位时钟源的设置。在音频主机模式下,TLV320AIC23产生该信号并将其发送给 DSP。在音频从机模式下,信号由DSP产生。
我要赚赏金
