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.

[参考译文] CCS/LAUNCHXL-F28379D:F28379D 和 F28035之间的 SPI 通信

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/661585/ccs-launchxl-f28379d-spi-communication-between-f28379d-and-f28035

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件:TMS320F28379DDRV8711

工具/软件:Code Composer Studio

e2e.ti.com/.../SPICOMM.docx

 您好!  

这是 TMS320F28379D (主器件)和 TMS32F28035 (从器件)之间的 SPI 通信。 这里唯一奇怪的信号是 SOMI。 主设备和从设备上的回送模式都关闭。 当从器件发回某些数据或者如果主器件上的回送模式打开时、主器件应该在 SPIRXBUF 上获得数据。 从器件有一个 SPIRXISR、每当从器件接收到来自主器件的数据并将其发送回主器件时执行该 SPIRXISR。

根据我的当前代码、当主器件向从器件发送1-16位字时、主器件在 SOMI 线上接收回0。 从器件应将接收到的数据发送回主器件。 我希望主器件等到它接收回发送给从器件的数据、然后发送第二个16位字。 但是、根据我在主器件上的当前 SPI 初始化、当主器件向从器件发送数据时、它会在 MISO 引脚上接收数据、然后从器件甚至可以接收和发回数据。 主器件在接收到该意外数据时发送第二个字。

主机发送

主机接收

从机接收

1

0

 

2.

1

1

已完成发送

2.

2.

 

 从机接收到正确的数据。 但我不希望主设备仅在从设备发送数据时才接收数据。

 

预期:

主机发送

主机接收

从机接收

1

 

 

 

1

1

2.

 

 

 

2.

2.

 

主代码:

void SPI_Fifo_init()

//初始化 SPI FIFO 寄存器

  SpiaRegs.SPICCR.bit.SPISWRESET=0;//重置 SPI

  SpiaRegs.SPICCR.All=0x000F;      //16位字符、环回模式

  SpiaRegs.SPICTL.All=0x001F;      //中断被启用,主/从 Xmit 被启用

  SpiaRegs.SPISTS.All=0x0000;

  SpiaRegs.SPIBRR.All=0x000A;      //波特率

  SpiaRegs.SPIFFTX.All=0xC022;     //启用 FIFO、将 TX FIFO 级别设置为4

  SpiaRegs.SPIFFRX.All=0x0021;     //将 RX FIFO 电平设置为4

  SpiaRegs.SPIFFCT.All=0x00;

  SpiaRegs.SPIPRI.All=0x0010;

  SpiaRegs.SPIFFTX.bit.TXFIFO=1;

  SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;

  SpiaRegs.SPICCR.bit.SPISWRESET=1; //启用 SPI

 

 

 

