您好!
我需要使用 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。
感谢您的帮助、
亚历克斯