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.

[参考译文] IWR1642BOOST:CAN#39;t open QSPI flash

Guru**** 2540720 points
Other Parts Discussed in Thread: UNIFLASH, IWR1642, IWR1443

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/763245/iwr1642boost-can-t-open-qspi-flash

器件型号:IWR1642BOOST
主题中讨论的其他器件:UNIFLASHIWR1642IWR1443

我采用了测试代码并尝试以 CLI 命令的形式执行它。  这是我的代码。  它不会从 QSPIFlash_open 返回。  出什么问题了。  我是否需要设置编译器选项?  我按照 SWRA583的说明进行了操作。   

#define TEST_DATA_LENGTH 4096U

uint8_t gTestDataArray[test_data_length];

/*系统 DMA 句柄,在初始化任务中创建*/
dma_handle gDmaHandle =空;
QSPI_Handle gQSPIDrv =(QSPI_Handle)空;

int32_t test_qspiflash (int32_t argc、char* argv[])

dma_params dmaParams;
int32_t RetVal = 0;
uint32_t flashAddr = 0U;
SPIFLASH_DevID DevID;
uint32_t 索引;
uint32_t testDataLen = 0U;
uint8_t* readDataArray;
QSPI_Params QSPIParams;
QSPIFlash_Handle QSPIFlashHandle =空;
uint32_t dmaChan = 10;

/
*测试:MCPI_Initialize
(二 /
/*设置 PINMUX 以显示 QSPI */
Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINR12_PADAP、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAGE_HW_CTRL);
Pinmux_Set_FuncSel (SOC_XWR16XX_PINR12_PADAP、SOC_XWR16XX_PINR12_PADAP_QSPI_CLK);

Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINP11_PADQ、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
Pinmux_Set_FuncSel (SOC_XWR16XX_PINP11_PADAQ、SOC_XWR16XX_PINP11_PADAQSPI_CSn);

Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINR13_PADAL、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
Pinmux_Set_FuncSel (SOC_XWR16XX_PINR13_PADAL、SOC_XWR16XX_PINR13_PADAL_QSPI_D0);

Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINN12_Padam、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
Pinmux_Set_FuncSel (SOC_XWR16XX_PINN12_Padam、SOC_XWR16XX_PINN12_Padam_QSPI_D1);

Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINR14_Padan、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
Pinmux_Set_FuncSel (SOC_XWR16XX_PINR14_Padan、SOC_XWR16XX_PINR14_Padan_QSPI_D2);

Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINP12_PADAO、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
Pinmux_Set_FuncSel (SOC_XWR16XX_PINP12_PADAO、SOC_XWR16XX_PINP12_PADAO_QSPI_D3);

/*调试消息:*/
cli_write ("*********) \n");
cli_write ("Debug: QSPI Driver Test Application Start \n");
cli_write ("*********) \n");

/*初始化 QSPI 驱动程序*/
QSPI_INIT();

/*初始化 QSPI 闪存*/
QSPIFlash_init ();

/*打开 QSPI 驱动程序*/
QSPI_Params_init (&QSPIParams);

/*将 QSPI 外设时钟设置为200MHz */
QSPIParams.qspiClk = 200 * 1000000U;

QSPIParams.clkMode = QSPI_CLOCK_MODE_0;

以40MHz QSPI 比特率运行
* QSPI 位时钟速率源自 QSPI 外设时钟(qspiClk)
并在内部将时钟分频为位时钟速率
BitClockRate = qspiClk/除数(=5、由 QSPI 驱动器在内部设置)
*
QSPIParams.bitrate = 40 * 1000000U;

gQSPIDrv = QSPI_OPEN (&QSPIParams、RetVal);

if (gQSPIDrv ==空)

cli_write ("QSPI_open 失败、错误=%d\n"、RetVal);
转到出口;

/* Init SYSDMA 参数*/
dma_params_init (&dmaParams);

/*打开用于 SPI 测试的 DMA 驱动程序实例0 */
gDmaHandle = dma_open (0、&dmaParams、&RetVal);

if (gDmaHandle ==空)

cli_write("打开 DMA 驱动程序失败,返回 null \n");
返回-1;

readDataArray = Memory_alloc (NULL、test_data_length、64、NULL);
if (readDataArray ==空)

cli_write ("Test array allocation failed\n");

其他

cli_write ("Test array allocation -> 0x%x\n\n"、readDataArray);

