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自收自发的程序:

/*
 * SPI自收自发
 *
 */

#include "F28x_Project.h"

typedef unsigned char Uint8;


//声明
void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
void spia_init();
void spia_xmit(Uint8 a);


//全局变量
char sdata;
char rdata;

void main()
{
    //初始化
    InitSysCtrl();//系统控制
    InitGpio();//GPIO
    DINT;//关中断
    InitPieCtrl();//PIE控制寄存器
    IER = 0x0000;//中断标志位清零
    IFR = 0x0000;//中断标志位清零
    InitPieVectTable();//中断向量表


    gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)


    spia_init();

    sdata = 0x0045;

    for(;;)
    {
        spia_xmit(sdata);
        while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}
        rdata = SpiaRegs.SPIRXBUF;
        sdata++;
    }


}

void gpio_init()
{
    /* GPIO 连接端口                          I/O        初始值
     * 60   SPICLKA_DA     SPIA CLK
     * 59   SPISOMIA_DA    SPIA SOMI
     * 58   SPISIMOA_DA    SPIA SIMO
     */

    EALLOW;

    //SPI
    //DA(使能、异步、SPI)
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA

    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA

    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA

    EDIS;

}

void spia_init()
{
    //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0
    //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007)
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平)
    SpiaRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式
    SpiaRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式
    SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位

    //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006)
    SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样)
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU主机
    SpiaRegs.SPICTL.bit.TALK = 1;//使能主机发送
    SpiaRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断

    //SpiaRegs.SPISTS.all = 0;

    //波特率寄存器(9位保留,0000 0000 0000 007C)
    /*
     * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
     * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
     * 在不添加外部辅助时钟的情况下
     * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS
     * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS
     * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C
     */

    EALLOW;
    ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频)
    EDIS;

    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;

    //优先级控制寄存器
    SpiaRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI

    //停止SPI软件复位准备接收或发送
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}

void spia_xmit(Uint8 a)
{
    SpiaRegs.SPITXBUF = a;//将8位数据传到串行发送缓冲

}

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从的程序:

/*
 * SPI主从测试
 *
 */

#include "F28x_Project.h"

typedef unsigned char Uint8;


//声明
void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
void spia_init();
void spia_xmit(Uint8 a);
void spib_init();
void spib_xmit(Uint8 a);


//全局变量
char sdata;
char rdata;

int i;

void main()
{
    //初始化
    InitSysCtrl();//系统控制
    InitGpio();//GPIO
    DINT;//关中断
    InitPieCtrl();//PIE控制寄存器
    IER = 0x0000;//中断标志位清零
    IFR = 0x0000;//中断标志位清零
    InitPieVectTable();//中断向量表


    gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)


    spia_init();
    spib_init();

    sdata = 0x0000;
    rdata = 0x0000;

    for(;;)
    {
        spia_xmit(sdata);
        while(SpibRegs.SPISTS.bit.INT_FLAG != 1){}
        rdata = SpibRegs.SPIRXBUF;
        sdata++;

    }


}

void gpio_init()
{
    /* GPIO 连接端口                          I/O        初始值
     * 60   SPICLKA_DA     SPIA CLK
     * 59   SPISOMIA_DA    SPIA SOMI
     * 58   SPISIMOA_DA    SPIA SIMO
     *
     * 65   SPICLKB_AD     SPIB CLK
     * 64   SPISOMIB_AD    SPIB SOMI
     * 63   SPISIMOB_AD    SPIB SIMO
     */

    EALLOW;

    //SPI
    //DA(使能、异步、SPI)
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA

    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA

    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA

    //SPI
    //DA(使能、异步、SPI)
    GpioCtrlRegs.GPCPUD.bit.GPIO65 = 0;
    GpioCtrlRegs.GPCQSEL1.bit.GPIO65 = 3;
    GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3;
    GpioCtrlRegs.GPCGMUX1.bit.GPIO65 = 3;//SPICLKB

    GpioCtrlRegs.GPCPUD.bit.GPIO64 = 0;
    GpioCtrlRegs.GPCQSEL1.bit.GPIO64 = 3;
    GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3;
    GpioCtrlRegs.GPCGMUX1.bit.GPIO64 = 3;//SPISOMIB

    GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO63 = 3;//SPISIMOB

    EDIS;

}

void spia_init()
{
    //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0
    //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007)
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平)
    SpiaRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式
    SpiaRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式
    SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位

    //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006)
    SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样)
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU主机
    SpiaRegs.SPICTL.bit.TALK = 1;//使能主机发送
    SpiaRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断

    //SpiaRegs.SPISTS.all = 0;

    //波特率寄存器(9位保留,0000 0000 0000 007C)
    /*
     * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
     * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
     * 在不添加外部辅助时钟的情况下
     * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS
     * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS
     * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C
     */

    EALLOW;
    ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频)
    EDIS;

    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;

    //优先级控制寄存器
    SpiaRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI

    //停止SPI软件复位准备接收或发送
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}

void spib_init()
{
    //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0
    //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007)
    SpibRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位
    SpibRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平)
    SpibRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式
    SpibRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式
    SpibRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位

    //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006)
    SpibRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断
    SpibRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样)
    SpibRegs.SPICTL.bit.MASTER_SLAVE = 0;//MCU从机
    SpibRegs.SPICTL.bit.TALK = 1;//使能主机发送
    SpibRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断

    //SpiaRegs.SPISTS.all = 0;

    //波特率寄存器(9位保留,0000 0000 0000 007C)
    /*
     * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
     * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
     * 在不添加外部辅助时钟的情况下
     * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS
     * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS
     * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C
     */

    EALLOW;
    ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频)
    EDIS;

    SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;

    //优先级控制寄存器
    SpibRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI

    //停止SPI软件复位准备接收或发送
    SpibRegs.SPICCR.bit.SPISWRESET = 1;
}

