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/MSP432-RTOS:SPI 模块有问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/567101/rtos-msp432-rtos-problem-with-spi-module

器件型号:MSP432-RTOS

工具/软件:TI-RTOS

你好。

我正在尝试使用 RTOS SPI 模块将 MSP432与模块通信、我一直在查看有关模块的文档并使用 spiloopback 作为参考、但出于某种原因、当我将模块告知它时、模块不发送任何内容。 我一直在研究模块的配置、并将其与回送示例进行比较、以找到一些我可能忽略的参数、但我没有找到任何参数。

我的问题是、除了初始化总线、创建 SPI_Params 和 SPI_transfer 结构、修改它们并打开总线之外、我是否留下了我不注意的东西?

提前感谢

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

    您好、C H、

    您已经查看了 spilopback 示例,您是否也成功运行了它?  

    您使用的是 MSP432 Launchpad 还是定制板?

    您是否仔细检查了 SPI 主端口到 SPI 模块的接线?  您是否能够使用逻辑或总线分析器查看信号以查看是否存在总线活动?

    您使用的是 TI-RTOS 的哪个版本?

    如果这仍然不起作用、您能否发布或附加您的代码以便我查看它?

    谢谢、
    Scott

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

    Scott、您好、感谢您的回答。

    我还没有测试过 spilopback 示例、可能也会对其进行测试。

    我正在使用 MSP432 Launchpad 以及 RTOS 版本2.16.0.08。

    我之前使用 driverlib 来使用程序的非 RTOS 模型检查了布线。 在此模型中、我与模块进行了完美通信、但与 RTOS 程序不进行通信。

    如果我使用低传输速度(例如2MHz)、我可以在示波器上观察 SPI 信号、此测试适用于 driverlib 程序、但不适用于 RTOS 版本、这意味着电路板不发送数据、而是发送数据、但不捕获响应。

    这里是我的.c 代码、如果需要、在此测试程序中、我将尝试读取模块寄存器的值、SPI 参数和传输结构在我创建的自定义库("SPILibRTOS.h")内声明、但配置在主函数中进行。 此外、任务的 ReadReg 函数也位于该库中。 该函数加载"ReadReg "命令的参数以及 TX 缓冲区中寄存器的方向、该寄存器将在8位窗口中发送到模块、并调用 SPI_transfer 函数。 CE 和 CS 引脚是 GPIO 引脚、我已将其包含在 MSP432文件的引脚矩阵中并检查它们是否正常工作:

    #include 
    #include 
    #include 
    #include 
    
    /* BIOS 头文件*/
    #include 
    #include 
    
    /* TI-RTOS 头文件*/
    #include 
    #include 
    #include 
    #include 
    
    /*板头文件*/
    #include "Board.h"
    
    #include "SPIlibRTOS.h"//自定义库、在此声明 SPI 参数和传输结构
    
    
    void isr_pushbutton (UArg0){//pend 函数 for Button1、将调用 SWI、该 SWI 将调用 SPIReadtest 任务
    Swi_post (UArsigt)
    
    
    
    
    ;void ARt1
    (unt 1)、CPU 1 (unionInt);void ARt1 (unt 1);unionInt 1 (unioneCall (unt) //获取信标,等待最大2ms 作为超时
    System_printf ("初始化测试\n");
    System_flush ();
    uint8_t 结果= ReadReg (REG0);//读取寄存器的值(1字节长度)
    System_printf ("寄存器的值为:%flush"、result
    
    
    
    );/semaphore (1字节长度);/semaphore)
    
    
    
    
    /*
    === main ====
    */
    int main (void)
    {
    //Task_Params 任务 Params;
    
    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Board_initSPI();
    
    SPI_Params_init (&SPIparams);//SPI 配置、主模式、阻塞模式、2MHz 时钟、 每次传输8位窗口
    SPIparams.transferMode = SPI_MODE_BLOCKING;
    SPIparams.transferCallbackFxn =空;
    SPIparams.mode = SPI_MASTER;
    SPIparams.bitrate = 2000000;
    SPIparams.dataSize = 8;
    SPIparams.frameFormat = SPI_POL0_PHA0;
    
    SPI_MODULE = SPI_OPEN (Board_SPI0、&SPIparams);
    
    SPITRANSACTION 计数= 2;//事务配置、缓冲区的链接和一个2窗口事务、这个数字可能会根据函数而改变。
    SPItransaction.txBuf =(ptr) SPITxBuf;
    SPItransaction.rxBuf =(ptr) SPIRxBuf;
    
    GPIO_setCallback (Board_Button1、ISR_PUSHBUTTON);
    GPIO_enableInt (Board_Button1);//设置按钮1的中断
    GPIO_WRITE (CSPIN、1);//将 SPI 模块的 CS 和 CE 引脚置于高电平
    GPIO_WRITE (CEPIN、1);
    printf ("常规初始化已完成\n");
    system_flush();
    Semaphore_post (semaph);//提供信号量、因此任务可在 BIOS 启动后启动
    /*启动 BIOS */
    BIOS_start();
    返回(0);
    }
    

    谢谢

    C

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

    您好、C H、

    感谢您提供更多信息。  

    注释“BUTTON1的 ISR 函数将调用 SWI,SWI 将调用 SPIReadtest 任务” 如果 Swi 函数调用 SPIReadTest(),则 Semaphore_pend ()和 SPI_transfer ()将在软件中断上下文中调用,这两个函数中的任何一个都不允许。  我所期望的是按钮 ISR 发布了信标。  在按钮 ISR 完成后,读取任务将解除阻止,然后执行 SPI_TRANSF()。

    此外,如果 SPIReadtest()是一个任务,它将只运行一次,因为它不是循环。  这是故意的吗?  在这个函数的末尾没有需要 Semaphore_post()。  您应该查看 BIOS 用户指南和内核示例,以查看任务和信号量的典型用法。

    此外,在 main()中,不需要初始布置信标以使任务运行。  通常、在启动时创建的任务将处于就绪状态、并将作为应用程序启动的一部分自动启动。  有一个对"printf()"的调用,我认为您希望它是"System_printf()",因为您在其他地方使用它。

    您能否附加您的应用.cfg 文件?  我想查看任务、Swi 和 Hwi 创建参数。

    谢谢、
    Scott

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

    您好 Scott。

    你对通过 ISR 发布的信标的建议看起来比我的版本好、我将对其进行测试并查看发生了什么。

    是的、我们有意执行一次任务、因为这是一个测试代码、用于查看 Launchpad 和模块是否相互通信。

    既然您说 SPI 函数不是要在 SWI 级别工作、我想我知道我的错误是什么:根据我的理解、我从 cfg 上的 SWI 配置调用了任务、因此链会继续(HWI -> SWI ->任务)、 但这就是错误所在、因为我将调用 SWI 函数执行(在 SWI 上下文中)、而不是像我一样直接转到任务。 我将删除 SWI、因为我实际上不需要它、只需使用 HWI 和任务本身。 我将修复代码并将更改添加到信标、看看这是否是我的错误所在。

    这里是 cfg 文件、以防您发现更多错误。 在本例中、我将 GPIO 回调函数用作 HWI、因为我了解该函数在中断上下文中执行、这可能是我需要针对 HWI 实例更改的内容。

    感谢您迄今提供的帮助。

    C

    编辑:我设法解决了问题并与模块进行了通信。 该错误是在将任务用作 SWI 激活时调用的函数时发生的、因为该函数在 SWI 上下文而不是任务上下文中执行、其中 SPI 函数将不起作用。 感谢你的帮助。

    Edit2:既然我能够使用 SPI 模块、我遇到了一个奇怪的问题:有时总线会为我提供正确的寄存器值、但有时它会将第一个字节的结果向左移动 n 位(通常为1位、 但有时是2、甚至是3)并且使 Rx 矢量的其他位无效、我仔细检查了接线并降低了总线速度、但它仍在发生。 我正在使用正确的时钟相位和极化、正确的传输证明了这一点。 您知道这是为什么发生的吗?

    e2e.ti.com/.../1348.empty.cfg

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

    您好、C:

    我查看了.cfg 文件,并将答复我没有看到任何其他问题,然后我看到您更新了最后的响应,并且您已经更新了您的应用程序,现在可以与设备通信。  听得好!   

    关于您的编辑#2,我不知道是什么导致了这种情况。  我在论坛上搜索“SPI 位移”,并看到了许多针对各种器件和各种原因的点击,包括接地不良、未满足外设特定时序要求、CPU 或外设勘误表、同步丢失以及在没有额外握手信号的情况下无法复位位位位位位计数器等  如果您能够使用示波器查看 SPI 信号、则很可能有助于缩小此位移的范围。  您是否完成了此操作?   

    由于此主题已关闭、如果您仍然看到换档问题、我认为最好为此新问题打开一个新主题…

    此致、
    Scott