TI中文支持网
TI专业的中文技术问题搜集分享网站

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

程序:

#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发送FIFO写ARINC429数据

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通讯用28335给HI3593的寄存器进行配置。

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

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

 

抓取时钟信号,显示正常

 

时钟信号

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

 

主入从出

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

Green Deng:抱歉确实没使用过HI3593。有参考过官方提供的SPI例程吗?C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_examples_ccsv5\spi_loopback
图片没正确添加,使用回复框右下角的高级编辑器添加图片。

程序:

#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发送FIFO写ARINC429数据

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通讯用28335给HI3593的寄存器进行配置。

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

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

 

抓取时钟信号,显示正常

 

时钟信号

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

 

主入从出

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

mangui zhang:将时钟片选主出存入信号同时抓出来和3593手册对时序如果自带SPI接口时序不满足
看看片选通过GPIO控制或者直接用GPIO模拟SPI进行控制

赞(0)
未经允许不得转载:TI中文支持网 » 关于DSP28335用SPI与芯片HI-3593的通信,请大佬帮忙看看
分享到: 更多 (0)