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.

[参考译文] CC2652R:与ZigBee网络配对后,I2S回调间隔过长。

Guru**** 2467600 points
Other Parts Discussed in Thread: TLV320AIC3120, SIMPLELINK-CC13XX-CC26XX-SDK, Z-STACK

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1090765/cc2652r-i2s-callback-interval-is-too-long-after-pairing-to-the-zigbee-network

部件号:CC2652R
主题中讨论的其他部件:TLV320AIC3120SIMPLELINK-CC13XX-CC26XX-SDKZ-STACK

大家好,

我有与I2S外设相关的奇怪问题。 我会尽可能详细地描述它。

我正在开发一种可以连接到ZigBee网络并充当门铃的设备。  
音频样本存储在外部闪存中。 当触发器来自ZigBee网络时,将从读取音频数据
外部闪存并通过I2S外围设备传输至音频编解码器。 总的来说,它很好,但我正在努力处理一个奇怪的案例。

也就是说,如果执行了配对过程,然后触发器出现,则播放的旋律听起来不像预期的那样(这是噪音或 哮鸣)。
正如我所说,只有在执行配对时才会显示。 无论自播放后配对过程后经过多长时间,我都会听到噪音。 但如果我重置
设备,然后再次发送触发器,音乐播放良好。

现在提供一些技术信息

我正在使用SimpleLink SDK 4.30。
MCU:CC2652R1
音频编解码器:TLV320AIC3120

音频播放器模块在单独的任务中运行,它通过信号与I2S写回调同步。
此任务也是我的应用程序中的最高优先级任务。

你可以在这里看到一些伪代码(因为我不能与你分享真实的代码)。

音频播放器任务和I2S写回:

/* Wait for semaphore posted from I2S write callback. */
bool Audio_WaitForAudioStreamComplete(void){

    return Semaphore_pend(audioSemaphoreHandle, BIOS_WAIT_FOREVER);
}

/* AudioPlayer task main loop */
void AudioTask_Main(UArg arg0, UArg arg1){

    while(1){

        if(Audio_WaitForAudioStreamComplete()){

            /* In this function i'm reading audio data from external flash
               and put it to the I2S transactions queue.
            */
            AudioPlayer_Loop();
        }
    }
}

/* I2S driver WriteCallback */
static void I2SWriteCallback(I2S_Handle handle, int_fast16_t status, I2S_Transaction *transaction){

    /* Check if list is empty... */
    /* ... */
    
    // We must consider previous transaction as the current one is not over
    I2S_Transaction* finished = (I2S_Transaction*)List_prev(&transaction->queueElement);
    if(finished){

        // Remove already processed transaction and put it to the list to get new audio data
        List_remove(&toWriteAudioStream, (List_Elem*)finished);
        finished->queueElement.prev = NULL;
        finished->queueElement.next = NULL;
        List_put(toReadFromFlashAudioStream, (List_Elem*)finished);
    }

    /* Check status for errors or I2S_ALL_TRANSACTIONS_SUCCESS */
    /* ... */
    
    /* Post semaphore to the AudioTask. */
    AudioTask_Wakeup();
}

触发网络连接过程的功能。

/* Send Commisioning request to the stack. */
static void ZigbeeNetwork_JoinRequest(void){

    zstack_bdbStartCommissioningReq_t startCommisioniongReq = {

                        .commissioning_mode = DEFAULT_COMISSIONING_MODE };

    Zstackapi_bdbStartCommissioningReq(networkConfig.applicationTaskId, &startCommisioniongReq);
}


按下按钮后触发此功能。

我已经使用逻辑分析器进行了一些测量。 这就是我注意到的。

1.当此问题发生在I2SWriteCallback呼叫之间的间隔太长时(因此旋律听起来像噪音)。
您可以在屏幕截图中看到以下内容。

我正在使用以下设置传输音频数据:
采样率:44.1kHz
字长:16位
扬声器:单声道
事务缓冲区大小:256个样本
因此,单个缓冲区的传输应大约花费5.8毫秒,但正如您在上面看到的那样,它从~20毫秒到~40毫秒不等。

下面您可以看到一切正常时的外观:

我还检查了从发布信号到任务唤醒所需的时间,但看起来不错(十分之一微秒)。

我还试图提高I2S hwi的优先级,但没有任何帮助。
我跟踪了从按键到发送通信请求消息的整个执行路径,但没有发现任何可能导致ISR呼叫之间存在如此长的时间间隔的原因。
音频任务是最高优先级,因此不应被任何其他任务取代。 我相信SDK中没有HWI或SWI,它们可以执行超过20毫秒。
我还测量了从外部闪存读取数据的时间,它也适合(大约1毫秒)。 除此之外,这种情况很好,但不包括这一种情况。

现在我注意到了两件奇怪的事。
1.当我将信号超时更改为150 tick或更少时,就不会出现此问题。
我不知道半保尔的超时会对I2S ISR呼叫产生什么影响... RTOS中是否可能存在一些错误?

/* Wait for semaphore posted from I2S write callback. */
bool Audio_WaitForAudioStreamComplete(void){

    return Semaphore_pend(audioSemaphoreHandle, /*BIOS_WAIT_FOREVER*/ 100); // OK, no noise, but if timout is higher than 150 then it's not OK :<
}


2.当应用程序从除毛刺机启动时,不会出现此问题(即使是Sempahote_pen()中的BIOS_WAY_Forever)。
我尝试从图形分析器工具获取一些信息,但在调试过程中,一切都正常,然后在图表上也正常。


我对此感到很困住了。 如果有人知道我还能检查什么,请告诉我。
我特别想知道这个信号的超时是什么。

此致,
MF

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

    MF您好!

    Zigbee设备ZC/ZR/ZT的节点类型是什么?  Zigbee项目中有两个任务,即应用程序和堆栈,它们的优先级分别设置为2和5。  由于15是最高优先级,您是否已相应地将其设置为任务的值?  请记住,对讲机HWI仍将 是更高的优先级。  重置设备时,Zigbee功能是恢复其网络还是重新加入现有网络?  您是否考虑过使用事件来进一步处理您的I2S信息并更快地退出回拨?

    此致,
    Ryan

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

    您好,Ryan:

    感谢您的快速响应。
    我将逐一回答您的问题。

    1.我的设备类型是ZR。

    2.在我的应用程序中,我有两个以上的任务。 有
    -堆栈任务(优先级5)
    -应用程序任务(优先级2)
    -按钮任务(优先级5)
    -音频任务(优先级6)
    如您所见,音频具有最高优先级。

    3.我曾考虑过对讲机可以取代I2S ISR,但我不期望它能超出I2S ISR呼叫的时间(或经常呼叫),从而导致I2S ISR呼叫延迟20-40毫秒。

    4.我不知道你在这里说的是什么。 设备重置后,它将重新加入先前配对的现有网络。

    5.老实说,我不是。 我可以尝试一下,但正如您所看到的那样,从信号量从ISR的POST到音频任务唤醒之间的时间已经足够(平均60我们)。 除此之外,如果这能解决问题,就不能解释信号器的奇怪行为。

    此致,
    MF

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

    感谢您按顺序充分回答我的所有问题。  ZR节点始终处于打开状态,并且不必像ZC信任中心那样维护所有节点的连接。  如果Zigbee网络流量是问题的根源,则设备在重置并重新加入后仍会遇到问题。  目前的描述意味着I2S可能会以某种方式干扰Zigbee加入过程,从而影响进一步的操作,例如对讲机继续主动扫描信道或搜索开放网络。 您是否启用了查找和绑定功能?如果禁用此功能,行为是否会改变?  是否可以在加入网络时禁用I2S以观察这是否会影响问题的发生?

    我和一位对I2S驱动程序了解更多的同事交谈,他们说:"我建议验证I2S时钟是否以正确的频率输出。 我认为在这个水平上会出现问题,因为I2S回调频率会发生变化,同时保持相当稳定的频率。
    哪种设备输出I2S时钟(即哪一个是主时钟)?  在所有情况下 ,驱动程序的配置都可能已被修改。 如果TLV是I2S主控制器,请验证输入到TLV的时钟频率(MCLK)以及通过I2C发送的设置是否符合预期。"

    是否可以将您的解决方案迁移到较新的SDK (SIMPLELINK-CC13XX-CC26XX-SDK)以确认工作中没有已解决的错误?  或者 ,通过组合TI提供的ZR和I2S示例,是否可以重现该问题?

    此致,
    Ryan

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

    您好,Ryan:

    很抱歉回复太晚了,我在休病假。

    我检查了I2S时钟,但似乎没有问题。
    我采取了一些变通办法,这对我有所帮助,但老实说,我仍然不知道导致此问题的原因是什么。
    解决方法是在开始音频数据传输之前初始化I2S驱动程序,并在传输结束后立即关闭该驱动程序。

    此致,
    MF

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

    很开心再次听到您的意见,我希望您感觉更好。

    我很高兴您找到了解决方法。  我没有足够的使用Z-Stack和I2S来分析其他可能原因的经验,而且我缺乏复制和调试问题的资源。  另一种基于您所描述的解决方案(尽管也不是最佳解决方案)是在首次加入网络后立即使用SysCtrlSystemReset执行软件重置。  这可以在  zclSampleSw_ProcessCommissioningBDB_Commissioning_Success的BDB_Commissioning_Nwk_steering案例中检测 到。  它只能发生一次,之后您的音频将不会中断。  

    此致,
    Ryan