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.

[参考译文] TMS320F280049C:有关 SPI 的问题

Guru**** 2394305 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE, TMS320F280049C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1084630/tms320f280049c-question-about-spi

部件号:TMS320F280049C
“线程:sysconfigC2000WARE”中讨论的其它部件

尊敬的团队:

我的客户想要修改两个 F280049C 芯片之间的通信例程(SPI_ex1_loopback.c)。 (例程能够正常通信)

客户已将内部回送模式下的程序分为主程序和从程序,分别启用 FIFO 及其中断,但在连接相应的引脚后未观察到正确的传输波形。

他主要修改了以下两个代码:

SpiaRegs.SPICCR.bit.SPILBK = 0;

(笑声)

SpiaRegs.SPICTL.bit.master_slave = 1;  

需要进行哪些更改?

#include "F28x_Project.h"

interrupt void spiTxFifoIsr(void);
interrupt void spiRxFifoIsr(void);
void delay_loop(void);
void initSPIFIFO(void);
void InitSpi(void);
void error(void);
Uint16 sdata[8];     // Send data buffer
Uint16 rdata[8];     // Receive data buffer
Uint16 errcounter;
Uint16 rdata_point;  // Keep track of where we are
                     // in the data stream to check received data
int  m=0,n=0;
void main(void)
{
    Uint16 i;
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    InitSpiaGpio();
    EALLOW;  // This is needed to write to EALLOW protected registers
    PieVectTable.SPIA_RX_INT = &spiRxFifoIsr;
    PieVectTable.SPIA_TX_INT = &spiTxFifoIsr;
    EDIS;   // This is needed to disable write to EALLOW protected registers
    initSPIFIFO();

    for(i=0;i<8;i++)
    {
        sdata[i]=i;
    }
    rdata_point = 0;
    errcounter=0;

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
    PieCtrlRegs.PIEIER6.bit.INTx1=1;     // Enable PIE Group 6, INT 1
    PieCtrlRegs.PIEIER6.bit.INTx2=1;     // Enable PIE Group 6, INT 2
    IER=0x20;
//    IER = M_INT6// Enable CPU INT6
    EINT;
//    sdata = 0;
    for(;;);
}
void error(void)
{
    errcounter++;
    asm("     ESTOP0");     // Test failed!! Stop!
    for(;;);
}
void delay_loop()
{
    long      i;
    for (i = 0; i < 10; i++) {}
}
void initSPIFIFO(void)
{
    SpiaRegs.SPIFFTX.all =0xC028;
    SpiaRegs.SPIFFRX.all = 0x0028;
    SpiaRegs.SPIFFCT.all =0x00;
    SpiaRegs.SPIFFTX.bit.TXFIFO=1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
//    SpiaRegs.SPICCR.bit.SPISWRESET =0;
//    SpiaRegs.SPICCR.all =0x001F;
//    SpiaRegs.SPICTL.all =0x0017;
//    SpiaRegs.SPISTS.all =0x0000;
//    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
//    SpiaRegs.SPIFFTX.all =0xC028;
//    SpiaRegs.SPIFFRX.all =0x0028;
//    SpiaRegs.SPIFFCT.all =0x00;
//    SpiaRegs.SPIPRI.all =0x0010;
//    SpiaRegs.SPICCR.bit.SPISWRESET =1;
//    SpiaRegs.SPIFFTX.bit.TXFIFO =1;
//    SpiaRegs.SPIFFRX.bit.RXFIFORESET =1;
    InitSpi();
}
void InitSpi(void)
{
    // Set reset low before configuration changes
    // Clock polarity (0 == rising, 1 == falling)
    // 16-bit character
    // Enable loop-back(1:使能回环  0:禁用回环)
    //
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpiaRegs.SPICCR.bit.SPICHAR = (16-1);
    SpiaRegs.SPICCR.bit.SPILBK = 1;
    //
    // Enable master (0 == slave, 1 == master)
    // Enable transmission (Talk)
    // Clock phase (0 == normal, 1 == delayed)
    // SPI interrupts are disabled
    //
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    SpiaRegs.SPICTL.bit.TALK = 1;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    SpiaRegs.SPICTL.bit.SPIINTENA = 0;

    // Set the baud rate
    //
//    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007F;
    // Set FREE bit
    // Halting on a breakpoint will not halt the SPI
    SpiaRegs.SPIPRI.bit.FREE = 1;
    //
    // Release the SPI from reset
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}

/******发送中断配置*******/
interrupt void spiTxFifoIsr(void)
{
    m++;
    Uint16 i;
    for(i=0;i<8;i++)
    {
        SpiaRegs.SPITXBUF =sdata[i];
    }
    for(i=0;i<8;i++)                    // Increment data for next cycle
    {
        sdata[i]++;
    }
    SpiaRegs.SPIFFTX.bit.TXFFINTCLR =1;
    PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ACK
}


/*****接收中断配置********/
interrupt void spiRxFifoIsr(void)
{
    n++;
    Uint16 i;

    for(i=0;i<8;i++)
    {
        rdata[i]=SpiaRegs.SPIRXBUF;
    }
    for(i=0;i<8;i++)
    {
        if(rdata[i]!=rdata_point+i)
        { error();}
    }
    rdata_point++;
    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR =1;
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR =1;
    PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ACK
}

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

    绿色,

    客户是否有任何理由更喜欢使用位域示例? 他们是否会考虑使用以下路径中基于驱动程序库的示例。 它具有 sysconfig 支持,还有许多其他示例。

    下面提供的示例非常接近您要实现的目标。

    路径:C:\ti\c2000\C2000Ware_4_00_00_00\driverlib\f28004x\examples\SPI

    文件:SPI_ex4_external_loopback_fifo_interrupts

    此致,

    马诺伊

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

    您好,Manoj:

    也许客户更喜欢使用钻头现场例行程序。 我向他推荐了这种程序,但客户表示他不想使用。

    此外,客户提到,根据上述配置修改程序后,可以观察波形。 主波形的 Simo 波形与从属波形的 SOMI 波形一致,但从属波形的 Simo 波形发生偏移。 (由于某些原因,客户无法提供波形图...)

    结果是否正确?

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="306637" url="~/support/moncs/c2000-monc-timroms-group/c2f/c2000-monicroms-forum/1084630/tms320f280049c - question-about-SPI/4021268#4021268]',此外,客户提到根据上述配置修改程序后,可以观察波形。 主波形的 Simo 波形与从属波形的 SOMI 波形一致,但从属波形的 Simo 波形发生偏移。 (由于某些原因,客户无法提供波形图...)

    这一观察听起来是正确的。