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: TMS320F280049C

Part Number: TMS320F280049C

仿照Ti给的例程,实现了dsp280049的内部回环模式控制,对应的四个引脚也已观测了对应的波形,现在的问题是如何使用两块DSP280049实现SPI的主从通信,除了配置SpiaRegs.SPICCR.bit.SPILBK = 0;          SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;         这两个寄存器之外还需要其余操作嘛???目前我已将内部回环模式下的程序分为了主机程序和从机程序,分别启用FIFO及其中断,但将对应脚连接后未观测到正确的传输波形,我应该如何修改内部回环程序来实现两块DSP之间的通信???

#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
}