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.

[参考译文] CC3100:首次读取 SPI 时、简单链路的 STM32F0端口出现硬故障

Guru**** 2564565 points
Other Parts Discussed in Thread: CC3100

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/624381/cc3100-hard-fault-in-stm32f0-port-of-simple-link-on-first-spi-read

器件型号:CC3100

您好!

我正在尝试将 simplelink 移植到 STM32F0。 当我运行 SPI 调试工具时、所有测试均通过、因此应该可以对 SPI 进行设置。  

问题似乎在于、当我的 SPI 读取函数尝试写入 simplelink 驱动程序传递给它的地址时、它会导致硬故障。 调试器显示、传递给 SPI 函数的地址为0x000000。

我的 SPI 读取函数、它在进入 pBuff++之前会遇到硬故障:

int cc3100spi_read (short* fd、unsigned char * pBuff、int len)
{
// assert_CS();
GPIO_ResetBits (SPI1_CC3100_GPIO_PORT、SPI1_CC3100_NSS_PIN);//lower CS Line

// HAL_SPI_Receive (&SpiHandle、pBuff、len、SPI_TIMEOUT_MAX);
while (len >0){
*pBuff = spiRad();
pBuff++;
len-;
}
// DEASBERT_CS();
GPIO_SetBits (SPI1_CC3100_GPIO_PORT、SPI1_CC3100_NSS_PIN);//提高 CS 线路


返回 len;
} 

调用它的位置、driver.c 的第1143行:

NWP_IF_READ_CHECK (g_PCB->FD、
G_PCB-> FunctionParams.pTxRxDescBuff、
_sl_Protocol_align_size (g_pcb->FunctionParams.pCmdCtrl->RxDescLen); 

对我遗漏的内容有什么建议?

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

    您好、Huw、

    SPI 调试工具不能保证您的驱动程序正常工作。 首先检查时序问题的一种方法是在每个 CS 置为有效和置为无效之前设置100ms 延迟。 如果这样可以解决故障、则可以使用较小的延迟进行测试、以确定所需的时序。

    其他建议:

    1.确保您已将最新的服务包(1.0.1.11-2.9.0.0)刷写到 CC3100串行闪存中、并且您正在使用 SDK 中的最新主机驱动程序版本。

    2.有关时序要求的更多信息、请查看 主机接口  和 SPI 主机接口 wiki 页面。

    请查看此帖子的建议答案: https://e2e.ti.com/support/wireless_connectivity/simplelink_wifi_cc31xx_cc32xx/f/968/p/617725/2275808

    此致、

    Sarah

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

    大家好,谢谢你的回答:)。

    我使用的是最新的服务包和 SDK。 尝试添加延迟,但不起作用。

    我不认为时序问题、因为如果我编辑 SPI 读取函数、使其不会将读取信息分配给指针、那么该函数会读取数据、但不会执行任何操作)。 问题是这样  

    G_PCB->FunctionParams.pTxRxDescBuff 

    当发生读取时(只是一个空指针)、存储在其中的读取数据似乎不存在。 该指针应引用的存储器在何处创建并分配给指针?

    胡  

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

    您好、Huw、

    此内存在 driver.c 第499-504行的驱动程序控制块初始化(_SlDrvDriverCBInit)中分配 如果您使用的是动态存储器管理、请确保具有正确的预定义。 然后、它将由_SlDrvMsgWrite 进行设置(您可以在第870行抛出断点以查看)。

    我看到的潜在问题是 SPI 读取的实现。 您的函数 spiRad()是什么? pBuff 指向开始写入数据的位置、您不会将其传递给函数。 您似乎是在尝试重写缓冲区的位置。

    此致、

    Sarah

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

    大家好、感谢大家的快速响应、

    我尝试在_SlDrvMsgWrite 中放置断点、发现它从未运行。 当首次从主机发送同步模式时、它似乎是在_SlDrvMsgRead 中完成的。 请参阅调用栈:

    因此、当发送同步模式后读取 SPI 时、接收缓冲区似乎从未设置。  

    我缺少什么?

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

    您好、Huw、

    1.您是否在任何其他 SimpleLink API 之前调用 sl_start()? 该调用堆栈反映了 SPI 写入、但我们希望 SPI 读取是 NWP 启动时首先发生的事情。

    2.如果在 sl_start()上没有看到此问题,则在这种情况发生时,您调用的是什么 API?

    3.在 driver.c 中的第999行和第1140行设置断点(_SlDrvMsgRead ASYNC_EVT_CLASS 和 CMD_RESP_CLASS)。 您是否先进入 ASYNC_EVT_CLASS? 如果不是、则应使用逻辑分析仪并检查 SPI 的外观。

    此致、

    Sarah

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Sarah、我在这里休息了几周、但现在又回来了。
    - sl_start 是在主函数中调用的第一个 simplelink API。
    - SPI_WRITE 似乎在 SPI_READ 之前调用。
    -我确实在 CMD_RESP_CLASS 之前获得了一个异步 EVT_CLASS

    写入发生在_SlDrvRxHdrRead 的调用中、该调用在_SlDrvMsgRead 的开头进行。 此调用发生在函数到达 ASYNC_EVT_CLASS 之前