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.

[参考译文] CC3220SF-LAUNCHXL:SPI 模式3未正确启动

Guru**** 2586265 points
Other Parts Discussed in Thread: CC3220SF, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/875150/cc3220sf-launchxl-spi-mode-3-not-starting-up-properly

器件型号:CC3220SF-LAUNCHXL
Thread 中讨论的其他器件:CC3220SFSysConfig

尊敬的支持:

我使用 CC3220SF LP 和 SDK v3.20、需要使用 SPI 模式3连接外设。  在使用以下代码成功地为模式3设置 SPI 模块时:

SPI_Params MasterSpiParams;SPI_init ();

SPI_PARAMS_INIT (&MasterSpiParams);
MasterSpiParams.bitrate = 4000000;

MasterSpiParams.mode = SPI_MASTER;
MasterSpiParams.frameFormat = SPI_POL1_PHA1;//未激活时为高电平
MasterSpiParams.dataSize = 8;
MasterSpiParams.transferMode = SPI_MODE_BLOCKING;
hMasterSPI = SPI_OPEN (Board_SPI1,&MasterSpiParams);

我能够成功地将其打开并跟踪 SPI 传输。  然而、在第一次 SPI 传输之前、SPI 时钟为低电平。  根据 SPI 模式3、它需要为高电平。  为了使其正常工作、我必须执行如下虚拟传输:

ImagePtr =(uint8_t *)&RxBuffer[组索引][0][0];
masterTransaction.rxBuf =(ptr)图像 Ptr;
masterTransaction.count = 2;
transferOK = SPI_transfer (hMasterSPI、masterTransaction);
if (transferOK == false)

   display_printf (hDisplay、0、0、"主 SPI 传输失败");

我执行此事务、但 SPI CS 处于高电平、因此这是一个虚拟事务。  之后、SPI 时钟变为高电平、并在所有剩余的事务中保持高电平、这是 SPI 模式3应该工作的方式。  我已经介绍了 SDK 中的 SPI 驱动程序代码、找不到方法来设置引脚以使其正常工作、从而使 SPI 时钟保持高电平。  我可以使 SPI 时钟在 SPI_OPEN 之前保持高电平(...) 调用、但一旦我从 SPI_open (...)返回、 调用时、SPI 时钟会变为低电平并保持低电平、直到我执行第一个 SPI 事务、然后它正常工作。  您能告诉我我我需要做什么、这样我就不必执行这个虚拟 SPI 事务、以便在 SPI_open (...)之后、SPI 时钟在 SPI 模式3中变为高电平吗? 呼叫?  请提供建议。

BTW -这是特定于 CC3220的、当在这些器件上运行相同的完全 SPI 代码时、CC1352P1或 MSP432E4不会出现此问题。

谢谢、
Tim

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

    您好、Tim、

    检查 SPI 驱动器时、您是否有机会了解 SPI 时钟引脚在某个时刻是否已从高电平设置为低电平? 我怀疑 pinmux 代码将是它的功能、但如果是这种情况、那么在没有像您那样执行虚拟事务的情况下、就无法将线路设置为高电平。

    或者、在启用 SPI 外设之前、时钟信号可能不会被拉高。 该使能首先在 SPI_TRANSF()中进行,而不是在 SPI_OPEN()中进行。

    如果您真的想让事情更优雅、 如果 SPI 帧格式设置为 SPI_POL1_PHA0、则可以将该虚拟传输集成到您自己的 SPI_open()代码中、以便在 SPI_open ()末尾、您的 SPI 接口可以将数据传输到从器件。 除此之外、假设您运行的是与我运行的 SPI 驱动程序相同的最新版本、则可能没有太多的工作来确保 SPI 时钟信号设置为高电平。

    此致、

    Michael

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

    嗨、Michael:

    感谢您的回答。  我曾尝试在 SPI_OPEN 命令之前通过在以下内容中声明 SPI 时钟信号来设置 SPI 时钟信号:

    GPIO_PinConfig gpioPinConfigs[]={

    …μ A
    GPIOCC32XX_GPIO_14 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_HIGH、

    };

    此外、我会立即在 main.c 文件中执行以下操作:

    GPIO_write( Board_FLR_SPI_CLK,1 );

    以便 SPI 时钟在加电时立即变为高电平。  但是、一旦我到达计划中我发出呼叫的位置

     hMasterSPI = SPI_OPEN (Board_SPI1,&MasterSpiParams);

    SPI 时钟信号恢复为低电平。 然后、我立即执行以下所有操作、并将 SPI_CS 强制为高电平、因此这实际上是一个虚拟传输:

    transferOK = SPI_transfer (FLIRInfo.hMasterSPI、masterTransaction);

    然后 SPI 时钟信号变为高电平、之后一切都正常。  

    BTW -我没有遇到与 MSP432E4和 CC1352P1相同的问题-这似乎是 CC3220特有的问题。 对驱动程序中的 SPI_open 调用进行更改听起来不错、但这需要我修改驱动程序代码才能执行此操作、并且我必须在以后的所有 SDK 上执行此操作。  这是否可以在以后的 SDK 中修复、以便我不必进行这些更改?  请提供建议。

    谢谢、
    Tim

     

     

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

    您好、Tim、

    我使用原始 driverlib 进行了一些测试、以查看导致我们观察到的 SPI 时钟行为的原因、我得出结论、它是 CC32xx 硬件 SPI 外设本身、而不是 TI 驱动程序代码产生的。 在第一次 SPI 传输之前、时钟信号似乎没有被拉高。 更具体地说、在 SPI CS 线路被置为有效之前、SPI HW 将不会执行该拉取。

    因此、您可以将代码放入一组更精简的代码  

    SPICSEnable (GSPI_base);
    SPICSDisable (GSPI_base);

    快速切换 CS 线路并使时钟处于适当的高电平拉电平的调用。 您是否发现这样做有任何问题?

    此致、

    Michael

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

    嗨、Michael:

    我已经尝试添加您在我的代码中指示的以下命令:

    //
    //打开 SPI 端口
    //
    hMasterSPI = SPI_OPEN (Board_SPI1、&MasterSpiParams);
    if (hMasterSPI == NULL)

       Display_printf (hDisplay、0、0、"初始化 SPI 时出错");
      Task_exit();
      返回

    其他

       display_printf (hDisplay、0、0、"SPI initialized");

    //
    //通过切换 SPI CS 信号来建议编码
    //
    SPICSEnable (GSPI_base);
    SPICSDisable (GSPI_base);
    GPIO_WRITE (Board_FLIR_SPI_CS、1);
    GPIO_WRITE (Board_FLIR_SPI_CS、0);
    GPIO_WRITE (Board_FLIR_SPI_CS、1);

    //
    //虚拟 SPI 事务,以使 SPI 时钟正常运行
    //
    masterTransaction.txBuf =
    GPIO_WRITE (Board_FLIR_SPI_CS、0);
    ImagePtr =(uint8_t *) RxBuffer;
    masterTransaction.rxBuf =(ptr)图像 Ptr;
    masterTransaction.count = 2;
    transferOK = SPI_transfer (hMasterSPI,&masterTransaction);
    如果(transferOK == false)

       display_printf (hDisplay、0、0、"主 SPI 传输失败");

    GPIO_WRITE (Board_FLIR_SPI_CS、1);

    您可以从 SPI CS 的第一次切换中看到 SPI 时钟仍然为低电平。  直到 SPI CS 信号的第2次切换中2个字节的虚拟 SPI 事务、您才会看到 SPI 时钟变为高电平、这正是它应该达到的水平。  

    我是否正确解释了您希望我尝试的内容?  请确认。

    谢谢、
    Tim

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

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

    您好、Tim、

    实际上、我只执行裸机 driverlib 测试来更好地隔离问题、因此可能与 TI 驱动程序+原始 driverlib 存在一些冲突的交互。

    具体而言、我运行此代码并使用逻辑分析仪来检查 SPI 时钟线的电平:

    //
    //重置 SPI
    //
    MAP_SPIReset (GSPI_base);
    
    //
    //配置 SPI 接口
    //
    MAP_SPIConfigSetExpClk (GSPI_base、MAP_PRCMPeripheralClockGet (PRCM_GSPI)、
    SPI_IF_bit_rate、SPI_MODE_MASTER、SPI_SUB_MODE_3、
    (SPI_SW_CTRL_CS |
    SPI_4PIN_MODE |
    SPI_Turbo_off |
    SPI_CS_ACTIVEHIGH |
    SPI_WL_8));
    
    //
    //启用 SPI 进行通信
    //
    SPICSEnable (GSPI_base);
    SPICSDisable (GSPI_base);
    MAP_SPIEnable (GSPI_BASE); 

    想想、您是否使用 SPI_SW_CTRL_CS? 如果您使用的是 SPI_HW_CTRL_CS、则 SPI 启用和禁用 driverlib 函数将不起作用。

    如果您使用的是 SysConfig、则用户 SPI 将使用 SPI_HW_CTRL_CS。 您需要禁用 SysConfig 并手动提供+编辑 ti_drivers_config.c/.h 以进行该更改、因为 SysConfig 中当前不能设置该.csControl 选项。

    此致、

    Michael

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

    嗨、Michael:

    我不熟悉 SPI_HW_CTRL_CS -您的意思是什么?

    不、我不使用 SysConfig、我使用的是不允许我迁移到 SDK v3.30或更高版本的旧插件。

    谢谢、
    Tim

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

    您好、Tim、

    spiCC32XXDMAHWAttrs 结构中有两个.csControl 选项、用于在 CC3220SF_LAUNCHXL.c 文件中配置 SPI 外设。 如果使用 TI 驱动  程序、您将观察到的主要实际差异是、传输期间 SPI_HW_CTRL_CS 会使每个字之间的 CS 无效、而 SPI_SW_CTRL_CS 会在整个传输期间使 CS 无效。 如果 CS 行为对已连接的外设无关紧要,则可以将其切换为 SPI_SW_CTRL_CS 并使用 SPICSEnable()和 SPICSDisable()函数。


    此致、

    Michael

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

    嗨、Michael:

    感谢您对这种方法的解释和教育、以及您所提到的内容。  我的目的是要清楚说明 将 SPI CS 引脚切换至外设与 SPI 传输分开完成。  我正在使用 GPIO_WRITE 在 SPI_transfer 之前将 CS 拉低、并在 SPI_transfer 之后恢复为高电平。  那么、我只看一下 SPI 传输前后的 SPI 时钟。  在 SPI_open 之后、SPI 时钟极性错误、然后在这第一个虚拟 SPI_transfer 之后、它以正确的 SPI 时钟极性正确运行。  

    为了解决此问题、我通过确保在 SPI_transfer 之前不执行 GPIO_write 来保持 SPI CS 为高电平、以便 SPI CS 保持高电平。  然后、我执行 SPI_TRANSF传输、因为 SPI CS 为高电平、而时钟引脚切换为2个字节、因此对外设不执行任何操作。  然后、在 SPI_TRANSF传输 之前、我将 SPI CS 拉为低电平、并在此后不久将其拉为高电平、之后、它在以下 SPI_TRANSFers 中都可以正常工作。  但是、我希望避免这个伪 SPI_transfer、在这种情况下、我必须保持 SPI CS 为高电平才能使其正常运行。   

    因此、这是唯一的方法、还是您有建议来最好地解决这个问题、这样我就不必执行这个虚拟传输操作了?  请提供建议。

    谢谢、
    Tim

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

    您好、Tim、

    我知道您要将 SPI CS 引脚设置为 GPIO、确保在进行虚拟传输时将其取消置位、然后将其重新多路复用到 SPI 外设。

    我的想法是让您将 SPI CS 引脚保持多路复用为 SPI 外设、然后使用 SPICSEnable()/Disable(Disable)函数进行切换。 尽管它仍然是 SPI 硬件行为的权变措施、但它比执行整个虚拟传输更加巧妙。 您是否能够让它在您的终端上工作?

    此致、

    Michael

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

    嗨、Michael:

    很抱歉耽误了我的时间-我被卷入了一些其他任务、这些任务使我无法直接跟进。   我现在回来了。  您的问题的答案是否定的  如前所述、我使用以下代码:

    //
    //打开 SPI 端口
    //
    hMasterSPI = SPI_OPEN (Board_SPI1、&MasterSpiParams);
    if (hMasterSPI == NULL)

       Display_printf (hDisplay、0、0、"初始化 SPI 时出错");
      Task_exit();
      返回空;

    其他

       display_printf (hDisplay、0、0、"SPI initialized");

    //
    //通过切换 SPI CS 信号来建议编码
    //
    SPICSEnable (GSPI_base);
    SPICSDisable (GSPI_base);

    我检查了我的 spiCC3220SDMAHWAttrs 是否正在使用以下命令:

    .csControl = SPI_SW_CTRL_CS、

    这是要使用的正确值、对吧?   我希望尽快关闭、以便下次能更快地响应。  请告诉我可能出错的地方。  我假设我不需要使用裸机调用来使用您提到的这种方法、对吧?  请提供建议。

    谢谢、
    Tim

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

    您好、Tim、

    实际上、我在没有使用 TI 驱动程序的情况下进行测试、因此 SPI TI 驱动程序中可能会有一些阻止 SPI CS 切换正确拉取时钟线的东西。 我需要在我的末尾测试和检查这个

    此致、

    Michael

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

    嗨、Michael:

    感谢您进一步了解这一点。  请告诉我您的结果。

    谢谢、
    Tim

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

    您好、Tim、

    我在 CC3220上使用进行了测试、并使用 TI 驱动程序、我启用/禁用 CS 的权变措施似乎能够正确切换 SPI CS 信号。 我修改了 SDK 中的 spimaster 示例、请参阅随附的代码:

    /cfs-file/__key/communityserver-discussions-components-files/968/4405.spimaster.c

    您能否尝试运行该代码并查看您是否获得相同的结果? 请确保将 GSPI 外设的.csControl 设置为 SPI_SW_CTRL_CS、而不仅仅是内部 NWP SPI。

    此致、

    Michael

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

    嗨、Michael:

    是的、确实是这样。  我误解了您在代码中所说的内容以及要查看的信号。  我现在了解了 SPI_SW_CTRL_CS 和 SPI_HW_CTRL_CS 之间的差异 、了解了您所指的默认 CS 信号和相关的 SPI 时钟后、 我确实看到 CS 切换、之后时钟极性正确。  您是对的-这是一个更优雅的解决方案。  感谢您深入探讨并帮助我解决这一问题。   这在直观上并不明显。 奇怪的是、这仅适用于 CC3220、而不适用于 CC13xx 或 MSP432E4、但至少您获得了一个分辨率、我可以在代码中使用#define 进行修复。  :-)

    谢谢、
    Tim