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.

[参考译文] LAUNCHXL-CC2650:外部闪存 SPI 代码导致读取其他 GPIO 引脚时出现问题

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1189967/launchxl-cc2650-external-flash-spi-code-causes-problem-in-reading-other-gpio-pins

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件: CC2650CC2640

您好!

我使用的是 LAUNCHXL-CC2650

BLE SDK 2_02_07_06

CCS7.4

编译器 TI Ver.5.2.6。

我已经连接了使用 GPIO DIO7引脚的显示屏、我也正在读取外部闪存芯片。

我可以无任何问题地读取外部闪存、但当我读取 GPIO DIO7时、我的代码会挂起。

当我注释外部闪存读取代码时、我可以毫无问题地读取 GPIO DIO7。

请指导我解决此问题

我的外部闪存代码基于"bim_extflash"项目。

谢谢你

Dnyaneshvar salve

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

    在调试过程中、我了解到了这一点

    void bspSpiClose (void)函数禁用 GPIO 模块的时钟和电源

    我按照如下所示修改了代码 、在该显示之后、外部闪存数据读取也起作用。  

    /* See bsp_spi.h file for description */
    //************** THIS IS UNMODIFIED CODE
    void bspSpiClose(void)
    {
      // Power down SSI0
      ROM_PRCMPeripheralRunDisable(PRCM_PERIPH_SSI0);
      PRCMLoadSet();
      while (!PRCMLoadGet());
    
      PRCMPeripheralRunDisable(PRCM_PERIPH_GPIO);
      PRCMLoadSet();
      while (!PRCMLoadGet());
    
      PRCMPowerDomainOff(PRCM_DOMAIN_SERIAL | PRCM_DOMAIN_PERIPH);
      while (PRCMPowerDomainStatus(PRCM_DOMAIN_SERIAL | PRCM_DOMAIN_PERIPH)
             != PRCM_DOMAIN_POWER_OFF);
    }

    /* See bsp_spi.h file for description */
    //************** THIS IS MODIFIED CODE
    void bspSpiClose(void)
    {
      // Power down SSI0
      ROM_PRCMPeripheralRunDisable(PRCM_PERIPH_SSI0);
      PRCMLoadSet();
      while (!PRCMLoadGet());
    
    //  PRCMPeripheralRunDisable(PRCM_PERIPH_GPIO);
    //  PRCMLoadSet();
    //  while (!PRCMLoadGet());
    
    //  PRCMPowerDomainOff(PRCM_DOMAIN_SERIAL | PRCM_DOMAIN_PERIPH);
    //  while (PRCMPowerDomainStatus(PRCM_DOMAIN_SERIAL | PRCM_DOMAIN_PERIPH)
    //         != PRCM_DOMAIN_POWER_OFF);
    
      PRCMPowerDomainOff(PRCM_DOMAIN_SERIAL);
      while (PRCMPowerDomainStatus(PRCM_DOMAIN_SERIAL)
             != PRCM_DOMAIN_POWER_OFF);
    }

    我通过编辑上面的代码部分来允许 GPIO 模块的电源和时钟。

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

    由于上述更改、显示和外部闪存芯片正常工作、但现在 CC2650无法进行广播。 使用 BLE 扫描仪或其他 BLE 应用进行扫描时、我无法看到我的器件。

    我对  extFlashClose()函数进行了注释。

    因此 CC2650再次开始广播。

    但问题是如果我不调用  extFlashClose ();我的外部闪存芯片将不会进入睡眠模式(我的产品基于纽扣电池)

    请帮助

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

    您好 Dnyaneshvar、

    我将此事发送给相关专家、他们应该明天再回来。

    此致、

    Rogelio

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

    尊敬的  Dnyaneshvar salve:

    感谢您的参与。 您能否指定开发所使用的示例项目? 我建议查看以下 E2E 主题: https://e2e.ti.com/f/1/t/462572

    链接的 E2E 主题提供了一些有关如何在器件上使用两个 SPI 接口的见解、在这里可能会有所帮助。

    此致、

    1月

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

    您好 Jan

    我想我把你弄糊涂了。 让我们从全新的细节开始。

    它不涉及使用双 SPI。 我的显示屏使用软件 SPI、CC2650的 SPI 外设仅用于外部闪存芯片。

    我将"简单 BLE 外设"示例项目用作开发的基础代码。

    在这个示例项目中、我已经添加了基于 "bim_extflash"项目的外部闪存读写代码。 我的项目的构建配置是"FlashRom"。

    我已经编写了测试代码来访问 main.c 中的外部闪存芯片

    问题是 "extFlashClose ()"函数。

    如果我调用此函数 extFlashClose ()(在 BIOS_start()之前)、则 CC2650 BLE 不会进行广播。

    如果我对函数"extFlashClose ()"进行注释、CC2650 BLE 将开始广播

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

    您好  Dnyaneshvar ,

    感谢您的澄清。 如果将 extFlashClose ()函数放在 BIOS_start()之后,是否观察到相同的行为?

    此致、

    1月

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

    您好 Jan、

    正如您所说、我已经进行了测试。

    我   在 BIOS_start()函数之后调用 extFlashClose()函数。

    我在   simple_peripheral.c 中调用 extFlashClose ()函数

    但是、如果我注释   extFlashClose () BLE 广播、并且如果我取消注释  extFlashClose ()、我可以发现此 BLE 器件、结果是相同的

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

    您好!

    明白了。 通过 E2E、我发现这个主题似乎描述了与您所看到的(无广告)类似的行为: https://e2e.ti.com/f/1/t/1034296/

    要进行确认、是否使用"C:\ti\simplelink\ble_sdk_2_02_06_07\src\examples\util\bim_extflash\cc2640\board"中的 ext_flash.c 和 ext_flash.h。 目录还是 Ammar 在另一个线程中提到的目录?

    此致、

    1月

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

    您好、Jan、

    我想确认我使用的是什么  

    "C:\ti\simplelink\ble_sdk_2_02_07_06\src\examples\util\bim_extflash\cc2640\board"中的 EXT_flash.c 和 ext_flash.h。

    我查看  了您建议的 e2e.ti.com/.../ sa 并从中复制了文件

    "tirtos_cc13xx_cc26xx_2_21_01_08\products\tidrivers_cc13xx_cc26xx_2_21_01_01\packages/ti\mw\extflash"。

    现在、在执行代码控制时、卡在 SPI_TRANSFCTION 函数处、不会返回。 代码挂起。

    bool SPI_transfer(SPI_Handle handle, SPI_Transaction *transaction)
    {
        return (handle->fxnTablePtr->transferFxn(handle, transaction));//here is the problem
    }

    实际上、在6个月前、当我第一次 为 外部闪存进行编码时、我使用了上述文件。 我遇到了错误。

    故事位于此链接中

    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1121433/launchxl-cc2650-extflashopen-fail-in-cc2650-simple-ble-peripheral-example/4168660?tisearch=e2e-sitesearch&keymatch=%2525252520user%252525253A508658#4168660

    后来、我将 BIM 项目("C:\ti\simplelink\ble_sdk_2_02_07_06\src\examples\util\bim_extflash\cc2640\board")作为参考项目并成功访问了外部闪存。

    但最终我从6个月前开始的那一个角度出发。

    您能为我提供指导吗?

    执行代码控制时、卡在  SPI_TRANSFCTION 函数处、不会返回。 代码挂起。 您可以参考上面的链接、通过屏幕截图了解错误的详细信息。

    Dnyaneshvar salve

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

    尊敬的 Dnyaneshvar:

    明白了。 感谢您提供更多背景信息! 您能否共享您正在使用的 SPI 设置参数? 也许这些参数可以让您对这里可能发生的情况有一些了解。

    此致、

    1月

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

    您好、Jan、

    SPI 设置参数如下所示

    /* Default SPI parameters structure */
    const SPI_Params SPI_defaultParams = {
    SPI_MODE_BLOCKING, /* transferMode */
    SPI_WAIT_FOREVER, /* transferTimeout */
    NULL, /* transferCallbackFxn */
    SPI_MASTER, /* mode */
    1000000, /* bitRate */
    8, /* dataSize */
    SPI_POL0_PHA0, /* frameFormat */
    (uintptr_t) NULL /* custom */
    };

    更新了  

    #define SPI_BIT_RATE              4000000

    void SPI_Params_init(SPI_Params *params)
    {
        *params = SPI_defaultParams;
    }

     

    static bool Spi_open(uint32_t bitRate)
    {
    /* Configure SPI as master */
    SPI_Params_init(&spiParams);
    spiParams.bitRate = bitRate;
    spiParams.mode = SPI_MASTER;
    spiParams.transferMode = SPI_MODE_BLOCKING;
    
    /* Attempt to open SPI. */
    spiHandle = SPI_open(Board_SPI0, &spiParams);
    
    return spiHandle != NULL;
    }

    Dnyaneshvar

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

    尊敬的 Dnyaneshvar:

    当调用传递函数时、您是否在 SPI 引脚上看到任何活动? 您能否尝试将传输更改为回调以查看是否观察到相同的行为?

    此致、

    1月