问答

汇集网友智慧,解决技术难题

21ic问答首页 - DSPIC30F 双机SPI通信

spi通信 双机 dsPIC30F ov ST

DSPIC30F 双机SPI通信

Arivins2021-01-27
大佬们,我用microchip的DSPIC30F2020和DSPIC30F6011A进行SPI通信,要实现的功能是6011A发送给2020,然后2020再回传给6011A,但是实际测试时一直不好使,附上部分代码2020端:
/**************spi初始化***************/
   clr SPI1BUF                ;SPI模块500/738(SPIxBUF缓冲器)(SPIxSR移入移除数据)            
   bclr IFS0, #SPI1IF         ;将IFS0中的指定位清0,SPI1中断标志状态位,中断标志状态位0=未发生中断请求
   bset IEC0, #SPI1IE         ;置一,中断允许控制寄存器,1=允许中断请求,使能SPI中断                          
   mov #0x0c5b, w0   
   mov w0, SPI1CON1           ;(495)时钟极性:空闲状态时钟信号为高电平.有效状态为低电平,从动模式,辅预分频比2:1,主预分频比1:1
   bclr SPI1STAT, #SPISIDL    ;空闲模式下继续工作
   bclr SPI1STAT, #SPIROV     ;接收溢出标志位0=没有发生溢出
   bset SPI1STAT, #SPIEN      ;SPI使能位1=使能模块,并将SCKx、SDOx、SDIx 和SSx 配置为串口引脚   
/*SPI中断设置优先级 标识位置0 中断时能置1 */
   bclr.b  IFS0+1, #0      ;.b 字节模式选择,清零,0=未发生中断请求 SPI1中断标志状态位
   bset.b  IEC0+1, #0      ;置1使能,中断允许控制寄存器,外部中断0允许位,=允许中断请求
   bset.b  IPC2, #0        ;中断优先级控制寄存器2,SPI1中断优先级位110=6级  修改为7级
   bset.b  IPC2, #1        ;
   bset.b  IPC2, #2        ;


2020SPI中断:
__SPI1Interrupt:
   disi #20                   ;禁止中断,持续时间为10个指令周
   push.s                     ;压入影子寄存
   bclr IFS0, #SPI1IF         ;将IFS0中的指定位清零,为下次SPI中断准备,SPI1中断标志状态位,0=未发生中断请求

   bclr SPI1STAT, #SPIROV     ;
  mov SPI1BUF, w3            ;将SPI接收的电流数电压信号据存入W3
   mov w3,Sign                ;
   mov Sign,w1;
   lsr w1,#8,w2;
   mov  w2,PORTB;
   mov w3,PORTE;
NOP
NOP
NOP
NOP
mov #0x047A, w0   
      mov w0, SPI1CON1           ;(495)时钟极性:空闲状态时钟信号为高电平.有效状态为低电平,从动模式,辅预分频比2:1,主预分频比1:1
      bclr SPI1STAT, #SPISIDL    ;空闲模式下继续工作
      bclr SPI1STAT, #SPIROV     ;接收溢出标志位0=没有发生溢出
      bset SPI1STAT, #SPIEN      ;SPI使能位1=使能模块,并将SCKx、SDOx、SDIx 和SSx 配置为串口引脚
      mov #800,w0
                mov w0,SPI1BUF



6011A端:
void initspi2()                                        //连2020
{
        SPI2BUF=0;
        IFS1bits.SPI2IF=0;
        IEC1bits.SPI2IE=1;
        IPC6bits.SPI2IP=3;
        SPI2CON = 0x047B;         //空闲高电平,有效低电平,上升沿输出数据,主控模式,
                                            //辅助分频比2:1,主预分频比4:1        0000 0100 0111 1010
        SPI2STATbits.SPIROV = 0;  //接收未发生溢出
        SPI2STATbits.SPISIDL = 0; //空闲模式下继续工作
        SPI2STATbits.SPIEN = 1;   //使能SPI
}



void __attribute__((interrupt,no_auto_psv)) _SPI2Interrupt(void)
{
       
if(        SPI2STATbits.SPITBF==0)
{       
        SPI2BUF=0; //发送中断,转成接受模式
        IFS1bits.SPI2IF=0;
        IEC1bits.SPI2IE=1;
        IPC6bits.SPI2IP=3;
        SPI2CON=0X24DA;
        //SPI2STATbits.SPIROV=0; //No Receive Overflow Has Occurred
        SPI2STATbits.SPIEN = 1; //Enable SPI Module
}
if(        SPI2STATbits.SPIRBF==1)//*********************************************
{
        IFS1bits.SPI2IF=0; //接收中断,读取数值,转成发送模式
        SPI2STATbits.SPIROV = 0;
        int i;
        temp=SPI2BUF;
        for(;i<10;i++);
                                                //周期50μs
PR3 = 1000;       
     OC5R =0 ;
        OC5RS=200;

PR3 = 1000;
        OC6R=20;
        OC6RS=200;
        SPI2CON = 0x047B;         //空闲高电平,有效低电平,上升沿输出数据,主控模式,
                                            //辅助分频比2:1,主预分频比4:1        0000 0100 0111 1010
        SPI2STATbits.SPIROV = 0;  //接收未发生溢出
        SPI2STATbits.SPISIDL = 0; //空闲模式下继续工作
        SPI2STATbits.SPIEN = 1;   //使能SPI
}

       
}

回答 +关注 17
2980人浏览 0人回答问题 分享 举报
0 个回答

您需要登录后才可以回复 登录 | 注册