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.

[参考译文] RTOS/LAUNCHXL-CC2650:OADTarget_readFlash 函数的奇怪行为

Guru**** 2560390 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/571654/rtos-launchxl-cc2650-strange-behavior-with-oadtarget_readflash-function

器件型号:LAUNCHXL-CC2650

工具/软件:TI-RTOS

如果我将 sectorbytes 定义并初始化为:

uint8_t sectorbytes[4096]={0};

然后、在 buttonpresshandler 函数中、我具有以下代码:

 交换机(pState->pinId)
 {
   案例 Board_BUTTON0:
     如果(pState->state)//每按一次按钮只能执行一次
     {
         if (OADTarget_open())
          {
             OADTarget_eraseFlash (1);
             OADTarget_readFlash (1、0、sectorbytes、4096);
          }
          OADTarget_Close();
          Log_Info1 ("%s"、(IArg")"擦除和读取扇区1");
     }
     ButtonService_SetParameter (BS_BUTTON0_ID、
                                sizeof (pState->state)、
                                pState->state (&P);
     中断;

(笑声)

如果我将 sectorbytes 调整为3073或更大、当按下按钮时、sectorbytes 设置为3072 0x00、其余0xFF

如果我将 sectorbytes 调整为3072或更小、则生成的 sectorbytes 都是0xFF

我对 MX25R8035F 闪存和 OADTarget_eraseFlash 的理解是、它一次擦除一个整个4K 扇区、因此对高达4096字节的已擦除扇区的任何读取都应返回所有0xFF。

这里发生了什么情况、或者是否有更好的论坛?

谢谢、

戴尔

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

    为了进一步隔离此问题、我执行了以下操作:

    我定义并初始化:

    uint8_t 扇区1start[12]={"S"、'e'、'c'、't'、'o'、 'R'、'1'、'S'、't'、'A'、 'r'、't'};
    uint8_t sectorbytes[4096]={0};

    然后、在 buttonpresshandler 函数中、我具有以下代码:

     交换机(pState->pinId)
     {
       案例 Board_BUTTON0:
         如果(pState->state)//每按一次按钮只能执行一次
         {
             if (OADTarget_open())
              {
                 OADTarget_eraseFlash (1);
                 OADTarget_writeFlash (1、0、扇区1start、12);
                 OADTarget_readFlash (1、0、sectorbytes、4096);
              }
              OADTarget_Close();
              Log_Info1 ("%s"、(IArg")"擦除、写入和读取扇区1");
         }
         ButtonService_SetParameter (BS_BUTTON0_ID、
                                    sizeof (pState->state)、
                                    pState->state (&P);
         中断;

    当我运行它时、我发现 sectorbytes 中有12个字符串"sector 1start"、但它的位置是3072。 这更说明问题是读取函数没有从存储器中的正确地址开始。

    其他人能否确认我的发现、或者我的设置是否有问题?

    编辑:如果我在任何地方读取闪存、但一次只读取256个字节、我可以看到原始写入操作正确、问题在于较长的读取报告的数据与短读取不同。

    谢谢、

    戴尔

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

    您是对的、您一次只能向该闪存写入256个字节。 您是否检查 了尝试写入的字节超过256时 ExtFlash_write()是否返回 false?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我理解页面编程、我没有写入任何大于256字节的内容。

    问题是长读操作不会返回正确的数据。

    戴尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您一次也只能读取256个字节。 查看 ExtFlash_read()和 ExtFlash_write()的实现,似乎可以写入超过256个字节。 每个256字节访问都包含在一个循环中、而读取函数中不存在此类循环。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、但产品说明书 MX25R8035F 不限制一次可以读取的数据量、正如您所说的、读取函数也不会限制它。

    在 ExtFlash_read()中,它限制为读取256字节的位置?

    那么、为什么长读取会给我们提供错误的数据?

    戴尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    闪存读取使用 SPI 驱动器、该驱动器对一次传输的量有限制。 您可以看一看 SPICC26XXDMA.c
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Christin:

    抱歉、我无法查看 SPICC26XXDMA.C 中 SPI 驱动程序限制读取256字节的位置

    在任何情况下、只要我将自己限制在256字节读取、一切都很好、我将假定、除非我变大、否则没有任何可能使我感到受伤害的 lurking 问题。

    戴尔