void spia_xmit(Uint8 a)
{
    SpiaRegs.SPITXBUF = a;//将8位数据传到串行发送缓冲

}

期待并感谢您的回答。

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

  • 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)。 您的代码应该是这样的:

    void spia_xmit(Uint8 a)
    {
    SpiaRegs.SPITXBUF = (Uint16)(a<<8);//Pass 8-bit data to serial transmit buffer
    
    }

    测试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。

    下面是修改后的程序:

    /*
     * SPI主从测试
     *
     */
    
    #include "F28x_Project.h"
    
    typedef unsigned char Uint8;
    
    
    //声明
    void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
    void spia_init();
    void spia_xmit(Uint8 a);
    void spib_init();
    void spib_xmit(Uint8 a);
    
    
    //全局变量
    char sdata;
    char rdata;
    
    void main()
    {
        //初始化
        InitSysCtrl();//系统控制
        InitGpio();//GPIO
        DINT;//关中断
        InitPieCtrl();//PIE控制寄存器
        IER = 0x0000;//中断标志位清零
        IFR = 0x0000;//中断标志位清零
        InitPieVectTable();//中断向量表
    
    
        gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
    
    
        spia_init();
        spib_init();
    
        sdata = 0x0000;
        rdata = 0x0000;
    
        for(;;)
        {
            spia_xmit(sdata);
            while(SpibRegs.SPISTS.bit.INT_FLAG != 1){}
            rdata = SpibRegs.SPIRXBUF;
            spib_xmit(sdata);
            while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}
            char rdataa = SpiaRegs.SPIRXBUF;
            sdata++;
    
        }
    
    
    }
    
    void gpio_init()
    {
        /* GPIO 连接端口                          I/O        初始值
         * 60   SPICLKA_DA     SPIA CLK
         * 59   SPISOMIA_DA    SPIA SOMI
         * 58   SPISIMOA_DA    SPIA SIMO
         *
         * 65   SPICLKB_AD     SPIB CLK
         * 64   SPISOMIB_AD    SPIB SOMI
         * 63   SPISIMOB_AD    SPIB SIMO
         */
    
        EALLOW;
    
        //SPI
        //DA(使能、异步、SPI)
        GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
        GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
        GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
        GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA
    
        GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
        GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
        GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
        GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA
    
        GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
        GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
        GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
        GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA
    
        //SPI
        //DA(使能、异步、SPI)
        GpioCtrlRegs.GPCPUD.bit.GPIO65 = 0;
        GpioCtrlRegs.GPCQSEL1.bit.GPIO65 = 3;
        GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3;
        GpioCtrlRegs.GPCGMUX1.bit.GPIO65 = 3;//SPICLKB
    
        GpioCtrlRegs.GPCPUD.bit.GPIO64 = 0;
        GpioCtrlRegs.GPCQSEL1.bit.GPIO64 = 3;
        GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3;
        GpioCtrlRegs.GPCGMUX1.bit.GPIO64 = 3;//SPISOMIB
    
        GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0;
        GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3;
        GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3;
        GpioCtrlRegs.GPBGMUX2.bit.GPIO63 = 3;//SPISIMOB
    
        EDIS;
    
    }
    
    void spia_init()
    {
        //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0
        //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007)
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位
        SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平)
        SpiaRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式
        SpiaRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式
        SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位
    
        //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006)
        SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断
        SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样)
        SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU主机
        SpiaRegs.SPICTL.bit.TALK = 1;//使能主机发送
        SpiaRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断
    
        //SpiaRegs.SPISTS.all = 0;
    
        //波特率寄存器(9位保留,0000 0000 0000 007C)
        /*
         * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
         * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
         * 在不添加外部辅助时钟的情况下
         * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS
         * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS
         * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C
         */
    
        EALLOW;
        ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频)
        EDIS;
    
        SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;
    
        //优先级控制寄存器
        SpiaRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI
    
        //停止SPI软件复位准备接收或发送
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    }
    
    void spib_init()
    {
        //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0
        //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007)
        SpibRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位
        SpibRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平)
        SpibRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式
        SpibRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式
        SpibRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位
    
        //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006)
        SpibRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断
        SpibRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样)
        SpibRegs.SPICTL.bit.MASTER_SLAVE = 0;//MCU从机
        SpibRegs.SPICTL.bit.TALK = 1;//使能主机发送
        SpibRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断
    
        //SpiaRegs.SPISTS.all = 0;
    
        //波特率寄存器(9位保留,0000 0000 0000 007C)
        /*
         * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
         * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
         * 在不添加外部辅助时钟的情况下
         * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS
         * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS
         * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C
         */
    
        EALLOW;
        ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频)
        EDIS;
    
        SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;
    
        //优先级控制寄存器
        SpibRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI
    
        //停止SPI软件复位准备接收或发送
        SpibRegs.SPICCR.bit.SPISWRESET = 1;
    }
    
    void spia_xmit(Uint8 a)
    {
        SpiaRegs.SPITXBUF = (Uint16)(a<<8);//将8位数据传到串行发送缓冲
    
    }
    
    void spib_xmit(Uint8 b)
    {
        SpibRegs.SPITXBUF = (Uint16)(b<<8);//将8位数据传到串行发送缓冲
    
    }
    
    

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

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

  • 您在 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.