打印

dsp2812与pic16f887 spi通信

[复制链接]
2525|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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[j]=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
下降沿发送数据  波形看着没什么问题  
使能信号检查了没   测试中是接收不到数据还是接收到错误的数据
你 ...

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

使用特权

评论回复
地板
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; //退出初始状态
       
       
}

使用特权

评论回复
5
xindehuiyi|  楼主 | 2013-6-18 12:38 | 只看该作者
zhangmangui 发表于 2013-6-18 12:32
感觉还是初始化有问题吧   别的没什么
参考
void InitSpi(void)

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

使用特权

评论回复
6
xindehuiyi|  楼主 | 2013-6-18 12:44 | 只看该作者
改成0X0A后接收的是0XAAAA 0X5555 0X0000

使用特权

评论回复
7
zhangmangui| | 2013-6-18 12:58 | 只看该作者
xindehuiyi 发表于 2013-6-18 12:44
改成0X0A后接收的是0XAAAA 0X5555 0X0000

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

使用特权

评论回复
8
xindehuiyi|  楼主 | 2013-6-18 21:56 | 只看该作者
程序是正确的,是硬件问题

使用特权

评论回复
9
xiaodou886| | 2015-1-13 22:23 | 只看该作者
我的也是读取问题,请问楼主硬件哪里出问题;了?

使用特权

评论回复
10
luospring123| | 2015-3-13 08:55 | 只看该作者
我觉得controlsuit里面的例程不错,呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