问答

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

21ic问答首页 - TAG - dsPIC30F
  • DSPIC30F 双机SPI通信 sos

    大佬们,我用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 } }

    spi通信 双机 dsPIC30F ov ST

    2955浏览量 0回复量 关注量