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.

[参考译文] BP-CC3301:CC3301 FW 传输错误

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1366527/bp-cc3301-cc3301-fw-transport-error

器件型号:BP-CC3301
Thread 中讨论的其他器件:CC3301

工具与软件:

当使用 MCU 驱动 CC3301时、不使用示例文件系统方法将固件下载到 CC3301、而是将固件转换为阵列、并且直接从阵列复制数据以进行下载。 在传输过程中、始终出现错误并显示以下消息:"ERROR Command:timed out、replace context:2!"。  在传输过程中、逻辑分析仪检测到来自 MCU 的数据已正确发送、并且 SPI 配置正确。 但是、IRQ 引脚未显示任何更改。 在传输过程中、此引脚是否应该有任何变化?

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

    我将主机发出的数据整理为如下! 第一帧  /第二帧/   第三帧  

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

    您好!

    您是否遵循代码中的流程?

    我可以看到 IRQ 线路应取消置位的第一条命令(SDIO CMD0)。 你看到了吗?

    然后有一些你没有的其他命令(如读取 AMC 地址)、但我现在不想进入它。

    是否先将 IRQ 线置为有效、然后再置为无效?

    对于你编写的每个块、它应该像这样运行。

    获取完整的逻辑(如 Saleae 捕获)应该没有。

    此致、

    Shlomi

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

    SDK 工具文件夹提供三个 bin 文件。 所有三个 bin 文件都需要下载到3301的 RAM 中吗?

    参考 SDK 中的 network_terminal 项目、在我们的平台上进行调试时、我发现在准备下载固件时、出错了  

    出现"Don't receive ROM init complete (未接收到 ROM 初始化完成)"! 下载"rambtlr"时、cc3301无响应!

    下面是固件下载功能、并显示错误消息"ERROR Command:timed out、replicate context:2!"。

    您能否提供正常运行的 AM243日志?

    int32_t init_device(void)
    {
        int ret = 0;
        /* start downloading the RAM btlr and FW */
        Report("Starting software download.....\r\n");
    
        /* we need to wait so the LX device will wake up */
        if(fwEvent_Wait(2000,HINT_ROM_LOADER_INIT_COMPLETE) == -1)
        {
            Report("didn't receive ROM init complete");
            //assert(0);
            while(1);
        }
        // RAM Bootloader download
        ctrlCmdFw_ContainerDownload("rambtlr");
    
        if(fwEvent_Wait(2000,HINT_SECOND_LOADER_INIT_COMPLETE) == -1)
        {
            Report("didn't receive RAM init complete");
            assert(0);
        }
        
        /* FW download */
        ctrlCmdFw_ContainerDownload("fw");
        if(fwEvent_Wait(2000,HINT_FW_WAKEUP_COMPLETE) == -1)
        {
            Report("didn't receive FW Wakeup complete");
            while(1);
        }
        /* Download ini File Params */
        ctrlCmdFw_DownloadIniParams();
    
        if(fwEvent_Wait(2000,HINT_FW_DOWNLOADING_INI_PARAMS_COMPLETE) == -1)
        {
            Report("didn't receive FW Downloading INI Params complete");
            while(1);
        }
        return ret;
    }

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

    在上述函数运行之前、'bus_sendInitCommand' 函数会向 cc3301发送初始化信息。 如图所示、我已检测到数据。

    您能帮助验证吗? 我想知道这是否是用于正常通信的正确数据。

    发送此命令后、cc3301会将 IRQ 引脚拉至高电平还是低电平?

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

    您好!

    这是在器件端配置 SPI 接口的正确命令(CMD0)。

    在此命令之后、IRQ 不会失效(并且应保持有效状态、即处于高电平)。

    使 IRQ 无效的唯一命令是发送 FW_STATUS_ADDR 命令(0xBFFC)。

    请参阅《我的逻辑》中的捕获。

    此致、

    Shlomi

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

    我不明白你的答案!

    我有几个问题想得到您的确认。

    1、我们的平台是否需要所有这三个文档?

    2、在 init_host.c 文件的 int InitHostDriver()函数中、在执行 bus_sendInitCommand (config/not used/、0)后、它进入 init_device()函数。

    在此函数中、它首先等待 HINT_ROM_LOADER_INIT_COMPLETE 事件完成。 该事件是如何触发的?

    3 μ s、此事件后、文件传输开始。 主机完成传输数据帧后、是否会有3301的状态反馈?

    4、您能否提供 AM243正常运行的日志?

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

    您好!

    是的、您需要全部三个。

    HINT_ROM_LOADER_INIT_COMPLETE 在芯片组上电后触发(用于指示 ROM 引导加载程序已完成初始化)。

    基本上、要开始从芯片读取、有2个命令被发送到芯片(您不需要主动调用这些命令、所有这些命令都作为驱动程序代码的一部分在内部完成):

    • 读取状态寄存器(您应该在 SPI 命令的开头看到0xBFFC)
    • 读取 NAB 命令(0xBFFC)

    然后、发送另一条命令(以0xBFF0开头)。

    对于每个命令、都是这样的。

    您需要什么日志?

    Shlomi

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

     HINT_ROM_LOADER_INIT_COMPLETE 在芯片组上电后触发(以指示 ROM 引导加载程序已完成初始化)。

    这是如何实现的?

    根据程序流程、首先 CC3301上电、经过2秒的延迟后、启用 IRQ 引脚。 这意味着 IRQ 在上电2秒后启用、因此不会发生第一次中断。 它如何能够触发事件 HINT_ROM_LOADER_INIT_COMPLETE?

    int32_t HwInit(void)
    {
        int ret = 0;
    
        /* make sure the device is turned off */
        wlan_TurnOffWlan();
    
        /* disable the IRQ interrupt */
        wlan_IRQDisableInt();
    
        /* turn on the device */
        wlan_TurnOnWlan();
    
        /* enable the IRQ interrupt */
        wlan_IRQEnableInt();
    
        return ret;
    }
    void wlan_TurnOnWlan()
    {
        if(0 == gWlanENGpioAddr)
        {
            /* Get address after translation translate */
            gWlanENGpioAddr = (uint32_t) AddrTranslateP_getLocalAddr(WLAN_EN_BASE_ADDR);
            GPIO_setDirMode(gWlanENGpioAddr, WLAN_EN_PIN, WLAN_EN_DIR);
        }
    
        if(1 == GPIO_pinOutValueRead(gWlanENGpioAddr, WLAN_EN_PIN))
        {
            wlan_TurnOffWlan();
        }
        osi_Sleep(2);
        GPIO_pinWriteHigh(gWlanENGpioAddr, WLAN_EN_PIN);
    
        osi_Sleep(2);
    }

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

    您能否发布一个不使用 LIB 库但包含项目中所有 C 源文件的版本? 这将提高代码可读性、否则、只能在分步调试期间读取代码!

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

    查看从我的 Loggic 、中捕获在图中、从 CC3301开始到 CC3301生成的上升沿中断、间隔为31ms、远小于代码中指定的2ms!

    能否给大家截屏一下它正常运行的情况? 我想确认 IRQ 是如何触发 HINT_ROM_LOADER_INIT_COMPLETE 事件的!

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

    您好!

    您可以查看捕获。 我可以看到在释放 NReset 和 IRQ 置为有效之间~30mSec。

    问题可能与 OSI_SLEEP()函数有关。

    我可以看到实现方式为:

    OsiReturnVal_e osi_Sleep(OsiTime_t sec)
    {
        TickType_t xDelay;
    
        if (sec > 0xFFFFFFFF / configTICK_RATE_HZ) {
            xDelay = 0xFFFFFFFF;
        }
        else {
            xDelay = sec * configTICK_RATE_HZ;
        }
    
        vTaskDelay(xDelay);
        return OSI_OK;
    }

    由于 configTICK_RATE_Hz 为1000、因此意味着每个节拍为1mSec、因此我认为这里的实际延迟是以 ms 为单位、而不是以秒为单位。

    此致、

    Shlomi

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

    您好、Shlomi Itzhak

    感谢您的重播!

    您的屏幕截图仅涵盖上电后该过程的一部分。

    我需要一个从开机前到首次固件数据包交付的完整屏幕截图!

    关于2秒延迟、如果器件存在问题、为什么您提供的示例在 AM243上正确运行?

    从您的屏幕截图中可以看出、当 IRQ 生成下降沿时、主机发送第一个数据帧。

    通过查看 AM43的示例代码、我发现主机在 IRQ 首次生成上升沿(用于初始化总线)后立即发送第一个数据帧。 下面是代码的相关部分。

        /* Set HW init */
        ret = HwInit();//turn on slave
        
        if(ret < 0)
        {
            Report("HwInit failed \n\r");
            assert(0);
        }
    
        Report("Hardware init DONE! \n\r");
    
        /* send command to init bus */ //TODO AMIR , input need to be change when we will use sdio/spi/hif
        bus_sendInitCommand(config/*not used*/, 0);
    
        ret = init_device();

    谢谢!

    Gavin

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

    您好!

    让我再次记录完整初始化、我将共享它。

    此致、

    Shlomi

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

    您好!

    请查看完整的逻辑捕获。 您需要使用 saleae 来打开它。

    从 屏幕截图中可以看出详细信息很难看到、但主机首先发送 INIT 命令 、这并不会使 IRQ 失效、而是下一条发出的命令(从地址0xBFFC.e2e.ti.com/.../cc33xx_5F00_MCU_5F00_full_5F00_platform_5F00_init_5F00_network_5F00_terminal.sal 开始)

    此致、

    Shlomi

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

    您好、 Shlomi

    我已经比较并发现了几个问题:主机的 IRQ 引脚被3301拉高、下面的帧存在差异。

    顶部是屏幕截图、底部是我的屏幕截图。 已经发现了这两个差异。

    我已经osi_SleepvTaskDelaywlan_TurnOnWlan功能中替换了、并且单位也已更改为毫秒。

    能否帮助我分析一下误差可能在哪里?

    HINT_ROM_LOADER_INIT_COMPLETE事件是主机本身在上电后完成的事件、还是3301生成的中断后完成的事件?

    如果我将3301的三个文件放置在主机闪存的固定地址内并使用const修饰符、此事件是否仍然必要?

    谢谢!

    Gavin

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

    您好!

    我看到了不同之处、如果有问题、可以在内部进行检查。

    从捕获来看、您似乎在非常低的 SPI 速率(500K?、1M?)下工作。

    这有目的吗?

    Shlomi

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

    SPI 速率为500K 很有用途!  这不会影响数据交互。

     HINT_ROM_LOADER_INIT_COMPLETE 事件是主机本身在上电后完成的事件、还是3301生成的中断后完成的事件?

    如果我将3301的三个文件放置在主机闪存的固定地址内并使用 const 修饰符、此事件是否仍然必要?

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

    您好!

    ROM 引导加载程序完成后、CC3301将中断置为有效。

    您需要在获得正确的中断时遵循加载每个文件的过程。

    Shlomi