/
*测试:打开 API 测试
(二 /

/*打开 QSPI 实例*/
QSPIFlashHandle = QSPIFlash_open (gQSPIDrv、RetVal);
if (QSPIFlashHandle ==空)

cli_write ("QSPIFlash Open returned null ");
转到出口;

其他

cli_write ("QSPIFlash Open API Passed ");

/*正常关机*/
QSPIFlash_Close (QSPIFlashHandle);
cli_write ("Debug: QSPIFlash instance has been closed successfully\n");

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

    1.您是否能够使用 Uniflash 对 EVM 进行编程并运行 OOB 演示? 需要确认电路板工作正常。
    2.这是使用闪存驱动器的定制板吗?

    此致、
    查尔斯·奥
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是 TI 提供的一款工作正常的 IWR1642升压板。 我一直在运行演示代码、一切都正常。 我有很多次闪存程序。 它不是定制板。 升压板是否具有用户可写闪存。 该说明不涉及外部闪存驱动器。 我认为 QSPI 闪存是用于存储程序的板载串行闪存。 我使用一个扇区来存储配置信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,查尔斯 对此有什么看法? 5天没有任何活动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我运行了这个、它工作正常。 请尝试 使用 code composer 加载.xer4f 文件并运行它。  并运行它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    导入测试代码时遇到问题。 如何将测试代码转换到 CCS 项目中是否有指南或提示?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您无需 CCS 项目即可运行该文件。
    1.启动您已设置的 IWR1642所选配置
    2.在运行>加载>加载程序下加载.xer4f 文件
    3.点击“运行”

    此致、
    查尔斯·奥
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、但重点是开始使用闪存代码。 我将从毫米波人数统计演示开始、并尝试访问 QSPI 闪存。 如果我无法编译代码、我将无法使用闪存。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您需要将所需的 QSPI 闪存代码部分添加到人数统计演示中。 我认为这是一种更简单的方法。
    您还可以参考用于 SPI 参考的电平感应演示
    www.ti.com/.../TIDEP-01000

    此致、
    查尔斯·奥
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们已经实现了完整的圈。 如果您阅读了我的原始帖子、我将使用我的现有人员计数应用程序并向该应用程序添加 QSPI 访问。 QSPIFlash_open 函数未返回(挂起)。 我需要有关如何调试它的指针、或者我错误地执行了哪些操作。 我看到 SDK 提供了3个不同的闪存驱动程序以及冗余跳转表。 这可能是个问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    电平检测演示具有 QSPI 闪存、可用作参考。 您能看到这是否有帮助吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否将其缩小到工业 SDK 中的实验室。 您正在将我指向68xx 的网站。 我想知道您所引用的演示软件。 有5种演示应用可供选择。 哪一个使用 QSPI?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、从1642升压板的 BOM 中、我收集到外部闪存是 Macronx。 您能否确认这是正确的器件、并且我使用 qspiflash_device_macronix.c 文件连接外部闪存。

    从 QSPIFlashGetStatus 获取
    /*读取状态*/
    状态= QSPIFlashGetStatus (QSPIHandle、ptrFlashParams->readSR1Cmd);
    cli_write ("status1 =%x\n"、status);


    状态= QSPIFlashGetStatus (QSPIHandle、ptrFlashParams->readSR2CMd);
    cli_write ("status2 =%x\n"、status);

    状态= QSPIFlashGetStatus (QSPIHandle、ptrFlashParams->readSR3Cmd);
    cli_write ("status3 =%x\n"、status);

    状态1 = 40
    STATUS2 = 0
    STATUS3 = 0

    如何判断我使用的是正确的驱动器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我指的是使用 IWR1443的液位感应 TI 设计。 SPI 实现非常相似
    www.ti.com/.../TIDEP-0091

    关于串行闪存、您可以查看设计文件下提供的 EVM BOM 或从器件本身读取器件型号。

    此致、
    查尔斯·奥
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没有称为电平检测的实验。 工业工具箱3.1.1中的所有实验都没有提到 QSPI。 因此、我没有可以用作模板的代码。 唯一的引用位于驱动程序目录以及 QSPI 和 QSPI_FLASH 的测试代码中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没关系。 我找到了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是用于获取人员信息的代码。

    dma_params dmaParams;
    int32_t RetVal = 0;
    uint32_t flashAddr = 0U;
    //SPIFLASH_DevID DevID;
    int32_t read_rcode = 0;
    uint32_t testDataLen = 256U * 4U;//闪存扇区长度为4K
    uint8_t* readDataArray;
    QSPI_Params QSPIParams;
    QSPIFlash_Handle QSPIFlashHandle =空;
    dma_handle gDmaHandle =空;
    QSPI_Handle gQSPIDrv =(QSPI_Handle)空;


    cli_write ("read_zan_config:正在读取闪存 length=%d、%d、%d、%d\n"、
    sizeof (MmwDemo_MCB)、sizeof (SceneryParams)、sizeof (GatingParams)、sizeof (StateParams)、sizeof (AllocationParams));
    readDataArray = Memory_alloc (NULL、testDataLen、64、NULL);
    application_cfg *覆盖=(application_cfg *)&readDataArray[0];
    if (readDataArray == NULL){
    cli_write ("read_zhan_config: not enough memory for buffer");
    read_rcode =-3;
    转至 READ_CONFIG_EXIT;

    /*设置 PINMUX 以显示 MibSpiA */
    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PIND13_PADAD、PINMUX_OUTEN_RETAIN_HW_CTRL、PINMUX_INPEN_RETAIN_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PIND13_PADAD、SOC_XWR16XX_PIND13_PADAD_SPIA_MOSI);

    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINE14_PADAE、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINE14_PADAE、SOC_XWR16XX_PINE14_PADAE_SPIA_MISO);

    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINE13_PADF、PINMUX_OUTEN_RETA_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINE13_PADF、SOC_XWR16XX_PINE13_PADF_SPIA_CLK);

    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINC13_PADAG、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINC13_PADAG、SOC_XWR16XX_PINC13_PADAG_SPIA_CSn);

    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINP13_PADAA、PINMUX_OUTEN_RETAIN_HW_CTRL、PINMUX_INPEN_RETAIN_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINP13_PADAA、SOC_XWR16XX_PINP13_PADAA_SPI_HOST_INTR);

    QSPI_INIT();/*无*/
    QSPIFlash_init ();/*不执行任何操作*/
    QSPI_Params_init (&QSPIParams);//将默认 QSPI 参数复制到结构体*/
    QSPIParams.qspiClk = 200 * 1000000U;//将 QSPI 外设时钟设置为200MHz *
    QSPIParams.clkMode = QSPI_CLOCK_MODE_0;
    QSPIParams.bitrate = 40 * 1000000U;//以40MHz QSPI 位速率运行
    * BitClockRate = qspiClk/除数(=5、由 QSPI 驱动器在内部设置)*
    gQSPIDrv = QSPI_OPEN (&QSPIParams、&RetVal);//初始参数和结构。
    if (gQSPIDrv == NULL){
    cli_write ("read_zhan_config: QSPI_open failed with error=%d\n",RetVal);
    read_rcode =-1;
    转至 READ_CONFIG_EXIT;

    dma_params_init (&dmaParams);/* Init SYSDMA 参数*/
    gDmaHandle = dma_open (0、&dmaParams、&RetVal);//为 SPI 测试打开 DMA 驱动程序实例0 */
    if (gDmaHandle == NULL){
    cli_write ("read_zan_config:open dma driver failed with error=%d\n"、RetVal);
    read_rcode =-2;
    转至 READ_CONFIG_EXIT;


    /
    *打开 QSPIFlash
    (二 /
    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINP11_PADQ、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINP11_PADAQ、SOC_XWR16XX_PINP11_PADAQSPI_CSn);

    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINR13_PADAL、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINR13_PADAL、SOC_XWR16XX_PINR13_PADAL_QSPI_D0);

    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINN12_Padam、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINN12_Padam、SOC_XWR16XX_PINN12_Padam_QSPI_D1);

    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINR14_Padan、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINR14_Padan、SOC_XWR16XX_PINR14_Padan_QSPI_D2);

    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINP12_PADAO、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINP12_PADAO、SOC_XWR16XX_PINP12_PADAO_QSPI_D3);

    QSPIFlashHandle = QSPIFlash_open (gQSPIDrv、RetVal);
    if (QSPIFlashHandle == NULL){
    cli_write ("read_zhan_config:QSPIFlash_open:fail\n");
    read_rcode =-4;
    转至 READ_CONFIG_EXIT;

    /
    *测试:单次写入、单次读取
    (二 /
    /*生成数据*/
    flashAddr = QSPIFlash_getExtFlashAddr (QSPIFlashHandle);

    /*使用偏移15MB 作为测试区域*/
    flashAddr = flashAddr + 0x180000U;
    testDataLen = 256U * 4U;//扇区长度为4K

    QSPIFlash_singleRead (QSPIFlashHandle、flashAddr、testDataLen、(uint8_t *)&readDataArray[0]);
    cli_write ("read_zhan_config eye_catcher:%x %x %x %x %x %x %x %x\n",readDataArray[0]、readDataArray[1]、
    readDataArray[2]、readDataArray[3]、readDataArray[4]、readDataArray[5]、readDataArray[6]、readDataArray[7]);
    RetVal = memcmp ((void *)&overlay->config_eye_catcher、"Scenery "、8);
    if (RetVal!= 0){
    cli_write ("read_zan_config 未保存。 Saving defaults ");//上面初始化的默认值
    testDataLen = 256U * 4U;//扇区长度为4K
    QSPIFlash_sectorErase (QSPIFlashHandle、flashAddr);
    QSPIFlash_singleWrite (QSPIFlashHandle、flashAddr、testDataLen、(uint8_t *)&zan_config);
    }否则{
    memcpy ((void *)&zan_config、(void *)&readDataArray[0]、sizeof (application_cfg));
    cli_write ("read_zhan_config: config loaded from Flash\n");

    READ_CONFIG_EXIT:
    /*正常关机*/
    QSPIFlash_Close (QSPIFlashHandle);
    QSPI_CLOSE (gQSPIDrv);
    DMA_Close (gDmaHandle);
    返回 READ_rcode;