xindehuiyi 发表于 2013-6-18 11:17

dsp2812与pic16f887 spi通信

PIC与2812进行通信 pic为主机 2812为从机,从机接收信号总是出错,求解答
pic主机spi发送波形






pic主机发送程序晶振为4M 时钟周期为1M
void main(void)
{      
          ANSEL=0X00;                        //所有IO为数字IO
          ANSELH=0X00;                        //所有IO为数字IO
          OSCCON=0X08;                  //系统时钟由CONFIG决定   
      TRISC5=0;                        //SDO
      TRISA5=0;                        //cs
      TRISC3=0;                        //CLK信号

      SSPCON=0X20;                //主机模式 clk空闲时低电平
      SSPSTAT=0X00;                //下降沿发送数据
      uchar j=0,i=0;
          while(1)
          {
                RA5=0;                                        //cs选通
                for(uchar i=0;i<5;i++);      
                SSPBUF=0x55;                        //发送数据
                while(!SSPIF);                        //等待发送结束
                SSPIF=0;
                for(uchar i=0;i<5;i++);
                RA5=1;
                for(uchar i=0;i<240;i++)      //延时
                        for(uchar h=0;h<50;h++);
          }
}
dsp从机接收程序
void InitSpi(void)
{
         EALLOW;
         //spi
         GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2=1;
         GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0=1;
         GpioMuxRegs.GPFMUX.bit.SPISOMIA_GPIOF1=1;
         GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3=1;
   EDIS;

      // Initialize SPI-A:
          SpiaRegs.SPICCR.all=0x07;                        //每次移位8个 下降沿接收数据
          SpiaRegs.SPICTL.all=0x00;                        //从机模式 禁止发送
          SpiaRegs.SPIBRR=24;                              //晶振为20M 波特率为 20*10//2/4/25=1M
          SpiaRegs.SPISTS.all=0;
          SpiaRegs.SPICCR.all=0x87;                        //重启spi
      //SpiaRegs.SPIPRI.bit.FREE=1;
      //tbd...
}      
unsigned int Spi_TxReady(void)
{
      unsigned int i;
      if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)
      {
                i = 0;
      }
      else
      {
                i = 1;
      }
      return(i);
}
unsigned int Spi_RxReady(void)
{
      unsigned int i;
      if(SpiaRegs.SPISTS.bit.INT_FLAG == 1)
      {
                i = 1;
      }
      else
      {
                i = 0;
      }
      return(i);      
}
void main()
{
      uchar i=0,j=0,k;
      InitSysCtrl();
      DINT;
      IER=0x0000;
      IFR=0x0000;
      InitPieCtrl();
      InitPieVectTable();
      InitPeripherals();
      InitSpi();
      InitGpio();
      EINT;
      ERTM;
      i=0;
      j=0;
      while(1)
      {
      //      if(Spi_RxReady()==1)
                while(SpiaRegs.SPISTS.bit.INT_FLAG==0);      //等待接收数据
                        sp_data=SpiaRegs.SPIRXBUF;                //读数据
                j++;
                if(j==10) j=0;
                for(i=0;i<1000;i++);                //延时
      }               
}


zhangmangui 发表于 2013-6-18 12:25

下降沿发送数据波形看着没什么问题
使能信号检查了没   测试中是接收不到数据还是接收到错误的数据
你可以在2812这段单步调试测试   查看寄存器的值

xindehuiyi 发表于 2013-6-18 12:30

zhangmangui 发表于 2013-6-18 12:25 static/image/common/back.gif
下降沿发送数据波形看着没什么问题
使能信号检查了没   测试中是接收不到数据还是接收到错误的数据
你 ...

能接收到数据,但是数据是错的

zhangmangui 发表于 2013-6-18 12:32

感觉还是初始化有问题吧   别的没什么
参考
void InitSpi(void)
{
        // Initialize SPI-A:
        EALLOW;
        GpioMuxRegs.GPFMUX.all = 0x000F;
        EDIS;

        SpiaRegs.SPICCR.all = 0x0a;///进入初始状态,数据在上升沿输出,自测禁止
       
        SpiaRegs.SPICTL.all = 0x06;   //主动模式,禁止中断
       
        SpiaRegs.SPIBRR = 0x1D;//波特率 = LSPCLK/(SPIBRR+1)= 30/30 = 1M
       
        SpiaRegs.SPICCR.all = 0x8a; //退出初始状态
       
       
}

xindehuiyi 发表于 2013-6-18 12:38

zhangmangui 发表于 2013-6-18 12:32 static/image/common/back.gif
感觉还是初始化有问题吧   别的没什么
参考
void InitSpi(void)


为什么是0x0a啊,不是接收8为数据吗

xindehuiyi 发表于 2013-6-18 12:44

改成0X0A后接收的是0XAAAA 0X5555 0X0000

zhangmangui 发表于 2013-6-18 12:58

xindehuiyi 发表于 2013-6-18 12:44 static/image/common/back.gif
改成0X0A后接收的是0XAAAA 0X5555 0X0000

我也记不清了你再研究研究看来是你的初始化有问题

xindehuiyi 发表于 2013-6-18 21:56

程序是正确的,是硬件问题

xiaodou886 发表于 2015-1-13 22:23

我的也是读取问题,请问楼主硬件哪里出问题;了?

luospring123 发表于 2015-3-13 08:55

我觉得controlsuit里面的例程不错,呵呵
页: [1]
查看完整版本: dsp2812与pic16f887 spi通信