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: SPI时序问题

Part Number: TMS320F28379D
Other Parts Discussed in Thread: C2000WARE

您好,

我今天尝试用示波器测试SPI通讯时序,分别测试了SPIA自收自发和SPIA主SPIB从的通讯。

SPIA自收自发测试时CCS debug界面显示正常。示波器测SCLK如下图,8个脉冲为一组,单个脉冲宽度为12.4us(高低电平时间均为6.2us),但是每组脉冲之间会有31.4us的时间间隔,请问这是正常现象吗

测量SIMO引脚发现它会持续发送同一数据,测量时间大概为32.3ms,约重复发送数据243次,请问这该如何解决

下面是SPIA自收自发的程序:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* SPI
*
*/
#include "F28x_Project.h"
typedef unsigned char Uint8;
//
void gpio_init();//PCBGPIO3线SPI
void spia_init();
void spia_xmit(Uint8 a);
//
char sdata;
char rdata;
void main()
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

SPIA主SPIB从测试时将SPIA CLK-SPIB CLK、SPIA SIMO-SPIB SOMI、SPIA SOMI-SPIB SIMO连接,测试SCLK波形与SPIA自收自发相同,但debug界面显示正常运行一段时间后,rdata始终为FFFF,SpiaRegs.SPISTS.bit.INT_FLAG始终为1,跳不出while循环,请问这应该怎么解决

下面是SPIA主SPIB从的程序:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* SPI
*
*/
#include "F28x_Project.h"
typedef unsigned char Uint8;
//
void gpio_init();//PCBGPIO3线SPI
void spia_init();
void spia_xmit(Uint8 a);
void spib_init();
void spib_xmit(Uint8 a);
//
char sdata;
char rdata;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

期待并感谢您的回答。

  • 您好,我向资深工程师咨询后回复您

  • SPIA自收自发测试时CCS debug界面显示正常。示波器测SCLK如下图,8个脉冲为一组,单个脉冲宽度为12.4us(高低电平时间均为6.2us),但是每组脉冲之间会有31.4us的时间间隔,请问这是正常现象吗

    时序看起来应该是正确的。看起来您的 SPICLK 以 80.6kHz 运行。 由于 LSPCLK 设置为 /10 并且您的 BRR 设置为 124,这意味着您的 MCU SYSCLK 以 80.6kHz * (124+1) * (10) = 100MHz 运行。 这些符合您的预期吗?

    “分组”也是正常的,因为您没有在 SPI 配置中使用 FIFO 模式。 如果您想要连续数据,您必须启用 FIFO 模式。 C2000ware 中有几个示例可以向您展示如何做到这一点。

    测量SIMO引脚发现它会持续发送同一数据,测量时间大概为32.3ms,约重复发送数据243次,请问这该如何解决

    在您的 spia_xmit 代码中,您将 uint8 值写入 uint16 寄存器。 我们认为编译器应该会对此发出警告。 您还需要将您的数据移位 << 8,因为您的 SPI 配置是 8 位的,并且 SPITXBUF 的 MSB 总是首先移出(有关更多信息,请参阅 TRM)。 您的代码应该是这样的:

    Fullscreen
    1
    2
    3
    4
    5
    void spia_xmit(Uint8 a)
    {
    SpiaRegs.SPITXBUF = (Uint16)(a<<8);//Pass 8-bit data to serial transmit buffer
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    测试SCLK波形与SPIA自收自发相同,但debug界面显示正常运行一段时间后,rdata始终为FFFF,SpiaRegs.SPISTS.bit.INT_FLAG始终为1,跳不出while循环,请问这应该怎么解决

    我没有看到您的 spib_xmit() 代码,所以不太确定可能是什么问题。 但是假设您使用与 spia_xmit() 类似的代码,那么您需要进行与上述相同的更改。

  • 谢谢您的回复,我按照您说的对spia_xmit()和spib_xmit()进行了修改,并在主函数里增加了spib向spia发送数据的代码,但是debug界面显示spia可以正常接收spib的数据,而spib的RXBUF里仍然始终为FF。

    下面是修改后的程序:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /*
    * SPI
    *
    */
    #include "F28x_Project.h"
    typedef unsigned char Uint8;
    //
    void gpio_init();//PCBGPIO3线SPI
    void spia_init();
    void spia_xmit(Uint8 a);
    void spib_init();
    void spib_xmit(Uint8 a);
    //
    char sdata;
    char rdata;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    请问这种情况是什么原因呢?

  • 我已经跟进给工程师了,请耐心等候。

  • 您在 spia 和 spib 中都启用了环回模式。 两个接口都应禁用环回模式。

    SpibRegs.SPICCR.bit.SPILBK = 1;

    SpiaRegs.SPICCR.bit.SPILBK = 1;

    From TRM:

    Loopback mode allows module validation during device testing. This mode is valid only in master mode of the SPI.

    • Reset type: SYSRSn
    • 0h (R/W) = SPI loopback mode disabled. This is the default value after reset.
    • 1h (R/W) = SPI loopback mode enabled, SIMO/SOMI lines are connected internally. Used for module self-tests.