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.

[参考译文] CC1352R:负载框架限制为外部闪存<8Mbit/1MB (即 255页)

Guru**** 2553450 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1066020/cc1352r-oad-framework-limited-to-external-flash-8mbit-1mbyte-i-e-255-pages

部件号:CC1352R
“线程:测试”中讨论的其它部件

显然,OAD 框架( simplelink_cc13x2_26x2_SDK_4_10_00_78和 simplelink_cc13x2_26x2_SDK_5_20_00_52)限制为0x100000字节的外部闪存大小(实际上,由于闪存页变量为 uint8_t 类型,因此总闪存大小为4096字节)。

我想知道,这背后是否有具体的原因?

修补多个文件以使用较大的闪存或。通过相对简单的更改,更多的闪存页面(使用 uint16_t)似乎是可行的。 我想知道为什么这件事一开始就没有做到,如果我错过了什么。

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

    您好,丹尼尔,

    这是 CC13xx 和 CC26xx 启动板上的外部闪存大小。

    如果您在 ext_flash.c 中查看,我们实际上包括了几种不同的外部闪存设备供您选择。

    // Supported flash devices
    static const ExtFlashInfo_t flashInfo[] =
    {
        {
            .manfId = 0xC2,         // Macronics MX25R1635F
            .devId = 0x15,
            .deviceSize = 0x200000  // 2 MByte (16 Mbit)
        },
        {
            .manfId = 0xC2,         // Macronics MX25R8035F
            .devId = 0x14,          //
            .deviceSize = 0x100000  // 1 MByte (8 Mbit)
        },
        {
            .manfId = 0xEF,         // WinBond W25X40CL
            .devId = 0x12,
            .deviceSize = 0x080000  // 512 KByte (4 Mbit)
        },
        {
            .manfId = 0xEF,         // WinBond W25X20CL
            .devId = 0x11,
            .deviceSize = 0x040000  // 256 KByte (2 Mbit)
        },
        {
            .manfId = 0x0,
            .devId = 0x0,
            .deviceSize = 0x0
        }
    };

    谢谢,

    玛丽·H.

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

    Marie,您好!

    这不是问题的关键。 要点是:框架如何通过我发现的内部机制/API 支持大于1 MB 的容量?

    请注意,在 flash_interface.h 中,页面(扇区)大小始终固定为0x1000 (4096):
    #define EFL_PAGE_SIZE 0x1000

    现在,假设 上述 Macronics MX25R1635F 部分具有2 MB (=2098176字节),且扇区大小为4096字节,则扇区总数为2098176/4096=512。

    我看到的问题是,用于页面处理的内部接口无法解决整个闪存问题,因为 API 只提供 uint8_t:

    static uint8_t oadEraseExtFlashPages(uint8_t imgStartPage, uint32_t imgLen, uint32_t pageSize);

    有问题的参数是  uint8_t imgStartPage。 使用此接口,只能寻址*ANY*闪存的前256*4096=1MB 内的起始扇区。

    这是我的问题:我是否遗漏了某些东西,或者这是您遗漏的一个错误?

    PS: 我注意到我在原始邮件中犯了一个愚蠢的错误,1 MB 不是16 MB,而是8 MB;所以 我纠正了这个错误。

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

    您好,丹尼尔,

    我们只使用此闪存大小进行测试。 但是,如果您增加软件中的闪存大小,我希望它能够正常工作。

    谢谢,

    玛丽·H

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

    Marie,您好!

    无论如何,你的回答不是很令人满意,让我们把它留到这一点上。  

    我很确定,当您将 #define EFL_FLASH 大小0x100000调整为更大的值时,它不起作用,因此,让我给其他可能有大于1 MB 的外部闪存的人一些想法,并对此表示好奇 (以下是假定扇区/页面大小为4096):

    以 oadFindFactImgAddr()计算的初始闪存页采用32位全算术计算,闪存页数> 255可以,一旦闪存大于1 MB *(*请参阅后面的内容),闪存页将返回。
    用于擦除闪存页的内部接口基于8位数字,因此可寻址的最大启动闪存页数为255。
    当闪存大于1 MB 时,您会遇到问题,因为数字将被截断(有趣的是,当您将 uint16类型变量作为 uint8参数传入时,编译器甚至不发出警告)。 如果小于1 MB,则情况良好。

    *答案是“大于”:我们可以区分真正的闪存大小和 OAD 认为它的大小。 后者在 flash_interface.h 中定义  
    #define EFL_FLASH 大小0x100000
    即使您的闪光灯更大,您也不应将此值设为大于该值。 所以我们假了! 最大大小为0x100000 (仅适用于 OAD 上下文!)。

    结果是 OAD 工作正常,但实际图像不会存储在闪存的最末,它将存储在第一个1 MB 边界的末尾。 如果您能忍受这种情况,那么您最好使用当前代码(也许这不是一个错误,而是一个功能? 谁知道...)

    顺便说一句,将代码扩展到支持16位页面尺寸并不像我最初认为的那么容易,因为8位限制可以在所有地方找到: 这不仅在 OAD.c 中,也在 CRC32.c 模块中, 甚至在 bim_main 中传播到 BIM。c 这是我调查的要点,我停止考虑扩展代码以支持16位页码。

    对我来说,这是所提供的代码的一个小缺点。

    如果有人有修正和/或其他想法,请告诉我。

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

    您好,丹尼尔,

    感谢您的发帖,我认为您处境中的其他人会觉得这非常有帮助。

    谢谢,

    玛丽·H