代码取自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产生。