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.

[参考译文] CC1312R:在通过 UART 接收到过多数据期间不向闪存写入数据

Guru**** 2484615 points
Other Parts Discussed in Thread: CC1312R

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1194079/cc1312r-not-writing-to-flash-during-received-too-much-data-via-uart

器件型号:CC1312R

大家好、我有一个连接到 BeagleBone 的 CC1312。 BeagleBone 通过 UART 向 CC1312发送命令。 一切都正常、但如果发送过多命令(在短时间内)写入 CC1312的闪存、CC1312会复位、并且在其闪存中数据错误。 当 CC1312在无线电接收器上时、会发生这种情况。 很遗憾、我无法发送整个程序、但它如下所示:

// I use UART2_Mode_CALLBACK;
    void readCallbackUart(UART2_Handle handle, void *buf, size_t count,
                          void *userArg, int_fast16_t status)
    {
        device.isUartRead = status == UART2_STATUS_SUCCESS ? 1 : 0;
        // I tried to add following but it did not help
        if (status != UART2_STATUS_SUCCESS)
        {
            UART2_flushRx(uartHandle);
        }
    }

    // radio receiving and uart processing
    RF_postCmd(rfHandle, (RF_Op *)&RF_cmdPropRx, RF_PriorityNormal,
               radioCallback,
               RF_EventRxEntryDone);
    while (((volatile RF_Op *)&RF_cmdPropRx)->status < 4)
    {
        if (device.isUartRead)
        {

            // here is called a function performing writing to flash
            // it uses two region, one si a mirror to allow change only some without
            // having the whole region in ram hence there are commands NVS_erase
            // and NVS_write
            // after processing the command ACK via uart is sent
            
            device.isUartRead = 0;
            UART2_read(uartHandle, &uartBuffer, sizeof(uartBuffer), NULL);
        }
    }
    
    // radio callback
    void radioCallback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
        if (e & RF_EventRxEntryDone)
        {
            memcpy(rxPacket, (uint8_t *)&currentDataEntry->data,
                   (*(uint8_t *)(&(currentDataEntry->data))) + NUM_APPENDED_BYTES);

            RFQueue_nextEntry();
            // I added following, it helped but only a bit
            if (device.isUartRead)
            {
                return;
            }
            
            processData();// processing the received data
        }
    }

我猜这是由于 UART 输入缓冲区已满而导致器件复位(此时可能正在执行闪存擦除/写入)、但我不确定。 无论如何、在我处理当前 UART 数据之前、我应该如何轻松地避免将任何其他数据接收到 UART 输入缓冲器中?

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

    您好、

    我认为、如果硬件流控制尚未完成、这将是有用的地方!

    您是否有办法在两侧启用它? 这样、您的 CC1312R 就可以让 BeagleBone 知道它何时真正准备好处理更多数据。

    此致、

    Arthur

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

    遗憾的是、硬件设计已经完成。 我只使用 TX 和 Rx 信号。 除此之外、一切都是可靠的。 这种情况(发送太多命令)不会发生、只有在 BeagleBone 处于索道故障环路中时才会发生。 但是、即使这样、我也很乐意解决它... 还有其他可能性吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="432077" URL"~/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1194079/cc1312r-not-writing-to-flash-during-received-too-much-data-via-uart "]如果写入 CC1312的闪存、CC1312将复位[/引用]

    -为什么 CC1312R 复位? 是否启用了导致复位的看门狗?

    -由于您在获得"太多数据"时看到这一点、我怀疑程序计时会阻止及时处理传入数据、并且您开始在分配的区域之外写入数据、这将导致闪存数据损坏。  

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

    是的、我启用了看门狗、复位可能是由看门狗引起的。

    您的意思是"开始在外部写入数据"? 我一直写入到闪存的相同器件没有问题、因为有使用过的常量、所以不会有问题。 但是、如果您是指 UART 数据、则数据很可能会在之前的 UART 数据之后写入、并且会发生溢出。 但问题是如何避免在接收到第一个 UART 数据后保存其他 UART 数据...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="432077" URL"~/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1194079/cc1312r-not-writing-to-flash-during-received-too-much-data-via-uart/4503305 #4503305"]“开始在外部写入数据"[/引用]

    我这边的措辞不好。 我当时的想法是内存分配等 简化版、如果您将存储器设置为存储5个字节、然后得到8个字节、那么最后3个字节可能会导致随机位置、或者在收集下一条指令的最坏情况下导致崩溃。  

    但我会开始查找复位的原因。 它是看门狗吗?如果是这样、哪个线程挂起并导致复位? 我假设可以重写一些代码、以便更好地处理传入数据。  

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

    感谢您的解释。 但我认为内存分配没有问题。 我始终使用相同的缓冲器。 如果存在"正常"UART 通信、则不会出现任何问题。 u 使用 NORTOS、因此我只有1个线程。 如何找出复位的原因? 主要问题不是器件复位、而是闪存中的配置数据被擦除。 程序可能会在闪存擦除和闪存写入之间停止工作。 请回答这个问题:是否可以通过某种方式识别 UART 输入缓冲区是否已满、如果已满、会出现什么情况? 在我处理当前数据之前是否可以忽略其他传入数据?

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

    您好、

    来回答您的问题。 使用"OE"标志(《技术参考手册》第21.7.1.1节)确实可以在硬件中执行此操作。

    您要做的是订阅 UART2_EVENT_overrun 事件,并在该事件发生时禁用 RX,至少在时间上如此。

    为此、请使用以下设置配置您的 UART2_Params 实例:

    • uartParams.eventCallback =<your callback function, where you will disable RX using UART2_rxDisable>
    • uartParams.EventMask = UART2_EVENT_溢出

    此致、

    Arthur

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

    谢谢、

    实际上我做了几分钟前你提到的事情:-)除了我在回调中调用 flushUart 函数。 如何临时禁用 UART 并在稍后启用它?

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

    您要做的是将 UART2_rxDisable 与 flushUart 结合使用、并在将来使用 UART2_txEnable 重新启用、例如、通过计时器回调。

    让我知道它是如何工作的、

    此致、

    Arthur

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

    不幸的是,它没有帮助。

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

    您好!

    更具体一点、您是否意味着您在禁用 UART 的情况下仍会丢失闪存数据? 或者在接收大量数据时芯片是否仍然复位?

    您是否曾访问过 UART 溢出事件的回调?

    此致、

    Arthur

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

    您好!

    我的意思是完全相同的行为。 它被看门狗重新读取、之后闪存数据(仅在我通过 NVS 函数编辑的区域中)具有默认值(0xFF)、但有时它不会被完全擦除、并且数量也会改变、我猜这取决于冻结的发生时间。

    [引用 userid="519780" URL"~/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1194079/cc1312r-not-writing-to-flash-during-received-too-much-data-via-uart/4513357 #4513357"]是否曾访问过 UART 溢出事件的回调?

    是的、我尝试在这里放置断点、它会进入这里...