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.

[参考译文] PCM1862:Energysense 信号丢失功能出现问题

Guru**** 2378650 points
Other Parts Discussed in Thread: PCM1862
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1290126/pcm1862-problem-with-energysense-signal-loss-function

器件型号:PCM1862

您好!

我需要使用 Energysense 功能检查信号是否在活动模式下丢失。 我不使用/检查 INT 引脚、我只是检查 INT_STAT 寄存器 (Page.0 0x61)以检查是否由于信号丢失而发生中断。

我遇到的问题是、即使信号高于信号丢失阈值、中断也会继续发生。 下面是我发送的步骤,你能帮我弄清楚我做错了什么.

第1步、首先初始化信号检测器和信号丢失阈值、设置与 energysense 相关的寄存器并启用 energysense 中断:

const cfg_reg data[]={
//将信号检测设置为-57dB (最小值-57dB、默认值-40)
{ 0x00、0x01 },//更改为寄存器页1
{0x02、0x2D}、//写入恢复阈值的存储器地址
{0x04、0x00}、//位[23:15]
{0x05、0x2E}、//位[15:8]
{0x06、0x49}、//位[7:0]
{ 0x01、0x01 },//执行写操作

//将信号丢失设置为-57dB (最小值-110dB、默认值-80dB)
{ 0x00、0x01 },//更改为寄存器页1
{0x02、0x2C}、//写入丢失阈值的存储器地址
{0x04、0x00}、//位[23:15]
{0x05、0x2E}、//位[15:8]
{0x06、0x49}、//位[7:0]
{ 0x01、0x01 },//执行写操作

//配置其余的寄存器
{0x00、0x00}、//更改为第0页
{0x60、0x00}、//禁用能量感应中断
{0x31、0xF0}、// SIGDET_TRIG_MASK:屏蔽未使用的通道3和4
{0x32、0xFF}、//清除 SIGDET_STAT 寄存器。 将0xFF 和0x00写入 SIGDET_STAT 寄存器
{ 0x32、0x00 }、
{0x33、PCM1862_SIGDET_LASE_TIME}、// SIGDET_LASE_TIME:信号检测/丢失所需的时间(我使用1分钟、但实际上是30秒、因为我以96KHz 的频率运行)
{ 0x36、0x00 },// SIGDET_INT_INTVL:无重复中断
{0x62、0x13}// INT_PLS:将中断的持续时间设置为粘着(开启),直到清除(是否仅用于物理 int 引脚?)
{0x60、0x01}、//启用能量感应中断
};

transferregisters (data, sizeof (data)/sizeof (data[0]));

第2步、对于我的应用、然后我检查中断是否由于信号丢失而发生、如果为真、我转至第3步、如果为假、我再次轮询:

bool onSignalLossInterrupt()
{
  //堆栈
  CHAR DATA = 0x61;//要读取的寄存器、查看 INT_STAT (Page.0 0x61)。

  I2C.WRITE (PCM1862_ADD、&DATA、1、true);//不在末尾发送 STOP
  int fail = i2c.read (PCM1862_ADD、&DATA、1、false);//在"ACK"时返回0
  if (!fail){
   if (data & 0x01){//能量检测中断
     //检查通道1或2上 SIGDET_STAT 的寄存器0x32,
     //无论如何,在这里返回 true 应该就足够了
     数据= 0x61;
     I2C.WRITE (PCM1862_ADD、&DATA、1、true);//不在末尾发送 STOP
     Fail = i2c.read (PCM1862_ADD、&DATA、1、false);//在"ACK"时返回0
     if (!fail){
      if (data > 0)
        返回 true;
     }
   }
  }
  返回 false;

第3步、发生了中断、以便我 禁用中断标志、更改信号丢失阈值、并清除 SIGDET_STAT  (Page.0 0x32)寄存器:

const cfg_reg data[]={
//禁用中断
{0x00、0x00}、//更改为第0页
{0x60、0x00}、//禁用能量感应中断

//将信号丢失阈值设置为–110dB (以便内部逻辑不再生成中断)
{ 0x00、0x01 },//更改为寄存器页1
{0x02、0x2C}、//写入丢失阈值的存储器地址
{0x04、0x00}、//位[23:15]
{0x05、0x00}、//位[15:8]
{0x06、0x1A}、//位[7:0]
{ 0x01、0x01 },//执行写操作

//清除 SIGDET_STAT (Page.0 0x32)寄存器
{0x00、0x00}、//更改为第0页
{0x32、0xFF}、//清除 SIGDET_STAT 寄存器。 将0xFF 后跟0x00写入 SIGDET_STAT 寄存器
{ 0x32、0x00 }、
};

transferregisters (data, sizeof (data)/sizeof (data[0]));

然后我再次返回到步骤1、2、3。

感谢您的帮助、

亚历克斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alex:

    对于 SIGDET_STAT、在写入0xFF 之后、读取值是什么;在写入0x00之后、读取值是什么?

    此外、环路的时序和复位序列是什么。 若要进行故障排除、请忽略该循环、并在 INT_STAT 中检测到后等待1分钟、手动测试复位序列。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Daveon

    感谢您的建议。 我已如您所说、我在写入0xFF 后读取0x00、在写入0x00后读取0x00。 如果我没有弄错、根据数据表中9.3.15.2.1的步骤、我认为这是正确的行为。

    我的循环每隔10秒运行一次检查、看看是否发生了中断、结果显示即使应该在1分钟后才发生中断(在本例中为30秒、因为采样率为96KHz)。  此外、 即使存在大于信号 损失阈值(即 -57dB)的大信号、也会发生中断。

    谢谢。

    亚历克斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alex:

    其他意见

    • 我注意到信号丢失和恢复阈值相同、请尝试使恢复/检测电平大于丢失阈值。
      • 还实施虚拟写入和虚拟读取以进行验证(如9.5.5和混频器 Excel 中所示)
    • 尽管有中断或屏蔽了中断、ADC 是否可以正常工作? 即 SDOUT 上的良好数据
    • 除了复位方法、器件转换到睡眠模式是否非法地具有相同的中断响应?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Daveon

    我添加了虚拟写入。 将 SIGNAL\RESUME 检测更改为-40dB、并将信号损耗保持在-57dB。

    现在、它似乎在工作。 当没有信号时设置中断 、当有信号大于阈值时不设置中断。 但是、 在信号丢失后、中断一直发生到2分钟和30秒、但设置为1分钟。

    我将再次检查所有设置并继续测试。 至少我们正在取得某种进展。

    谢谢。

    亚历克斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alex:

    很高兴听到、我现在将标记为已解决、如果需要任何其他帮助、只需对主题进行评论、它将再次打开、以供我回答。

    此致、