void main(){

     sdata = 0x0001;

      SpiaRegs.SPITXBUF=sdata;

      while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

      

      sdata = 0x0002;

      SpiaRegs.SPITXBUF=sdata;

      while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

 

      sdata = 0x00AA;

      SpiaRegs.SPITXBUF=sdata;

      while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

 

      sdata = 0x0003;

      SpiaRegs.SPITXBUF=sdata;

      while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

      

       while (1){};

 

 

从器件代码:

_interrupt void spiRxFifoIsr (void)

   

    RDATA = SpiaRegs.SPIRXB;

   SpiaRegs.SPITXBUF = RDATA;

   SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; //清除溢出标志

   SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; //清除中断标志

   PieCtrlRegs.PIEACX.All|=0x20;      //发出 PIE ACK

 

 

void SpiaRegisterInit(){

 

   SpiaRegs.SPICCR.All=0x000F;      //16位字符、环回模式

      SpiaRegs.SPICTL.All=0x001B;      //中断被启用、主/从 Xmit 被启用

      SpiaRegs.SPISTS.All=0x0000;

      SpiaRegs.SPIBRR=0x000A;          //波特率

      SpiaRegs.SPIFFTX.All=0xE022;      

      SpiaRegs.SPIFFRX.All=0x0021;      

      SpiaRegs.SPIFFCT.All=0x00;

      SpiaRegs.SPIPRI.All=0x0010;

      SpiaRegs.SPICCR.bit.SPISWRESET=1; //启用 SPI

      SpiaRegs.SPIFFTX.bit.TXFIFO=1;

      SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;

 

请指出我需要在此代码中进行的更改。

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

    您好、Nibit、

    这是预期行为。  每当主器件发送数据时、它也将始终接收数据。  您可以通过完全断开 SOMI 连接来验证这一点。  接收引脚上的任何电压都将被移入 SPIDAT、并在传输完成后传输到 SPIRXBUF 中。

    从器件端也会发生同样的情况  只要主器件开始传输、从器件就会开始将 SPIDAT 寄存器中的任何内容移出主器件(假设 SPISTE 处于活动状态)。  

    我建议使用您在应用中不会看到的预定义值、并使用该值初始化 SPI 从器件。  然后、您可以在主代码中检查是否收到该值、如果收到、则不要继续进行另一次传输。  或者、您可以了解程序的流程、并知道您从主器件发出的第一个传输将从从器件接收垃圾数据。

    此致、

    Kris

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

    是否有其他方法可以消除它? 主器件每次向从器件写入数据时都会接收回波的原因是从器件在 SPIDAT 中接收数据时、会将数据复制到 SPIRXBUF 中、并将该副本保存在 SPIDAT 中、直至收到下一次突发。 从主器件接收到下一次突发时、从器件将移出之前存储的数据、因为它存储了主器件的新数据。 这应该发生在读取操作中、在读取操作中、主器件在发送时钟脉冲时从从从器件接收数据、这种情况正在发生。 但是、当从器件在实际写入主器件时响应主器件时、不应发生、因为它会破坏我的读取操作。

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

    您好、Nibit、

    主器件将始终接收*什么内容*。 如果您不希望从器件传输数据、则可以在确实需要从器件传输任何数据的消息上将 SPISTE 信号切换到标准 GPIO 设置为高电平(禁用 SPI 从器件传输)。  在这种情况下、主器件将接收到引脚上的任何值-可能是全0或全1。

    此致、

    Kris

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

    您的建议有效。 我还尝试禁用从器件上的 TALK 位、并仅在从器件应向发送内容时启用该位
    主器件。 即使这样、在我的示波器上、我也看不到从器件在不应该对主器件做出响应时对其做出响应。 但这里的另一个问题是、主器件有一个 SPIRXISR、其中有一个递增计数。 如果主器件为一次写入发送4个8位的突发、那么 SPIRXISR 内的计数变为4。 根据您的建议、我在 PicoScope 示波器上看不到从从从属到主的任何波形、因为这不是读取操作。 但主器件会收到一些东西。 即使在移除 MISO 引脚时、主器件也会在 SPIRXISR 中递增计数发送的每个突发。
    这会使主设备端的等待语句混乱、因此当我连接了 MISO 并且主设备正在读取从设备时、 从机使用移位寄存器将4个突发数据发送给主机、但主机只接收3个数据、第4个数据位于主机的 RXBUF 中、但除非我提供额外的时钟、否则从主机中永远不会读取数据。

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

    您好、Nibit、

    我理解这个问题。 此问题需要由您的应用软件处理。

    替代方法是使用不具有主/从关系的不同通信协议、或使用第二个 SPI 端口、以便每个器件都是主器件和从器件。  如果您使用第二个 SPI 端口、则只需要额外的两个引脚、因为您不再需要 SPISTE 引脚。

    但是、我认为软件可能是您的最佳解决方案。

    此致、

    Kris

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

    我认为这是一个软件问题。 在我的第一篇帖子中、您是否认为需要对主 SPI 初始化部分进行任何更改?

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

    您的初始化看起来正常。 您描述的方案是预期行为、它只需要 ISR 中的一些软件。 该流程如下所示:

    1) 1)主器件发送第一个数据、从器件在 SPIDAT 中有一些数据、这些数据会移回主器件
    2) 2)从器件接收主机数据并将其写入 SPITXBUF、以便在下一次传输时发送;主器件接收 RX ISR、其中包含从器件 SPIDAT 中的任何数据
    3) 3)主器件发送下一帧、从器件发回主器件的第一帧等

    我认为处理这一问题的方法是:
    在引导时、将一些不会在您的应用中使用的数据加载到从器件 SPITXBUF 中、例如0x0BAD。 在主 ISR 中、如果接收到0x0BAD、只需清除标志并退出 ISR (不要递增计数)。 在主器件每次完成数据发送后、再发送一个0x0BAD 字节。 这将获得它接收到的从机最后一个数据、但它也将使用0xBAD 重新加载从机以开始下一次传输、并且该数据将被前面所述的设置所忽略。

    此致、
    Kris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另外、如果您未锁定到 F28035器件、我认为您正在寻找具有独立 RX/TX 线(数据和时钟)的 McBSP 的行为。 F2806x 系列具有此外设、可与 F28379D McBSP 连接。

    此致、
    Kris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Kris、
    我将根据您的建议修改我的代码。 还有一个问题、为什么在 MISO 未连接时、主器件中的计数递增。 在这里、从器件甚至不会移动 SPIDAT 中存储的先前数据。 在主器件端、在 SPIRXISR 中、计数增加到主器件发送数据的次数。

    感谢您的快速响应、
    Nikit Shah
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、我已经将 F28035作为主器件与使用 SPI 的 DRV8711相连接、这似乎是完美的工作方式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nibit、

    SPI 主器件在移出数据时始终移入数据。  即使 MISO 线路未连接、SPI 也无法知道这一点。  它只是将引脚上的电压解释为时钟接收边沿上的位。 没有来自从器件的独立信号、指示是否存在有效数据。  引脚上的任何电压都将被解释为传入数据、因为无法发出其他通知。

    这与第一次传输时从器件的情况类似。 尽管从机未加载要发送的数据、但在接收数据时它始终会移出 SPIDAT 中的数据。

    此致、

    Kris

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

    我得到了您的解释。 我将尝试修改代码、以便主器件在读取最后一个数据时捕获该数据。

    再次感谢、
    Nikit Shah