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.

关于DSP28335用SPI与芯片HI-3593的通信,请大佬帮忙看看

Other Parts Discussed in Thread: CONTROLSUITE

程序:

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File

#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#define   CS_   GpioDataRegs.GPBDAT.bit.GPIO49  //定义IO49为片选输出信号

void delay_loop(void);

void spi_xmit(Uint16 a);

void spi_fifo_init(void);

void spi_init(void);

void error(void);

Uint16 j,i,k;

void main(void)

{

   Uint16 rdata;  // received data

   InitSysCtrl();

   InitXintf16Gpio(); //zq

   InitSpiaGpio();

   DINT;

   InitPieCtrl();

   IER = 0x0000;

   IFR = 0x0000;

   InitPieVectTable();

   spi_fifo_init();   // Initialize the Spi FIFO

   spi_init();   // init SPI

 

    CS_=1;             //片选拉高

delay_loop();

CS_=0;             //片选拉低

delay_loop();

spi_xmit(0x04);       //发送软件复位操作码

delay_loop();

CS_=1;

delay_loop();

 

    CS_=0;

    delay_loop();

    spi_xmit(0x10);

    spi_xmit(0x01);       //写接收器1控制寄存器

    delay_loop();

    CS_=1;

    delay_loop();

 

CS_=0;

delay_loop();

spi_xmit(0x08);

spi_xmit(0x81);        //写发送控制寄存器

delay_loop();

CS_=1;

delay_loop();

 

CS_=0;

delay_loop();

spi_xmit(0x0C);       //HI3593发送FIFOARINC429数据

spi_xmit(0xFF);

spi_xmit(0xFF);

spi_xmit(0xFF);

spi_xmit(0xFF);

delay_loop();

CS_=1;

delay_loop();

   for(;;)

   {

     CS_=0;

     delay_loop();

     while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG!=0) { }

     spi_xmit(0x84);           //读发送控制寄存器

     //while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }

     delay_loop();

     rdata = SpiaRegs.SPIRXBUF;

     CS_=1;

     delay_loop();

   }

}

 

 

// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:

 

void delay_loop()

{

    for(i=5;i>0;i--)

    {

        for(j=4;j>0;j--)

        {

            for(k=23;k>0;k--)

            {

                //asm(" RPT #50 || NOP");

            }

        }

    }

}

 

 

void error(void)

{

    asm("     ESTOP0"); // Test failed!! Stop!

    for (;;);

}

 

void spi_init()

{    

SpiaRegs.***.all =0x000F;              // Reset on, rising edge, 16-bit char bits  

SpiaRegs.***.all =0x0006;          // Enable master mode, normal phase,

                                                 // enable talk, and SPI int disabled.

SpiaRegs.SPIBRR =0x007F;

    SpiaRegs.***.all =0x0087;          // Relinquish SPI from Reset

    SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission

}

 

void spi_xmit(Uint16 a)

{

    SpiaRegs.SPITXBUF=a<<8;

}    

 

void spi_fifo_init()

{

// Initialize SPI FIFO registers

    SpiaRegs.SPIFFTX.all=0xE040;

    SpiaRegs.SPIFFRX.all=0x204f;

    SpiaRegs.SPIFFCT.all=0x0;

}  

//===================================================================

// No more.

//===================================================================

 

HI3593是一种总线的协议芯片,可以从总线接收数据,再通过SPI通讯把数据发给28335,同时,28335也可以给HI3593发送数据,进而HI3593将数据发给总线,还可以通过SPI通讯用28335HI3593的寄存器进行配置。

我现在就是28335HI3593SPI通讯不成功,HI3593收不到数据HI3593芯片spi工作模式是半双工,可以向HI3593发送指令操作码,紧接着发送要写入的数据,进而给HI3593寄存器进行配置,还可以发送读取寄存器的指令操作码,然后HI3593把相应寄存器的值返回给28335,芯片手册中有详细介绍。我现在的状况是,发送读取寄存器的操作码,但是没有数据返回。我的程序里有一段是向HI-3593发送FIFOARINC429数据,发送了这个数据之后,芯片的引脚TEMPTY会由高电平状态变为低电平状态,但是我用万用表测了一下这个引脚,电平状态并没有改变,说明数据没有发送过去,但是我没找着问题出在哪,芯片的SPI通讯在数据手册14-16页介绍。

我用示波器抓取片选信号,显示正常,如下图

 

抓取时钟信号,显示正常

 

时钟信号

抓取主入从出信号,示波器显示有反应,但没有具体波形,输出的波为杂波。

 

主入从出

HI-3593测试.dochi-3593数据手册.pdf