21ic问答首页 - DSPIC30F 双机SPI通信
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
}
}
/**************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
}
}
您需要登录后才可以回复 登录 | 注册