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.

[参考译文] TMS320F28379D:C2000和 CC3220SF 之间的 SPI 通信存在奇怪的行为

Guru**** 2538930 points
Other Parts Discussed in Thread: CC3220SF

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1114170/tms320f28379d-strange-behavior-by-spi-communication-in-between-c2000-and-cc3220sf

器件型号:TMS320F28379D
主题中讨论的其他器件:CC3220SF

您好!

我正在努力将原始数据从 C2000发送到 CC3220SF。 当我们根据 PWM 触发的采样频率为 C2000的 ADC 提供正弦波输入(0-2V)时,我们能够成功地将原始数据发送到 cc3220sf,同时对 ADC 数据(64个样本/周期)执行64Point FFT。 当我们尝试  在 ADC 输入端生成谐波(将电源电路中的电弧视为包含谐波的信号)信号并将协调的原始数据发送到 SPI 时、会出现奇怪的情况。   SPI 开始以0xFFFF (从 C2000到 cc3220sf)的形式发送所有数据、并且即使在接收到预期的大小(例如、 cc3220sf 处的 RX 计数为256、但即使在该值之后、它也将连续接收0xFFFF。  

问题可能出在哪,是硬件还是其它问题?  

谢谢你。

此致、

Kuldeep

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

    Kuldeep、

    在本例中、C2000 MCU 是 SPI 主设备还是从设备? 如何将数据从 ADC 复制到 C2000 MCU 中的 SPI? 是通过 DMA 还是 CPU 实现的?  

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

    您好、Martinez、

    C2000处于从模式、频率为500kHz、数据大小为16位。 无 DMA。

    2.我从 ADC 中断将数据放入缓冲区,并将其更新为另一个缓冲区,该缓冲区用于通过 SPI (也就是其 CPU)发送数据。

    感谢您的快速回复。

    谢谢、此致、

    Kuldeep

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

    感谢您的澄清。

    [引用 userid="518327" URL"~/support/microriers/c2000-microriers-group/c2000-f/c2000-microriers-forum/1114170/tms320f28379d-ex奇怪 的行为- by-spi-C2000-and-cc3220sf"]当我们提供一个正弦波输入(0至 c2000/220sf)时、我们成功地根据原始数据发送 CC322v 来触发采样[0-spi]

    由于您在一种情况下能够通过 SPI 成功发送数据、我不会怀疑 SPI 配置或设置有问题。

    [引用 userid="518327" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1114170/tms320f28379d-hore-behavial-by-spi-C2000-and-cc3220sf/4128919#4128919"]引用时、我使用同一个缓冲区将数据从另一个缓冲区发送到另一个数据(引用)、并将其从另一个缓冲区中。]

    您是否查看过该缓冲器以查看它中是否确实有0xFFFF 值? 如果其中包含0xFFFF、我将仔细查看 ADC 及其配置方式。 ADC 可能会饱和。

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

    您好、Martinez、

    感谢您的回复。

    正如我看到的缓冲区,它看起来很好,ADC 没有饱和(12位 ADC,可以提供4096的最大数字值)(最大传感器输出为2V)。我的 FFT 结果也很好。  

    此外、进入 TX 寄存器的数据也正常、但在移位寄存器中、我看到数据为0xFFFF。cc3220sf Launchpad 获得相同的数据。

    注意:在 C2000和 cc3220之间发送任何数据之前、我在 CC3220SF 上使用 GPIO 中断进行握手。 握手之后、我将传输数据。

    握手对正弦波数据正常工作。 握手是使用 CC3220SF 上的上升沿中断完成的。 在 SPI 数据传输后(C2000 SPI RX 上的一个计数器(256个数据)的数据传输次数),C2000上的 GPIO 再次下降到0,这将复位 C2000上的一个标志,然后在主代码中将 GPIO 从高电平变为低电平) 。 此功能可用于正弦波数据。

    当输入端包含谐波的数据时,GPIO 在256个数据 (0xFFF)之后变为低电平(所需),但 SPI 通信仍然保持不变。   

     

    谢谢、 此致、

    Kuldeep

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

    Kuldeep、您好!

    [~ userid="518327" URL"/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/1114170/tms320f28379d-horing-behavial-by-spie-community-ine-between c2000-and-cc3220sf/4129006#4129006"]正在使用正弦信号处理数据。 握手是使用 CC3220SF 上的上升沿中断完成的。 在 SPI 数据传输后(C2000 SPI RX 上的一个计数器(256个数据)的数据传输次数),C2000上的 GPIO 再次下降到0,这将复位 C2000上的一个标志,然后在主代码中将 GPIO 从高电平变为低电平) 。 此功能可用于正弦波数据。[/quot]

    我无法理解这一点。 C2000通过 SPI 发送256个值后将 GPIO 设置为低电平?

    [~ userid="518327" URL"/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1114170/tms320f28379d-hore-behavial-by-spi-C2000-and-cc3220sf/4129006#4129006"] (在输入后仍保持低电平、但仍包含数据)、但在所需的 SPI 谐波数据(包含0x256)中。   [/报价]

    这也是令人困惑的。 如果 C2000器件是从器件、则 CC3220完全控制 SPI 传输。 在从模式下、C2000器件无法启动任何 SPI 事务。  

    [引用 userid="518327" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/1114170/tms320f28379d-huld-ex奇怪 的行为- by-spi-C2000-and-cc3220sf/4129006#4129006"]但如果数据进入 LaunchPad 并进入相同的 LaunchPad、则也可以看到 CC3220fff 寄存器数据。]

    C2000从器件 SPI 将同时在 SPIDAT 上发送和接收数据(我假设移位寄存器就是这种情况)。 如果 C2000 SPI SIMO 引脚悬空或由主器件设置为高电平、那么我认为 SPIDAT 始终为0xFFFF 是合理的。

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

    您好、Martinez、

    请查看以下逻辑以获得更好的理解-  

    这是 C2000上的外部 GPIO 16,当甚至需要如下面的 C2000代码所示进行数据通信时,它会向 CC3220SF 发送中断。

    [~ userid="13605" URL" URL"/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1114170/tms320f28379d-horing-behavial-by-spi-C2000-and-cc3220sf/4129382#4129382"我无法理解这一点。 C2000在通过 SPI 发送256个值后将 GPIO 设置为低电平?[/QUERP]

    GPIO 仅用于通知主 cc3220sf 从设备要进行通信。 仅主机将启动事务-  

    [~引脚 userid="13605" URL" URL"/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1114170/tms320f28379d-hore-behave-by-spi-C2000-and-cc3220sf/4129382#4129382"]这也是令人困惑的。 如果 C2000器件是从器件、则 CC3220完全控制 SPI 传输。 在从模式下、C2000器件无法启动任何 SPI 事务。  [/报价]

    但 CC3220接收到的数据为0xFFFF、不是所需的。  

    [引用 userid="13605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/1114170/tms320f28379d-horing-behavial-by-spi-C2000-and-cc3220sf/4129382#4129382]SPI 从机寄存器假定您同时接收的数据和从机数据(SPAT)。 如果 C2000 SPI SIMO 引脚悬空或由主器件设置为高电平、那么我认为 SPIDAT 始终为0xFFFF 是合理的。[/引用]

    C2000的逻辑与代码-

    if(adcBuff have 64 new data)
        {
              if(condition)
              {
                   for(i=0;i<64;i++)
                   {
                       slaveTxBuffer[i+64*cyclesFilled+1] = adcData[i];
                   }
                   cyclesFilled++;  //Data for 4 cycles means (64*4) 256 +1 (some status) 
                   if(cyclesFilled==4)
                   {
                       cyclesFilled = 0;
                       
                       //External interrupt to Master (This is not CS) for handshaking
                       GPIO_writePin(16, 0);
    
                       for(i = 0; i < SPI_MSG_LENGTH; i++)
                       {
                           SPI_writeDataBlockingFIFO(SPIA_BASE, slaveTxBuffer[i]);
                       }
    
                       while(condition == true){} //This will become false in SPI interrupt once 256 Data Receive is Done
    
                        //Make GPIO to High Again for new handshaking 
                       GPIO_writePin(16, 1);
                   }
    
               }
               
               //Perform Harmonic Analysis using FFT
        }
    
    
    //SPI Interrupt 
     __interrupt void spiaRxFIFOISR(void)
    {
         //
         // Read data
         //
         slaveRxBuffer[receiveCount++] = SPI_readDataNonBlocking(SPIA_BASE);
         if(receiveCount == 257)
         {
             receiveCount=0;
             condition = false;
         }
    
         //
         // Clear interrupt flag and issue ACK
         //
         SPI_clearInterruptStatus(SPIA_BASE, SPI_INT_RXFF);
         Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6);
    }
    

    cc3220sf 上的代码-

     

    //In GPIO Interrrupt for handshaking - 
    void slaveReadyFxn(uint_least8_t index)
    {
            sem_post(&spiSem);
    }
    
    
    
    //In Task SPI Receive 
            
            sem_wait(&spiSem);
    
            /* Initialize master SPI transaction structure */
            memset((void *) masterRxBuffer, 0, SPI_MSG_LENGTH);
            transaction.count = SPI_MSG_LENGTH;
            transaction.txBuf = NULL;
            transaction.rxBuf = (void *) masterRxBuffer;

    请告诉我这是否合理。

    谢谢、此致、

    Kuldeep

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

    Kuldeep、

    感谢您提供更多信息。 这有助于我更好地理解问题。  

    一个问题是、即使在主器件向从器件发送256个字符后、GPIO 仍然为低电平。 对吗? 这是"SPI 通信仍然存在"的意思吗?

    请注意、只有在满足 RX FIFO 级别时才会调用 spiaRxFIFOISR。 因此、您调用 SPI_readDataNonBlocking 的次数需要反映 RXFFIL 设置。 换句话说、如果 RXFFIL = 4、则 SPI RX FIFO 至少有4个字符、您应该调用 SPI_readDataNonBlocking 四次。   您使用的是 RXFFIL 设置是什么? 由于您使用奇数(257)作为清除"条件"的检查、因此您可能应该使用 RXFFIL = 1。

    另一个问题是、我假设 您的代码中 SPI_MSG_LENGTH 定义为257?

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

    您好、Martinez、

    请按以下方式查找详细信息-  

    是的。 即使在发送257个数据之后(我正在发送256个 ADC 数据和1个状态数据),GPIO 仍然为低电平,并且 SPI 时钟和数据传输也会持续大约257个数据长度的2到3倍(大约2*257)

    [引用 userid="13605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/1114170/tms320f28379d-ex奇怪 的行为- by-spi-C2000-and-cc3220sf/4130350#4130350"]一个问题、即使是在主从器件发出256个字符后、仍然会显示为低电平。 对吗? 这是"SPI 通信仍然存在"的意思吗?[/quot]

    是的、我在 C2000中使用 RXFFIL=1、默认情况下、CC3220SF 中使用的是相同的。您可以看到如下所示-  

    [~ userid="13605" URL" URL"μ C/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1114170/tms320f28379d-ex奇怪 的行为- by-spi-C2000-and-cc3220sf/4130350#4130350"]请注意、只有在满足 RX FIFO 深度时、才会被称为 OspixeISR。 因此、您调用 SPI_readDataNonBlocking 的次数需要反映 RXFFIL 设置。 换句话说、如果 RXFFIL = 4、则 SPI RX FIFO 至少有4个字符、您应该调用 SPI_readDataNonBlocking 四次。   您使用的是 RXFFIL 设置是什么? 由于您使用奇数(257)作为清除"条件"的检查、因此您可能应该使用 RXFFIL = 1。[/QUERP]

      SPI_setFIFOInterruptLevel(SPIA_BASE, SPI_FIFO_TXEMPTY, SPI_FIFO_RX1);
    

    C2000上的 SPI 初始化-  

    void initSPIASlave(void)
    {
        //
        // Must put SPI into reset before configuring it
        //
        SPI_disableModule(SPIA_BASE);
    
        //
        // SPI configuration. Use a 500kHz SPICLK and 16-bit word size.
        //
        SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1,
                      SPI_MODE_SLAVE, 500000, 16);
        SPI_disableLoopback(SPIA_BASE);
        SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);
    
        //
        // FIFO and interrupt configuration
        //
        SPI_enableFIFO(SPIA_BASE);
        SPI_clearInterruptStatus(SPIA_BASE, SPI_INT_RXFF);
        SPI_setFIFOInterruptLevel(SPIA_BASE, SPI_FIFO_TXEMPTY, SPI_FIFO_RX1);
        SPI_enableInterrupt(SPIA_BASE, SPI_INT_RXFF);
        //
        // Configuration complete. Enable the module.
        //
        SPI_enableModule(SPIA_BASE);
    }

    其中、我在阻塞模式下使用 SPI 从 C2000传输数据。

    SPI_writeDataBlockingFIFO(SPIA_BASE, slaveTxBuffer[i]);
     

    是的,没错。

    [引用 userid="13605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/1114170/tms320f28379d-ex奇怪 的行为- by-spi-C2000-and-cc3220sf/4130350#4130350"]另一个问题,我是否 已定义为 SPI_MSG[_length?]

    CC3220SF -  

        /* Open SPI as master (default) */
        SPI_Params_init(&spiParams);
        spiParams.frameFormat = SPI_POL0_PHA0;
        spiParams.transferMode= SPI_MODE_BLOCKING;
        spiParams.bitRate = 500000;
        spiParams.dataSize = 16;
        masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);
        if (masterSpi == NULL) {
           // Display_printf(display, 0, 0, "Error initializing master SPI\n");
            while (1);
        }

    在 C2000和 CC3220SF、POL 和 PHA 具有不同的值、因为这两种器件对相同类型具有不同的含义。  cc3220sf 处的 POL0_PHA0和 C2000处的 POL0PHA1对于时钟具有相同的含义、也可以在 TRM 中进行检查。

    谢谢你。

    此致、

    Kuldeep

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

    此时、我找不到您的 SPI 配置有任何问题。 SPI 操作与正在发送或接收的数据无关、因此、理论上谐波数据不应影响 SPI 的运行。

    我建议将调试集中在您的代码流上。 当器件进入这种不良状态(始终保持 GPIO 低电平)时、我建议查看 SPI 中的状态寄存器和代码中的全局变量、以获取更多调试信息。  

    您还可以在 ISR 中将 GPIO 设置为高电平、并将示波器配置为检测从低电平到高电平的任何转换。 GPIO 高电平脉冲可能非常短?

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

    您好、Martinez、

    否,它在相当长的时间内保持高电平。

    [引用 userid="13605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/1114170/tms320f28379d-ex奇怪 的行为- by-spi-C2000-and-cc3220sf/4130653#4130653">您还可以在示波器中将 GPIO 转换设置为高电平、并将其配置为检测高电平、以检测高电平。 GPIO 高电平脉冲可能非常短?[/引述]

    好的、我将继续调试。

    谢谢你。

    此致、

    Kuldeep