我 在电路板中使用双通道 TAS5720A-Q1。 这两个 IC 与 STM32F4相连。 我将分享我的设计、I2C 级存在一些问题。 当我将地址发送到 TAS IC 时、没有匹配项。 它始终返回地址阶段的 Acknugge 故障。 器件 ID 设置为 D8和 DA。 下面是我的设计。 e2e.ti.com/.../aa.pdf
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我 在电路板中使用双通道 TAS5720A-Q1。 这两个 IC 与 STM32F4相连。 我将分享我的设计、I2C 级存在一些问题。 当我将地址发送到 TAS IC 时、没有匹配项。 它始终返回地址阶段的 Acknugge 故障。 器件 ID 设置为 D8和 DA。 下面是我的设计。 e2e.ti.com/.../aa.pdf
我 检查 了该引脚和处于高电平。 我从未开始与 TAS5720通信。 MCU 使用7位寻址模式、但我要写入8位寻址。 MCU 根据操作屏蔽最后一位。 BTW、我扫描 了0-255之间的线。 没有匹配项。 代码如下所示。
对于(uint8_t DeviceID=1;DeviceID<=255;DeviceID++) { _Bool 结果= HAL_I2C_IsDeviceReady (&hi2c3、DeviceID、5、Time_out); if (结果=HAL_OK) { I2CDevices[计数器]; COUNTER++; if (counter==5) counter=0; } }
这也是我的初始化阶段。 DeviceReady 状态存在问题。
/*包括------------------------------------------ */ #include "stm32f4xx_hal.h" #include "stm32fxx_user_TAS5720AQ1.h" /*------------------------------------------------------- */ static uint8_t iData[3]; static I2C_HandleTypeDef i2cx; extern I2S_HandleTypeDef hi2s3; extern void Error_Handler (void); //(1):函数定义 //--- 静态函数--- // //函数(1):写入寄存 器静态空 write_register (uint8_t reg、uint8_t *数据) { iData[0]= reg; iData[1]= data[0]; HAL_I2C_Master_transmit (&i2cx、device_ID、iData、 2、TIME_OUT); //HAL_I2C_Master_Transmit (&i2c1、DAC_I2C_ADDR、DATA、 大小、100); } //函数(2):从寄存 器静态空 read_register (uint8_t reg、uint8_t *数据) { iData[0]= reg; HAL_I2C_Master_transmit (&i2cx、device_ID、iData、1、 TIME_OUT); HAL_I2C_Master_Receive (&i2cx、DEVICE_ID、DATA、1、 TIME_OUT); } //--------------- 公共职能--- // //函数(2):TAS5720AQ1初始 化无效 TAS5720AQ1_Init (I2C_HandleTypeDef i2c_handle) { __HAL_unlock (&hi2s3); //这对于 I2S3的工作非常重要!! _HAL_I2S_ENABLE (&hi2s3);//这对于 I2S3的工作至关重要!! //(1):获取 I2C 句柄 i2cx = i2c_handle; if (HAL_I2C_IsDeviceReady (&i2cx、device_ID、1、time_out)!=HAL_OK) { Error_Handler (); } //(2):首先关闭扬声器。 以减少初始化时的功耗。 iDATA[1]= 0x00; WRITE_register (REG_ADR_POWER_CONTROL、iData);//关闭正常。 //(3):扬声器 L/R 通道静音以初始化过程。 READ_register (REG_ADR_VOL_CONTROL、&iData[1]);//读取该寄存器包含保留位以显示其值。 iDATA[1]&&(0x1F<2);//清除除保留的位[6:2]之外的所有位。 用户不对保留位进行任何更改。 iDATA[1]|=~(1<<7);//禁用卷衰减。 iDATA[1]|=(1<<1);//右侧通道被静音。 iDATA[1]|=(1<0);//左通道被静音。 WRITE_REGISTER_ADR_VOL_CONTROL、iData); //(4):接口和滤波器控制 READ_register (REG_ADR_DIGITAL_CONTROL、&iData[1]);//读取该寄存器包含保留位以显示其值。 iDATA[1]&=(1<<6);//清除除保留的位6之外的所有位。 用户不对保留位进行任何更改。 iDATA[1]&=~(1<<7);//不会绕过数字路径中的内部高通滤波器。 iDATA[1]|=(1<<4);在数字路径中的信号中添加//+6dB。 (默认值) __NOP();//无需实现采样率。 它是48kHz、3.bit 已经为0。 iDATA[1]|=(1<<3);//串行音频输入格式为 I2S。 (默认值) WRITE_register (REG_ADR_DIGITAL_CONTROL、iData); //(5):模拟控制 READ_register (REG_ADR_ANALOG_CONTROL、&iData[1]); iData[1]&&(0x81<<6);//清除除0以外的所有位(设置为零)。 和7. 保留位。 iDATA[1]|=(1<<7);//7.bit 保留、但必须设置为1。 有关更多信息、请查看数据表。 iDATA[1]|=(5<<4);//扬声器放大器的输出开关速率为16 * LRCK。 (默认值) __NOP();//不需要实现。 模拟增益设置为19.2dBV (默认)。 [3:2]已经是00。 __NOP();//软件控制模式的通道选择。 通过设置2选择"右"。 位设为0。 WRITE_register (REG_ADR_ANALOG_CONTROL、iData); //(6):扬声器已关闭。 iDATA[1]= 0x01; WRITE_register (REG_ADR_POWER_CONTROL、iData);//扬声器放大器未关闭。 //(6):扬声器将取消静音。 Read_register (REG_ADR_VOL_CONTROL、&iData[1]); iData[1]&&~(3);//左/右通道现在未静音。 WRITE_register (REG_ADR_VOL_CONTROL、iData); //(7):将卷设置为默认值(0dB) iData[1]= 0xCF;//通道卷为0dB (默认值)。有关详细信息、请查看数据表。 WRITE_register (REG_ADR_RIGHT _VOL_CONTROL、&iData[1]); WRITE_register (REG_ADR_LEFT_VOL_CONTROL、&iData[1]); __NOP ();//现在,器件可供使用 。}
不幸的是、我没有。 这相当昂贵。 我只有4个样本。 SPK_SD 可由 SW 或 HW 拉取。我不确定是否 在 I2C 启动之前由硬件将该引脚拉至低电平。
if (HAL_I2C_IsDeviceReady (&i2cx、device_ID、1、time_out)!=HAL_OK) { ERROR_Handler(); } //(2):扬声器先关闭。 以减少初始化时的功耗。 iDATA[1]= 0x00; WRITE_register (REG_ADR_POWER_CONTROL、iData);//关闭正常。
如您所见、在 器件 ID 匹配提供之后、我通过软件进入器件的 SD 模式。 但始终返回错误。