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.

[参考译文] CC2652R7:尝试写入 SSI 地址空间(0x40000000)会导致硬故障。

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1291898/cc2652r7-trying-to-write-to-ssi-address-space-0x40000000-causes-hard-fault

器件型号:CC2652R7

我正在尝试为基于 FreeRTOS 并使用 TI driverlib 的定制平台编写 SPI 驱动程序。

以下操作在出现硬故障异常时失败:

PRCMPowerDomainOn(PRCM_DOMAIN_SERIAL | PRCM_DOMAIN_PERIPH | PRCM_DOMAIN_RFCORE | PRCM_DOMAIN_VIMS | PRCM_DOMAIN_CPU);
PRCMPeripheralRunEnable(PRCM_PERIPH_SSI0);
SSIConfigSetExpClkx(0x40000000, SysCtrlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, baudRate, 8);
SSIEnable(0x40000000);

试图从基地址0x40000000访问 SSI 寄存器导致硬故障。 我是否初始化某些内容失败?

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

    尊敬的 Mike:

    您是否已单步执行代码或使用过的打印日志以准确确定导致硬故障的代码行?  您仍可以参考 C:\ti_simplelink_cc13xx_cc26xx_sdk_7_10_01_24\source\ti\drivers\spi\SPICC26X2dma.c 中的资源、以更好地了解预期的设置和用法。  这包括刷新 FIFO 以及禁用 SSI 操作和 initHw 内的模块中断。  

    /*
     *  ======== initHw ========
     */
    static void initHw(SPI_Handle handle)
    {
        ClockP_FreqHz freq;
        SPICC26X2DMA_Object *object         = handle->object;
        SPICC26X2DMA_HWAttrs const *hwAttrs = handle->hwAttrs;
    
        flushFifos(hwAttrs);
    
        /* Disable SSI operation */
        SSIDisable(hwAttrs->baseAddr);
    
        /* Disable SPI module interrupts */
        SSIIntDisable(hwAttrs->baseAddr, SSI_RXOR | SSI_RXFF | SSI_RXTO | SSI_TXFF);
        SSIIntClear(hwAttrs->baseAddr, SSI_RXOR | SSI_RXTO);
    
        /* Set the SPI configuration */
        ClockP_getCpuFreq(&freq);
        SSIConfigSetExpClk(hwAttrs->baseAddr, freq.lo, object->format, object->mode, object->bitRate, object->dataSize);
    }

    您还可以将 simplelink_cc13xx_cc26xx_sdk_7_10_01_24\source\ti\devices\cc13x2x7_cc26x2x7\driverlib\ssi.c (例如)直接添加到您的项目中、以使用您的项目构建此资源并进一步调试 SSIConfigSetExpClk等函数。

    此致、
    瑞安

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

    您好、Ryan、

    感谢您的答复。 是的、我单步执行了我的代码、即使在反汇编层面也是如此。 我已尝试重新安排通话等。 它总是在相对于基址0x40000000的第一次访问寄存器时失败。 例如、SSIDisable (SSI0_BASE)在此处将失败:

    HWREG (ui32Base + SSI_O_CR1)&&~(SSI_CR1_SSE);

    其中"ui32Base + SSI_O_CR1"为0x40000004。 如果0x40000004是无效地址、则会生成硬故障异常。

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

    在建立任何其他外设(ADC、计时器、UART 等)时是否遇到问题?  确保事先正确初 始化电源、时钟和 GPIO 依赖项(请相应地参阅其 TI 驱动程序-> Driverlib 初始化实例)。  可以逐步浏览 控制器 FreeRTOS 示例 以进一步了解建议的过程。

    此致、
    瑞安

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

    感谢您为我提供此示例! 希望它能帮助我了解我缺少什么。

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

    这是我的答案:

        PRCMPowerDomainOn(PRCM_DOMAIN_SERIAL | PRCM_DOMAIN_PERIPH);
        while (PRCMPowerDomainsAllOn(PRCM_DOMAIN_SERIAL | PRCM_DOMAIN_PERIPH) != PRCM_DOMAIN_POWER_ON) {}