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/MSP-EXP430F5529LP:当我想从 SPI 侧接收数据时、如何在主模式下为从 SPI 侧提供时钟?

Guru**** 2586265 points
Other Parts Discussed in Thread: MSP-EXP430F5529LP

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/703683/rtos-msp-exp430f5529lp-how-to-provide-clock-for-slave-spi-side-in-master-mode-when-i-want-to-receive-data-from-slave-spi-side

器件型号:MSP-EXP430F5529LP

工具/软件:TI-RTOS

尊敬的所有人:

我不熟悉 MSP430。

我想在 MSP-EXP430F5529LP 上使用 SPI 作为主模式、首先向从 SPI 发送帧数据、它可以正常工作、但我不知道当我想从从从从 SPI 侧获取数据时如何为从 SPI 提供时钟?

C:\ti\tirtos_msp43x_2_20_00_06\products\msp430_driverlib_2_70_01a\driverlib\MSP430F5xx_6xx lib 中没有为从站侧提供时钟的功能

顺便说一下、我们无法对 SPI 使用 DMA 模式、我的项目上有4个 SPI (MSP-EXP430F5259)、DMA 通道(只有3个通道) 是不够的

谢谢

Susan Yin

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

    e2e.ti.com/.../usci_5F00_b_5F00_spi_5F00_ex1_5F00_slave.ce2e.ti.com/.../usci_5F00_a_5F00_spi_5F00_ex1_5F00_master.c

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

             GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN0);

    #if 0
               _DELAY_CYCLES (2000);

               GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0);

             // USCI_A_SPI_DisableInterrupt (USCI_A1_base、USCI_A_SPI_Receive_interrupt);

               for (i=0;i<5;i++){

                          while (!USCI_A_SPI_getInterruptStatus (USCI_A1_BASE、 USCI_A_SPI_Transmit 中断));

                          USCI_A_SPI_transmitData (USCI_A1_base、0X88);

                          _DELAY_CYCLES (200);

               }

            //  USCI_A_SPI_enableInterrupt (USCI_A1_base、USCI_A_SPI_receive_interrupt);

               GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN0);
    #endif

    在 ext_master.c 中、如果我添加上述代码来为 SPI 从器件传输数据提供时钟、那么主器件和从器件接收数据都是0X88、为什么?  如何为从侧提供时钟?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Susan、
    我不确定是否理解。 主器件向从器件提供时钟。 您似乎已经修改了代码以回显从器件接收的内容、因此、如果您的 A 在主器件和从器件上接收0x88、则它看起来工作正常。 我是否遗漏了什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Cameron LaFollette

    感谢您的回复!

    我想像这样操作数据:  

    1、主器件侧 向从器件侧发送5个数据、

    2、 从器件侧 接收5个数据

    3、从器件侧向主器件发送5个数据、这是一段时间前接收到的数据

    4、主器件可以接收5个数据、它们应 与发送到从器件侧的数据相同。

    然后、第1步-第4步循环  反复运行

    我的问题是

    1、主站只能接收最后5个数据(从站发送 循环数据)、前4个数据丢失、原因是什么?

    2、如果我为从站侧提供时钟、并从主站侧传输数据( 在#if 0代码以上打开)、 那么此时主站和从站接收代码都 是0x88?

    请检查两个附加文件 。

    我想知道的是如何为从主器件的从器件侧提供掩盖? 谢谢

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为这里缺少的部分是:步骤(1)-(2)是同时进行的、步骤(3)-(4)也是同步的。 当主器件发送(1)时、它也接收(2)。 当您再添加5个主机发送字节("#if0"块)时、从机可以发送它之前接收到的内容的缓冲副本(3)/(4)。 在该协议中、主器件应丢弃在步骤(2)中接收到的任何内容。
    --------------------
    在从器件中遇到问题的地方:
    > for (i=0;i<5;i++){
    > USCI_B_SPI_transmitData (USCI_B1_base、slavereceiveData[I++]);
    在 transmitData()之前,您需要确保 TXBUF 准备就绪,否则除了最后一个(5个)之外的所有数据都将丢失。 类似如下:
    > while (!USCI_B_SPI_getInterruptStatus (USCI_B1_BASE、USCI_B_SPI_Transmit 中断));

    --------------------
    >#define SPICLK 5000000
    这看起来更像是5M 而不是500K、但这意味着 SPI 将以 SMCLK 速度(1MHz?)运行、这是可以的。 我真正关心的是-- MSP430为16位--这个常数可能被截断。 我建议:
    >#define SPICLK 5000000UL // 5MHz