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/CC2640R2F:使用外部闪存

Guru**** 2589275 points
Other Parts Discussed in Thread: BLE-STACK

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/601557/rtos-cc2640r2f-external-flash-use

器件型号:CC2640R2F
Thread 中讨论的其他器件:BLE-STACK

工具/软件:TI-RTOS

CC2640R2定制4x4电路板、simplelink_cc2640r2_sdk_1_35_00_33、XDS200调试器。

使用 simple_peripheral 项目成功地从 BLE_SDK_2_02_01_18移植了该项目。 要使用 API 与外部闪存通信,请将 ExtFlash.c 和 ExtFlash.h 链接到应用程序。 使用了 FlashROM 构建配置。

CC2640R2定制板上移植的项目通过 UART 广播、连接并可与外部处理器通信、如果未使用外部闪存、则在移植后待机电流消耗不会改变。

当定制板配置为使用外部闪存时、CC2640R2在访问外部闪存后不会进入待机状态。 当 ble_sdk_2_02_01_18项目使用外部闪存时、待机电流消耗约为50uA、表示外部闪存可能未按预期断电。 待机电流消耗高于理想值、但稳定。 使用 CC2640R2板时、系统在访问外部闪存后完全不满意。 仪表指示电流过流的频率比通告间隔要高得多。

在外部闪存访问后、移植是否会导致此电流过载?

      移植前后使用相同的中间件文件。

2.      从外部闪存读取后会发出通知。 这将调用 GATT_notification。 每小时有一个到外部闪存的写入。 在此期间不发送任何通知。 但是、第一次写入(一小时后)是系统停止进入待机状态的时候。

我已附上应用程序用于在两个 SPI 从器件之间进行选择的代码。

SPI 从器件1选择

void ACAM_RESUME (void)

   SPI = SPI_OPEN (CC2640R2_Custom_SPI0、&spiParams);

   if (SPI == NULL){

       System_printf ("\n 打开 SPI"时出错);

   }

 

   PIN_ID csnPin1 = PIN_ID (Board_ACSN);

   SPI_CONTROL (SPI、SPICC26XXDMA_SET_CSn_PIN、&csnPin1);

   acamEnabled = 1;

 

SPI 从器件2选择(外部闪存)

中间件使用 PIN API 来选择外部闪存。 为了避免 SPI_CONTROL API 干扰这一点、在 ExtFlash.c 中添加了以下两行:

静态 PIN_ID csnPin = PIN_ID (PIN_Unassigned);

静态 bool SPI_open (uint32_t 比特率){

   /*禁用驱动程序芯片选择功能。 这由处理

    * extFlashSelect 和 extFlashDeselect 方法*/

   SPI_CONTRATION( spiHandle、SPICC26XXDMA_SET_CSn_PIN、&csnPin );

在 SBP 周期事件期间、每小时写入一次外部闪存。 以下是该代码:

 

静态 SimpleBLEPeripheral_performPeriodicTask ()

#ifndef Feature_OAD

 

   TIMESTAMP++;

   如果(时间戳% 720 = 0){ // 5秒间隔(720 = 1小时)

 

       ACAM_SUSPEND ();

 

       //写入趋势值。

       if (ExtFlash_open())

       {

           uint8_t 数据记录[data_log_length];

 

           dataalog[0]=(uint8_t)(时间戳和0x000000ff);

           dataalog[1]=(uint8_t)((时间戳和0x0000ff00)>> 8);

           dataalog[2]=(uint8_t)((时间戳和0x00ff0000)>> 16);

           dataalog[3]=(uint8_t)((时间戳和0x000000)>> 24);

           dataalog[4]=(uint8_t)(calc_prsAdvMode 和0x0000ff);

           dataalog[5]=(uint8_t)((calc_prsAdvMode 和0x00ff00)>> 8);

           dataalog[6]=(uint8_t)((calc_prsAdvMode & 0x0000)>> 16);

           dataalog[7]=(uint8_t)(温度和0x00ff);

           datalog[8]=(uint8_t)((温度和0x0000)>> 8);

 

           //存储标准趋势值。

           if (趋势<= MAX_TRENDS)

           {

               uint8_t addr = data_log_length *趋势;

 

               if (addr % EXT_FLASH_PAGE_SIZE = 0){

                   ExtFlash_erase (addr、EXT_FLASH_PAGE_SIZE);

               }

 

               if (ExtFlash_write (addr、data_log_length、datalog))

               {

                   趋势++;

               }

               其他

               {

                   故障++;

               }

           }

 

           //检查是否处于报警状态并存储趋势值。

           if (status!= STATUS_OK && alarmTrends <= MAX_TRENDS)

           {

               uint8_t addr =(data_log_length * alarmTrends)+(MAX_TRENDS * data_log_length);

 

               if (addr % EXT_FLASH_PAGE_SIZE = 0){

                   ExtFlash_erase (addr、EXT_FLASH_PAGE_SIZE);

               }

 

               if (ExtFlash_write (addr、data_log_length、datalog))

               {

                   alarmTrends++;

               }

               否则

                   故障++;

               }

             }

           }

 

           ExtFlash_Close ();

 

       ACAM_RESUE();

       uint8时间戳[TIMESTAMP_RANGE_LENGTH];

 

       IttDeviceData_GetParameter (ITT_PRS_TIMESTAMP_RCV、时间戳);

 

       //更新开始和结束时间戳值。

       //检查是否设置了启动时间戳。

       如果(时间戳[0]= 0x00

               &&时间戳[1]= 0x00

               &&时间戳[2]=0x00

               &&时间戳[3]= 0x00)

       {

           memcpy (&timestamp、&timestamp、4);

       }

       其他

       {

           //否则设置最新的结束时间戳

           memcpy (&timestamp[4]、&timestamp、4);

       }

       IttDeviceData_SetParameter (ITT_PRS_TIMESTAMP_RCV、TIMESTAMP_RANGE_LENGTH、时间戳);

 

       uint8 itPrsAlarmTimeTrend[TIMESTAMP_RANGE_LENGTH];

       IttDeviceData_GetParameter (ITT_PRS_ALARM_TIME_TREND、itPrsAlarmTimeTrend);

       //检查是否设置了启动时间戳。

       if (itPrsAlarmTimeTrend[0]= 0x00

               && itPrsAlarmTimeTrend[1]= 0x00

               && itPrsAlarmTimeTrend[2]= 0x00

               && itPrsAlarmTimeTrend[3]= 0x00)

       {

           memcpy (&ittPrsAlarmTimeTrend、&timestamp、4);

       }

       其他

       {

           //否则设置最新的结束时间戳

           memcpy (&ittPrsAlarmTimeTrend[4]、&timestamp、4);

       }

       IttDeviceData_SetParameter (ITT_PRS_ALARM_TIME_TREND、TIMESTAMP_RANGE_LENGTH、itPrsAlarmTimeTrend);

   }

