📄 ia4421.c
字号:
////////////初始化SPI////////////////
void init_spi(void)
{ PIR1=0;
SSPCON=0X21; //同步串行口使能SSPEN=1(SPI方式和I2C方式),时钟低电平为空闲状态CKP=0,FOSC/16
SSPSTAT=0XC0; //在输出数据中间采样输入数据SMP=1,在上升沿发送数据(SKP=0,SKE=1)
TRISC5=0;
TRISC3=0;
TRISC4=1;
}
////////////用SPI口读写数据至NRF905//////////
uchar SpiWriteRead(unsigned char b)
{
uchar data;
TRISC5=0;
TRISC3=0;
TRISC4=1;
//SSPIF=0;
//GIE=0;
SSPBUF=b;
while(SSPIF==0); //死循环
SSPIF=0;
data=SSPBUF;
//GIE=1;
return(data);
}
////////////用SPI口读写数据至NRF905//////////
uchar SpiSlowWriteRead(unsigned char b)
{
uchar data;
TRISC5=0;
TRISC3=0;
TRISC4=1;
//SSPIF=0;
//GIE=0;
SSPBUF=b;
while(SSPIF==0); //死循环
SSPIF=0;
data=SSPBUF;
//GIE=1;
return(data);
}
void Int_Init(void)
{ TRISB0=1;
INTEDG=0; //下降沿有效
INTF=0;
INTE=1;
GIE=1;
}
void Set_Timer1Start(uint Limit) //8us/s
{ TMR1L=Limit;
TMR1H=Limit>>8;
//TMR1L=0x23;
//TMR1H=0x80;
T1CON=0X30; //1:8
PEIE=1;
TMR1ON=1;
TMR1IF=0;
TMR1IE=1;
}
//===============================================================================================
void Set_Timer1(uint Limit) //8us/s
{ TMR1L=Limit;
TMR1H=Limit>>8;
//TMR1L=0x23;
//TMR1H=0x80;
T1CON=0X30; //1:8
PEIE=1;
TMR1ON=1;
TMR1IF=0;
TMR1IE=1;
}
//===============================================================================================
void Turn_Off_Timer1(void)
{ TMR1ON=0;
TMR1IF=0;
TMR1IE=0;
}
//===============================================================================================
void Enable_IntExt(void)
{ TRISB0=1;
INTEDG=0; //下降沿有效
INTF=0;
INTE=1;
}
//===============================================================================================
void Disable_IntExt(void)
{ INTF=0;
INTE=0;
}
void Timer2_Init(void)
{ //1ms
T2CON=0X0d; // 1:1 1:4 1*4=4;
TMR2=0;
PR2=249; //250*4=1ms
PEIE=1;
TMR2IF=0;
TMR2IE=1;
}
void Ia442x_SlowSpiWriteCommand(unsigned int x) //写指令
{
unsigned char comdata1,comdata2;
unsigned int a;
a=x;
TRISC0=0; //Ia442x_nSEL
Ia442x_nSEL=0;
comdata2=a;
comdata1=a>>8;
SpiSlowWriteRead(comdata1);
SpiSlowWriteRead(comdata2);
Ia442x_nSEL=1;
}
void Ia442x_SpiWriteCommand(unsigned int x) //写指令
{
unsigned char comdata1,comdata2;
unsigned int a;
a=x;
TRISC0=0; //Ia442x_nSEL
GIE=0;
Ia442x_nSEL=0;
comdata2=a;
comdata1=a>>8;
SpiWriteRead(comdata1);
SpiWriteRead(comdata2);
Ia442x_nSEL=1;
GIE=1;
}
unsigned int Ia442x_SlowSpiReadWord(void) //读状态
{
unsigned int u;
TRISC0=0; //Ia442x_nSEL
Ia442x_nSEL=0;
u=SpiSlowWriteRead(0X00);
u<<=8;
u+=SpiSlowWriteRead(0X00);
Ia442x_nSEL=1;
return(u);
}
unsigned int Ia442x_SpiReadWord(void) //读状态
{
unsigned int u;
TRISC0=0; //Ia442x_nSEL
GIE=0;
Ia442x_nSEL=0;
u=SpiWriteRead(0X00);
u<<=8;
u+=SpiWriteRead(0X00);
Ia442x_nSEL=1;
GIE=1;
return(u);
}
void Ia442x_Init(void) //IA442x初始化
{
Ia442x_SpiWriteCommand(0x80d8); //配置命令,fd-915M,dd-433M ,15pF COMMAND:0X80XX
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 0 0 0 0 0 0 0 el ef b1 b0 x3 x2 x1 x0 8008h
Ia442x_SpiWriteCommand(0x8209);
//Ia442x_SpiWriteCommand(0x8201); //电源管理 COMMAND:0X82XX
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 0 0 0 0 0 1 0 er ebb et es ex eb ew dc 8208h
Ia442x_SpiWriteCommand(Frequency[Frequency_Conunter]); //频率设置 COMMAND:0XAXXX
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 0 1 0 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 A680h
// f0 = 10 * C1 * (C2 + F/4000) [MHz]
// Band [MHz] C1 C2
// 433 1 43
// 868 2 43
// 915 3 30
Ia442x_SpiWriteCommand(0xc647); //波特率设置0xc623:9600bps COMMAND:0XC6XX 0xc606:50kbps
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 1 0 0 0 1 1 0 cs r6 r5 r4 r3 r2 r1 r0 C623h
//波特率计算:BR = 10000 / 29 / (R+1) / (1+cs*7) [kbps]
// R= (10000 / 29 / (1+cs*7) / BR) – 1
Ia442x_SpiWriteCommand(0x94c0); //接收控制 COMMAND:0X9xxx //0x94c0--BW:67kHz
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 0 0 1 0 p16 d1 d0 i2 i1 i0 g1 g0 r2 r1 r0 9080h
// 0 0 0
Ia442x_SpiWriteCommand(0xc2ec); //数据滤波 COMMAND:0Xc2xx
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 1 0 0 0 0 1 0 al ml 1 s 1 f2 f1 f0 C22Ch
Ia442x_SpiWriteCommand(0xca81); //FIFO COMMAND COMMAND:0Xcaxx
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 1 0 0 1 0 1 0 f3 f2 f1 f0 0 al ff dr CA80h
Ia442x_SpiWriteCommand(0xc49b); //AFC COMMAND COMMAND:0Xc4xx
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 1 0 0 0 1 0 0 a1 a0 rl1 rl0 st fi oe en C4F7h
Ia442x_SpiWriteCommand(0x9810); //TXCTRL COMMAND:0X98xx FSK频率偏移定在0x9810--+-30KHz,正极性调制,输出功率最大
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 0 0 1 1 0 0 mp m3 m2 m1 m0 0 p2 p1 p0 9800h
// fout = f0 + (-1)SIGN * (M + 1) * (15 kHz)
//Ia442x_SpiWriteCommand(0xffff); //WAKEUP COMMAND:0Xfxxx
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 POR
// 1 1 1 r4 r3 r2 r1 r0 m7 m6 m5 m4 m3 m2 m1 m0 E196h
// Twake-up = M * 2R [ms]
// Ia442x_SpiWriteCommand(0xc80e); //间歇工作
// Ia442x_SpiWriteCommand(0xc060); //时钟输出
//Ia442x_SpiWriteCommand(0xca83);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -