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:从 OpenMV H7到 TI 3220 SF Launchpad 的串行数据

Guru**** 2553260 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/994855/cc3220sf-serial-data-from-openmv-h7-to-ti-3220-sf-launchpad

器件型号:CC3220SF

您好!

我正在尝试将串行数据从 OpneMV H7发送到 TI 3220 SF Launchpad。  

我在 OpenMV 中有这个简单的代码、我在其中发送数字5作为测试

        从 pyb 导入 SPI

        SPI = SPI (2、SPI.master、波特率= 115200、极性= 1、相位= 0、 CRC=0x7)

        spi.send(b'5')

在 CCCT (TI IDE)中、代码片段包括如下

#define SPI_MSG_LENGTH (30)

#define SLAVE_MSG   ("Hello from slave、msg#:")

#define MAX_LOOP     (10)

unsigned char slaveRxBuffer[SPI_MSG_length];

unsigned char slaveTxBuffer[SPI_MSG_length];

/*信号量阻止从器件直到传输完成*/

SEM_t slaveSem;

静态 Display_Handle 显示;

空 transferCompleteFxn (SPI_Handle handle、SPI_Transaction *事务)

    SEM_post (slaveSem);

       log_info ("正在启动 SPI 代码\r\n);

    //开始 SPI 从器件代码

       SPI_Handle   slaveSpi;

       SPI_Params   spiParams;

       SPI_Transaction 事务;

       uint32_t     一;

       布尔       转让;

       内部32_t     状态;

          GPIO_setConfig (CONFIG_SPI_SLAVE_READY、GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);

          GPIO_setConfig (CONFIG_SPI_MASTER_READY、GPIO_CFG_INPUT);

          log_info ("setconfig done \r\n);

          GPIO_WRITE (CONFIG_SPI_SLAVE_READY、1);

          while (GPIO_Read (CONFIG_SPI_MASTER_READY)=0){}

          状态= SEM_INIT (&slaveSem、0、0);

          if (status!= 0){

              //Display_printf (display、0、0、"Error creating slaveSem\n");

              log_info ("创建 slaveSem\r\n"时出错);

              while (1);

          }

          while (GPIO_Read (CONFIG_SPI_MASTER_READY)){}

          log_info ("SPI 已准备好接收消息\r\n);

          SPI_Params_init (&spiParams);

          spiParams.frameFormat = SPI_POL0_PHA1;

          spiParams.mode = SPI_SLAVE;

          spiParams.transferCallbackFxn = transferCompleteFxn;

          spiParams.transferMode = SPI_MODE_CALLACK;

          slaveSpi = SPI_open (CONFIG_SPI_SLAVE、&spiParams);

          if (slaveSpi == NULL){

              //Display_printf (display、0、0、"初始化从器件 SPI\n"时出错);

              LOG_INFO ("初始化从属 SPI\r\n 时出错")

              while (1);

          }

          否则{

              //Display_printf (display、0、0、"从器件 SPI 已初始化\n");

              log_info ("已初始化从属 SPI \r\n ")

          }

          /*将消息复制到发送缓冲区*/

          strncpy ((char *) slaveTxBuffer、SLAVE_MSG、SPI_MSG_LENGTH);

我所面临的挑战是代码不会从这个循环中产生

          while (GPIO_Read (CONFIG_SPI_MASTER_READY)){}

下面的语句不会执行:

          log_info ("SPI 已准备好接收消息\r\n);

这似乎意味着串行数据不是从 OpenMV 传输到 TI 电路板。  

两个电路板之间连接的引脚为:

OpenMV:  

P0 (MOSI)

P1 (MISO)

P2 (插槽)

P3 (SS)

TI 电路板  

MOSI (P7)

MISO (P6)

CLK (P5)

SS (P8)

谢谢、

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

    您是否参考了 SPI 从器件示例?

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

    是的、上面的代码基于 SPI 从器件示例。

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

    检查示例的自述文件。 该示例使用主器件就绪线(和从器件就绪线)在主器件和从器件之间进行同步。

    这不是标准配置。 您没有使用此行、因此需要相应地更新代码。  

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

    感谢 的帮助。 我对代码进行了一些编辑。 它似乎工作得更好。 最后一步是一条语句

        SEM_WAIT (slaveSem);

    此陈述未完成。 下面的粗体突出显示了这一点。 前面的所有语句似乎都正常工作。 这是否意味着引脚连接正确。 我需要接收一个从 OpenMV 板发送到 TI 板的数字、而无需将任何从 TI 板发送到 OpenMV。 感谢您的任何想法和帮助。

    问题可能的原因是什么。  
     

    log_info ("在 GPIO 设置配置%s\r\n 之前"、SSID_NAME);

    GPIO_setConfig (CONFIG_SPI_SLAVE_READY、GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    GPIO_setConfig (CONFIG_SPI_MASTER_READY、GPIO_CFG_INPUT);

    log_info ("GPIO 配置完成\r\n);

    /*
    *握手-将 CONFIG_SPI_SLAVE_READY 设置为高电平以指示从器件就绪
    *以运行。 等待 CONFIG_SPI_MASTER_READY 变为高电平。
    *
    GPIO_WRITE (CONFIG_SPI_SLAVE_READY、1);
    while (GPIO_Read (CONFIG_SPI_MASTER_READY)=0){}
    log_info ("从主设备接收到的握手。\r\n);

    状态= SEM_INIT (&slaveSem、0、0);
    if (status!= 0){
             display_printf (display、0、0、"创建 slaveSem\n"error creating slaveSem\n");

             while (1);


    log_info ("sem init done \r\n);

    while (GPIO_Read (CONFIG_SPI_MASTER_READY)){}

    log_info ("准备好接收消息\r\n);

    /*
    *在回调模式下以从器件身份打开 SPI;回调模式用于允许我们这样做
    *配置传输、然后将 CONFIG_SPI_SLAVE_READY 设置为高电平。
    *
    SPI_Params_init (&spiParams);
    spiParams.frameFormat = SPI_POL0_PHA1;
    spiParams.mode = SPI_SLAVE;
    spiParams.transferCallbackFxn = transferCompleteFxn;
    spiParams.transferMode = SPI_MODE_CALLACK;
    slaveSpi = SPI_open (CONFIG_SPI_SLAVE、&spiParams);

    if (slaveSpi == NULL){
      log_info ("初始化从器件 SPI\r\n 时出错");
      Display_printf (display、0、0、"初始化从器件 SPI\n"时出错);
      while (1);

    否则{
      log_info ("已初始化从属 SPI \r\n);
      display_printf (display、0、0、"已初始化从器件 SPI \n");

    /*将消息复制到发送缓冲区*/
    strncpy ((char *) slaveTxBuffer、SLAVE_MSG、SPI_MSG_LENGTH);

    对于(I = 0;I < MAX_LOOP;I++){
      /*初始化从属 SPI 事务结构*/
      transaction.count = SPI_MSG_length;
      transaction.txBuf =空;
      transaction.rxBuf =(void *) slaveRxBuffer;

      /*打开用户 LED 指示灯,指示正在进行 SPI 传输*/
      GPIO_TOGGLE (CONFIG_GPIO_LED_1);

      transferOK = SPI_transfer (slaveSpi、事务);
      if (transferOK){
        log_info ("内部传输确定\r\n);
        log_info ("从机接收到%s\r\n、slaveRxBuffer);

        GPIO_WRITE (CONFIG_SPI_SLAVE_READY、0);

        log_info ("GPI 写入完成\r\n);

        /*等待传输完成*/
        SEM_WAIT (slaveSem);
        //下一条语句不会打印出来
        log_info ("SEM wait done \r\n);

    /*
    *将 CONFIG_SPI_SLAVE_READY 驱动为高电平以指示从器件未就绪
    *用于另一个传输。
    *
        GPIO_WRITE (CONFIG_SPI_SLAVE_READY、1);


        display_printf (display、0、0、"从机接收到:%s"、slaveRxBuffer);
        log_info ("接收到从属设备\r\n);
      }
      否则{
        display_printf (display、0、0、"从器件 SPI 传输失败");
        log_info ("unsuccessful slave SPI transfer\r\n");
      }

    SPI_Close (slaveSpi);

    /*示例完成-将引脚设置为已知状态*/
    GPIO_setConfig (CONFIG_SPI_MASTER_READY、GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    GPIO_WRITE (CONFIG_SPI_SLAVE_READY、0);

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

    似乎交易未完成。

    slaveSem 是从 TransferComplete 回调中发布的- 因此似乎驱动程序没有调用它。

    您将需要检查线条。

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

    感谢 检查了连接。 时钟设置为 P3而不是 P5。 TI 端的新引脚是

    MOSI P07

    MISO P06

    SCLK P05

    SS P08

    和 GND  

    上述引脚连接到 OpenMV 的相应引脚。 我在 TI 代码中添加了一条语句 spiParams.bitrate = 115200、并 将 OpenMV 中的相位更改为1:  

    SPI = SPI (2SPI.master波特率= 115200极性= 0相位= 1) 

    新的 TI 代码如下所示。  问题仍然存在, 无法 调用 TransferComplete 回调。

    状态= SEM_INIT (&slaveSem、0、0);
    if (status!= 0){
      while (1);

    log_info ("sem init done \r\n);

    SPI_Params_init (&spiParams);
    spiParams.bitrate = 115200;
    spiParams.frameFormat = SPI_POL0_PHA1;
    spiParams.mode = SPI_SLAVE;
    spiParams.transferCallbackFxn = transferCompleteFxn;
    spiParams.transferMode = SPI_MODE_CALLACK;
    slaveSpi = SPI_open (CONFIG_SPI_SLAVE、&spiParams);

    if (slaveSpi == NULL){
      log_info ("初始化从器件 SPI\r\n 时出错");
      while (1);

    否则{
      log_info ("已初始化从属 SPI \r\n);

    /*将消息复制到发送缓冲区*/
    strncpy ((char *) slaveTxBuffer、SLAVE_MSG、SPI_MSG_LENGTH);

    对于(I = 0;I < MAX_LOOP;I++){
      /*初始化从属 SPI 事务结构*/
      transaction.count = SPI_MSG_length;
      transaction.txBuf =空;
      transaction.rxBuf =(void *) slaveRxBuffer;

      /*打开用户 LED 指示灯,指示正在进行 SPI 传输*/
      GPIO_TOGGLE (CONFIG_GPIO_LED_1);

      transferOK = SPI_transfer (slaveSpi、事务);
      if (transferOK){
        log_info ("内部传输确定\r\n);
        log_info ("从机接收到%s\r\n、transaction.rxBuf);

        /*等待传输完成*/
        SEM_WAIT (slaveSem);
        log_info ("SEM wait done \r\n);

        GPIO_WRITE (CONFIG_SPI_SLAVE_READY、1);


        log_info ("接收到从属设备\r\n);

      否则{
        log_info ("unsuccessful slave SPI transfer\r\n");
      }

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

    请在交易期间检查线路(您可以发送逻辑分析仪输出)。  

    请比较使用 SPI 从  器件和 SPI 主器件示例时的成功事务。

    BR、

    Kobi