#endif //!Feature_OAD

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

    在您的定制板上运行 BLE-Stack v2.2.1项目时是否会发生此行为?

    如果您从 SimpleLink CC2640R2 SDK 中的项目开始、会发生什么情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rachel、

    在数据记录第一个小时后、ble_sdk_2_02_01_18项目更加稳定。
    待机功耗约为50uA。

    simplelink_cc2640r2_sdk_1_35_00_33显示了之后的更大电流过流
    数据记录的第一个小时。

    SimpleLink CC2640R2 SDK 中的哪个项目使用外部闪存?

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

    简单外设 OAD 片外项目在 OAD 过程中写入外部闪存、但您可以通过向 ExtFlash_test 添加调用来进行测试而不通过 OAD 来查看是否看到相同的电流跳转。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rachel、
    我导入了 simple_peripheral_cc2640r2lp_app_oad_offchip 的纯净副本
    (和 bim_oad_offchip_cc2640r2lp_app)。 我将其定制为定制板引脚。
    清洁复印电流消耗正常、广播间隔为2秒

    我在下面添加了以下粘贴行。 我无法获取调试器
    要在此处停止、示波器上未检测到外部闪存芯片选择。
    是否知道为什么不进行定期事件/外部闪存访问?

    谢谢、
    Priya


    静态空 SimpleBLEPeripheral_performPeriodicTask (空)

    uint8_t 数据记录[1];
    dataalog[0]= 0xb5;
    uint8_t addr = 176;
    if (ExtFlash_open()){
    ExtFlash_erase (addr、4096);
    ExtFlash_write (addr、4096、数据记录);


    #ifndef feature_OAD_ONCHIP
    uint8_t valueToCopy;

    //调用以检索配置文件中第三个特征的值
    if (SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR3、&valueToCopy)==成功)

    //调用以设置配置文件中第四个特征的值。
    //请注意,如果已收到第四个特征的通知
    // GATT 客户端设备启用,然后将发送通知
    //每次调用此函数。
    SimpleProfile_SetParameter (SIMPLEPROFILE_CHAR4、sizeof (uint8_t)、
    &valueToCopy);

    #endif //!feature_OAD_ONCHIP
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在定制板上设置了 simple_peripheral_cc2640r2lp_app 的纯净副本。
    我将 ExtFlash.c 和 h 文件链接到了应用程序。 电路板显示待机电流为1uA
    电流消耗。 当我向 SimpleBLEPeripheral_init 函数添加 ExtFlash_test()时,
    待机电流消耗也为1uA。 因此定制板上的外部闪存是能够实现的
    断电。


    在一个广播事件之后、我将这些行添加到的纯净副本中
    simple_peripheral:

    IF (pEvt->EVENT_FLAG & SBP_ADV_CB_EVT)


    uint8_t 数据记录[1];

    if (ExtFlash_open()){
    数据记录[0]= 45;
    ExtFlash_erase (32、4096);
    ExtFlash_write (32、16、数据记录);


    ExtFlash_Close ();



    我可以看到示波器上的外部闪存芯片选择处于活动状态。 但是、待机模式
    电流消耗为10uA。 外部闪存是否未通过这些 API 断电?

    当将相同的代码行添加到 SimpleBLEPeripheral_performPeriodicTask (void)时、
    外部闪存芯片选择从未激活。 在该函数内设置的断点从不
    已停止调试器。 是否有相关说明?

    谢谢、
    Priya