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.
仿照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 }
除上面的语句之外没有修改其他的,硬件上的连接就是按照SIMO对应SIMO,SOMI对应SOMI,其他类似,外部回环程序也看过,没尝试修改,目前按照上面的配置我已经修改程序,波形已经
观测,主机的SIMO波形与从机的SOMI波形一致,从机的SIMO波形是经过移位后的,这样的结果正确吗?之前没接触过,不太清楚
现在我就是不知道我的移位正不正确,移位很明显,修改的例程里面是在不断发送0000到FFFF的数据,具体的移位是否正确能说一下如何确定吗?这块目前有困难