DSP2812的SPI如何读取光编信息

2019-03-26 14:41发布

DSP2812的SPI如何读取光编信息,
现在面临的问题是,SPI给光编发下去控制指令,光编能反馈信息,示波器也能够测出来波形,但是SPI的SOMI口读不进去反馈的信息。代码如下,求各位大神指导是不是程序哪块写的不对呢?

/*********************************************************************
**        实验目的:通过学习本实验来掌握DSP的SPI工作原理                   **
**        实验说明:SPI是一高速同步的串行输入输出口,它的通信速率和通信数据 **
**           长度都是可编程的,可以接收和发送16位的数据位,并且带有双 **
**           缓冲的.SPI的4个外部引脚由:从输出主输入(SPISOMI),
**                 从输入主输出(SPISIMO),从发送使能(/SPISTE),串行时钟 **
**           引脚(SPICLK)组成。主要硬件部分:DSP,74HC595(串入并出 **
**           的移位器),共阳数码管。SPIMOSI和SPICLK直接从DSP接到了   **
**           74HC595的SER和SRCLK,作为数据和时钟信号的输入,SPISTE引**
**           脚接到了74HC595的RCLK以控制其选通。                    **
**        实验结果:可看到数码管从0~F循环显示                             **
**********************************************************************/

#include "DSP28_Device.h"

void WriteLED(unsigned char data);                                        //送给光编的数据函数
void ReadLED(unsigned char data);                                        //读光编的数据函数

unsigned char rdata_SPI[16]={0};
unsigned long int a;



Uint16        rdata;
Uint16        SpiCode[]={0x207F};//{0x28FF};
//{0x0000,0x0000,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF};        //送给光编的数据函数,这个为使能信号

void main(void)
{   
    int k,j,m,c;
    int flag=0;
        /*初始化系统*/
        InitSysCtrl();
       
        /* 关中断 */
        DINT;
        IER = 0x0000;
        IFR = 0x0000;
       
        /* 初始化PIE控制寄存器 */
        InitPieCtrl();
       
        /* 初始化PIE参数表 */
        InitPieVectTable();       
       
        /* 初始化外设寄存器 */
        InitGpio();

        InitSpi();

        /*设置CPU*/
       
        EINT; // 开全局中断
        ERTM; // 开实时中断

        for(;;)
         {  
            
                   GpioDataRegs.GPADAT.bit.GPIOA0=1;
               //  GpioDataRegs.GPFDAT.bit.GPIOF3=0; //输出低电平选中驱动芯片(74HC595),
                 WriteLED(SpiCode[k]);        //发送数据函数
                  
                 //for(c=0;c<30;c++);//问题加上延时后数据会变化
                 if(Spi_RxReady()==1);        //当检测到SPI接收准备信号致1时,开始接收数据
   {
         //for(c=0;c<8;c++);//延迟不能放在读函数之内

        rdata=SpiaRegs.SPIRXBUF;//(SpiaRegs.SPIRXBUF>>6);

   }


//                  GpioDataRegs.GPADAT.bit.GPIOA0=1;
                   while(Spi_TxReady()!=1);                //一直等待直到数据发送完成
   {
   for(a=0;a<52;a++);//原来是60,这样延时0.2us
   GpioDataRegs.GPADAT.bit.GPIOA0=0;



   }  
         
             






    for(a=0;a<1000;a++);    //500000
         }
}        

/****************************************************************************
*
*名    称:WriteLED()
*
*功    能:SPI发送数据
*
*入口参数:char data,需要发送的数据
*
*出口参数:无
*
****************************************************************************/
void WriteLED(unsigned char data)
{   
   if(Spi_TxReady() == 1)                //当检测到SPI发送准备信号致1时,开始发送数据
   {   
      SpiaRegs.SPITXBUF = data;        //把数据写如SPI发送缓冲区
   }

   while(Spi_TxReady()!=1);                //一直等待直到数据发送完成
   {
   }  

  // GpioDataRegs.GPFDAT.bit.GPIOF3=1; //退出时关片选(这个是片选芯片的,实际先不用试试,光编无片选信号)
   //GpioDataRegs.GPADAT.bit.GPIOA0=1;

}


//===========================================================================
// No more.
//===========================================================================

void ReadLED(unsigned char data)
{   
   if(Spi_RxReady() == 1)                //当检测到SPI接收准备信号致1时,开始接收数据
   {  


      data=SpiaRegs.SPIRXBUF;
      //if(rdata_SPI[1]==0x207F)   //收到正确的帖头
      //SpiaRegs.SPIRXBUF = data;        //把数据写如SPI发送缓冲区
   }

   while(Spi_RxReady()!=1);                //一直等待直到数据接收完成
   {
   }  

  // GpioDataRegs.GPFDAT.bit.GPIOF3=1; //退出时关片选(这个是片选芯片的,实际先不用试试,光编无片选信号)
}


此帖出自小平头技术问答
0条回答

一周热门 更多>