📄 458_905_test.c
字号:
#include <p18f4580.h>
#pragma config OSC = HS
#define RED 0
#define YELLOW 1
#define GREEN 2
#define COMPLETE 3
#define LIGHT 6
#define FLASH 10
#define TX_MODE 11
#define RX_MODE 12
#define STBY 13
volatile unsigned char mode905,cd,t_package_num,r_package_num,rved,re_T,txing,stxing,sstxing,srd,init32,u_rd,f920;
volatile unsigned char udata,sdata,uselessdata,s_tx[33],lvd_tag;
unsigned char wnum,s_tnum,u_tnum,s_rnum,u_rnum,s_rv[2][32],u_rv[2][32];
volatile unsigned char s_rcount,s_tcount,u_rcount[2],u_tcount,u_bff_num,u_bff_num_temp,s_bff_num,s_bff_num_temp,tx905bff[32];
int reT_num,aaa,bbb,ggg,hhh,iii,kkk,jump_succeed;
unsigned long lvd_count;
/* u_rnum记录从串口接收到的数据个数,满30个后重新计数
*/
void InterruptHandlerHigh(void);
void InterruptHandlerLow(void);
void mode_905(volatile unsigned char mode);
void T905_jump920();
void T905_jump915();
void delay(unsigned long m)//延时程序,27778为1秒,1为36微妙
{
unsigned long i;
for(i=0;i<m;i++)
{
_asm
clrwdt
_endasm
}
}
void init_SPI()//SPI主控
{
SSPCON1bits.SSPM3=0;
SSPCON1bits.SSPM2=0;
SSPCON1bits.SSPM1=0;
SSPCON1bits.SSPM0=0;//SPI主控方式选择,时钟频率选择4分之一晶振,1MHZ
SSPCON1bits.CKP=0;//时钟极性选择
SSPSTATbits.SMP=1;//数据输出结束时采样输入数据
SSPSTATbits.CKE=1;//时钟沿选择
TRISCbits.TRISC5=0;//SDO输出使能
TRISCbits.TRISC3=0;//SCK时钟输出
SSPCON1bits.SSPEN=1;//SPI串行通信使能
PIR1bits.SSPIF=0;//清除中断标志
}
void init_USART()
{
TXSTAbits.TX9=0;//发送8位数据
RCSTAbits.RX9=0;//接收8位数据
TXSTAbits.SYNC=0;//异步方式选择
TXSTAbits.BRGH=1;//高速波特率选择
SPBRG=25;//9.6Kb/s
RCSTAbits.SPEN=1;//串行端口使能
TXSTAbits.TXEN=1;//发送使能
RCSTAbits.CREN=1;//连续接收
}
void init_lvd()//初始化低电压检测
{
HLVDCONbits.HLVDL3=0;
HLVDCONbits.HLVDL2=0;
HLVDCONbits.HLVDL1=0;
HLVDCONbits.HLVDL0=0;//低电压检测范围2.18V~2.36V
INTCONbits.GIE=0;//关闭中断
PIE2bits.HLVDIE=0;//关闭HLVD中断
HLVDCONbits.HLVDEN=1;//HLVD模块使能
delay(100);
HLVDCONbits.IRVST=1;//内部参考电压标志位
delay(100);
IPR2bits.HLVDIP=1;//HLVD高优先级中断
PIR2bits.HLVDIF=0;//清零中断标志位
PIE2bits.HLVDIE=1;//开放HLVD中断
}
void init_tmr1()
{
T1CONbits.RD16=1;//使能在16位操作TMR1
T1CONbits.T1CKPS1=0;
T1CONbits.T1CKPS0=0;//1:1前分频
T1CONbits.T1OSCEN=0;//禁止TMR1振荡器
T1CONbits.TMR1CS=0;//内部时钟F/4,定时方式
TMR1H=0x00;
TMR1L=0x00;
T1CONbits.TMR1ON=0;//停止TMR1
PIR1bits.TMR1IF=0;
}
void init_tmr2()
{
T2CONbits.T2OUTPS3=1;
T2CONbits.T2OUTPS2=1;
T2CONbits.T2OUTPS1=1;
T2CONbits.T2OUTPS0=1;//1:16后分频
T2CONbits.T2CKPS1=1;
T2CONbits.T2CKPS0=1;//1:16前分频
PR2=25;//4ms周期=14
TMR2=0;//定时器清零
T2CONbits.TMR2ON=0;//停止TMR2
PIR1bits.TMR2IF=0;
}
void init_INT()//中断初始化
{
INTCON=0x00; //关总中断
RCONbits.IPEN=1;//使能中断优先级
INTCON2bits.INTEDG0=1;//INT0上升沿中断
INTCONbits.INT0IE=1;//开放外部INT0中断,始终是高优先级中断源
RCONbits.IPEN=1;//使能中断优先级
IPR1bits.RCIP=0;//USART接收中断低优先级
PIE1bits.RCIE=1;//USART接收中断使能
INTCONbits.PEIE=1;//开放外围模块中断
INTCONbits.GIE=1;//开放中断
}
void init_pin()//引脚初始化,CSN要置高
{
//灯引脚初始化
TRISAbits.TRISA0=0;
TRISAbits.TRISA1=0;
TRISAbits.TRISA2=0;
TRISAbits.TRISA3=0;
PORTA=0;
TRISBbits.TRISB0=1;
TRISBbits.TRISB1=1;
TRISBbits.TRISB2=1;
TRISBbits.TRISB3=0;
TRISBbits.TRISB4=0;
TRISBbits.TRISB5=0;
PORTBbits.RB3=0;
PORTBbits.RB4=0;
PORTBbits.RB5=0;
TRISCbits.TRISC2=0;
TRISCbits.TRISC3=0;
TRISCbits.TRISC4=1;
TRISCbits.TRISC5=0;
PORTC=0;
TRISDbits.TRISD4=0;
TRISDbits.TRISD6=0;//485发送接收切换
TRISDbits.TRISD7=0;//禁止3161
PORTD=0;
PORTCbits.RC2=1;//CSN为高
}
void SPI_read()
{
PORTCbits.RC2=0;//CSN为低
s_rnum=0;
s_rcount=0;
while(s_rnum<33)
{
if(s_rnum==0)
{
SSPBUF=0x24;//读RXPAYLOAD命令
if(SSPCON1bits.WCOL==1) //写冲突检测
{
SSPCON1bits.WCOL=0;
}
do
{;}
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
if(SSPSTATbits.BF==1)
{
uselessdata=SSPBUF;
}
}
if(s_rnum!=0)
{
SSPBUF=0xff;
if(SSPCON1bits.WCOL==1) //写冲突检测
{
SSPCON1bits.WCOL=0;
}
do
{;}
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
if(SSPSTATbits.BF==1)
{
sdata=SSPBUF;
s_rv[s_bff_num][s_rnum-1]=sdata;
}
if(PORTBbits.RB0==0)
{
s_rnum=100;
}
s_rcount++;
}
s_rnum++;
}
PORTCbits.RC2=1;//CSN为高
}
void SPI_readcon()
{
PORTCbits.RC2=0;//CSN为低
s_rnum=0;
while(s_rnum<33)
{
if(s_rnum==0)
{
SSPBUF=0x21;//读CONF命令
if(SSPCON1bits.WCOL==1) //写冲突检测
{
SSPCON1bits.WCOL=0;
}
do
{;}
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
if(SSPSTATbits.BF==1)
{
uselessdata=SSPBUF;
}
}
if(s_rnum!=0)
{
SSPBUF=0xff;
if(SSPCON1bits.WCOL==1) //写冲突检测
{
SSPCON1bits.WCOL=0;
}
do
{;}
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
if(SSPSTATbits.BF==1)
{
sdata=SSPBUF;
s_rv[s_bff_num][s_rnum-1]=sdata;
}
//if(PORTBbits.RB0==0)
//{
//s_rnum=100;
//}
}
s_rnum++;
}
}
void SPI_write(volatile unsigned char num)
{
s_tnum=0;
PORTCbits.RC2=0;//CSN为低
delay(1);
while(s_tnum<num)
{
SSPBUF=s_tx[s_tnum];
do
{;}
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
if(SSPSTATbits.BF==1)
{
uselessdata=SSPBUF;
}
s_tnum++;
}
PORTCbits.RC2=1;//CSN为高
}
void init_905_32()
{
s_tx[0]=0x00;//配置命令,从0字节开始
s_tx[1]=45;
s_tx[2]=0x0f;//915MHZ,不重发,10DB
s_tx[3]=0x44;
s_tx[4]=0x20;
s_tx[5]=0x20;
s_tx[6]=0xe7;
s_tx[7]=0xe7;
s_tx[8]=0xe7;
s_tx[9]=0xe7;
s_tx[10]=0xdb;//0x5b;0xdb;//905配置寄存器结束
mode_905(STBY);
SPI_write(11);
init32=1;
}
void init_905_2()
{
s_tx[0]=0x00;//配置命令,从0字节开始
s_tx[1]=45;
s_tx[2]=0x0f;//915MHZ,不重发,10DB
s_tx[3]=0x44;
s_tx[4]=0x02;
s_tx[5]=0x02;
s_tx[6]=0xe7;
s_tx[7]=0xe7;
s_tx[8]=0xe7;
s_tx[9]=0xe7;
s_tx[10]=0xdb;//0x5b;0xdb;//905配置寄存器结束
mode_905(STBY);
SPI_write(11);
init32=0;
}
void init_905_32_920()
{
s_tx[0]=0x00;//配置命令,从0字节开始
s_tx[1]=95;//120;
s_tx[2]=0x0f;//920MHZ,不重发,10DB
s_tx[3]=0x44;
s_tx[4]=0x20;
s_tx[5]=0x20;
s_tx[6]=0xe7;
s_tx[7]=0xe7;
s_tx[8]=0xe7;
s_tx[9]=0xe7;
s_tx[10]=0xdb;//0x5b;0xdb;//905配置寄存器结束
mode_905(STBY);
SPI_write(11);
init32=1;
}
void init_905_2_920()
{
s_tx[0]=0x00;//配置命令,从0字节开始
s_tx[1]=95;//120;
s_tx[2]=0x0f;//870MHZ,不重发,10DB
s_tx[3]=0x44;
s_tx[4]=0x02;
s_tx[5]=0x02;
s_tx[6]=0xe7;
s_tx[7]=0xe7;
s_tx[8]=0xe7;
s_tx[9]=0xe7;
s_tx[10]=0xdb;//0x5b;0xdb;//905配置寄存器结束
mode_905(STBY);
SPI_write(11);
init32=0;
}
void init()
{
init_lvd();
init_USART();
init_pin();
init_SPI();
init_INT();
init_905_32();
init_tmr1();
init_tmr2();
PORTDbits.RD4=0;
PORTDbits.RD6=1;//485接收
PORTDbits.RD7=1;//3161使能
}
void lighting_led(volatile unsigned char color,unsigned long n)
{
if(color==RED)
{
PORTAbits.RA0=1;
if(n!=0)
{
delay(n);
PORTAbits.RA0=0;
}
}
if(color==YELLOW)
{
PORTAbits.RA1=1;
if(n!=0)
{
delay(n);
PORTAbits.RA1=0;
}
}
if(color==GREEN)
{
PORTAbits.RA2=1;
if(n!=0)
{
delay(n);
PORTAbits.RA2=0;
}
}
if(color==COMPLETE)
{
PORTAbits.RA3=1;
if(n!=0)
{
delay(n);
PORTAbits.RA3=0;
}
}
}
void mode_905(volatile unsigned char mode)
{
if(mode==STBY)
{
PORTBbits.RB3=1;//POWER_UP
PORTBbits.RB5=0;//TXEN 进入STBY模式
PORTBbits.RB4=0;//TRX_EN
mode905=STBY;
delay(1);
}
if(mode==TX_MODE)
{
PORTBbits.RB3=1;//POWER_UP
PORTBbits.RB5=1;//TXEN 进入TX模式
PORTBbits.RB4=1;//TRX_EN
mode905=TX_MODE;
delay(15);
}
if(mode==RX_MODE)
{
PORTBbits.RB3=1;//POWER_UP
PORTBbits.RB5=0;//TXEN 进入RX模式
PORTBbits.RB4=1;//TRX_EN
mode905=RX_MODE;
delay(15);
}
}
volatile unsigned char TX_905(volatile unsigned char num)//905发送,CD为高,返回5
{ //要发送的数据在USART接收时存入发送缓冲区tx905bff[32]
volatile unsigned char tnum;
tnum=0;
if(PORTBbits.RB2==1)
{
return 5;
}
else
{
mode_905(STBY);
s_tx[0]=0x22;//写地址命令
s_tx[1]=0xe7;
s_tx[2]=0xe7;
s_tx[3]=0xe7;
s_tx[4]=0xe7;
SPI_write(5);
while(tnum<num)
{
s_tx[tnum+1]=tx905bff[tnum];
tnum++;
}
s_tx[0]=0x20;//写数据命令
SPI_write(num+1);
mode_905(TX_MODE);
do
{;}
while(PORTBbits.RB0==0);
_asm
nop
nop
_endasm
mode_905(STBY);
}
return 0;
}
void RX_905()//未加CRC错误检测识别机制
{
if(mode905!=RX_MODE)
{
mode_905(RX_MODE);
}
if(PORTBbits.RB0==1)
{
rved=1;
SPI_read();
}
}
void TX_USART()
{
//INTCONbits.INT0IE=0;//关外部INT0中断
PORTDbits.RD6=0;//485发送
PORTDbits.RD4=1;
u_tnum=0;
while(u_tnum<s_rv[s_bff_num_temp][1])
{
if(PIR1bits.TXIF==1)
{
TXREG=s_rv[s_bff_num_temp][u_tnum+2];
u_tnum++;
}
}
if(stxing==1)
stxing=0;
if(sstxing==1)
sstxing=0;
PORTDbits.RD6=1;
PORTDbits.RD4=0;
//INTCONbits.INT0IE=1;//开外部INT0中断
}
unsigned char RX_USART()
{
if(PIR1bits.RCIF==1)//等待接收完成
{
if(RCSTAbits.FERR==1)
{
uselessdata=RCREG;
return 5;
}
else
{
if(PIR1bits.RCIF==1)
{
udata=RCREG;//接收数据
u_rv[u_bff_num][u_rnum]=udata;
u_rnum++;
u_rcount[u_bff_num]=u_rnum;
}
}
}
}
void turn_flash_led()
{
init_pin();
delay(15000);
PORTA=0;
PORTAbits.RA0=1;
delay(15000);
PORTAbits.RA0=0;
PORTAbits.RA1=1;
delay(15000);
PORTAbits.RA1=0;
PORTAbits.RA2=1;
delay(15000);
PORTAbits.RA2=0;
PORTAbits.RA3=1;
delay(15000);
}
void num_led(unsigned char x)
{
if(x==1)
{
PORTA=0x08;
delay(30000);
PORTAbits.RA3=0;
}
if(x==2)
{
PORTA=0x04;
delay(30000);
PORTAbits.RA2=0;
}
if(x==3)
{
PORTA=0x0c;
delay(30000);
PORTAbits.RA2=0;
PORTAbits.RA3=0;
}
if(x==4)
{
PORTA=0x02;
delay(30000);
PORTAbits.RA1=0;
}
if(x==5)
{
PORTA=0x0A;
delay(30000);
PORTAbits.RA1=0;
PORTAbits.RA3=0;
}
}
void T905()
{
INTCONbits.INT0IE=0;//关闭外部INT0中断,防止接收ARQ信息与接收真正的数据冲突
cd=0xff;
re_T=0;
while(re_T<2)
{
wnum=0;
if(re_T==0)
{
if(t_package_num!=5)
{
t_package_num++;
}
else
{
t_package_num=1;
}
tx905bff[0]=t_package_num;
tx905bff[1]=u_rcount[u_bff_num_temp];
while(wnum<u_rcount[u_bff_num_temp])
{
tx905bff[wnum+2]=u_rv[u_bff_num_temp][wnum];
wnum++;
}
}
else//if(re_T==0)
{
//PORTA=0X01;
if(f920==1)
{
init_905_32_920();
}
else
{
init_905_32();
}
///*
tx905bff[0]=t_package_num;
tx905bff[1]=u_rcount[u_bff_num_temp];
while(wnum<u_rcount[u_bff_num_temp])
{
tx905bff[wnum+2]=u_rv[u_bff_num_temp][wnum];
wnum++;
} //*/
}//if(re_T==0)
do
{
cd=TX_905(32);
if(cd==5)
{
//lighting_led(COMPLETE,3000);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -