📄 si4421.c
字号:
#include "global.h"
uchar idata n;
bit revframe;
/******************************************************************************
** 函数: ia442xinit()
** 入参:
** 返回:
** 说明: ia442x初始化
******************************************************************************/
void ia442xinit()
{
spisendcommand(0xCED4); //SYNC=2DD4;
spisendcommand(0xCC77); //OB1,OB0, LPX,!ddy,DDIT,BW0
spisendcommand(0x80d7); //;配置命令,fd-915M,dd-433M
spisendcommand(0x8208); //;电源管理 crystal on batter dectector
spisendcommand(0xa080); //;频率设置 430.32MHz(中心频率)
spisendcommand(0xc623); //;9600波特率设置 (c605)BR = 10000 / 29 / (R+1) / (1+cs*7) [kbps] R= (10000 / 29 / (1+cs*7) / BR) –
spisendcommand(0x9480); //;接收控制 VDI OUTPUT FAST 200KHz(BW) RELATIVE to MAXIMUM 0dB RSSIsetth -85dBm
spisendcommand(0xc22c); //;数据滤波 Clock recovery (CR) auto lock control, if set.CR will start in fast mode.
//;fast mode, fast attack and fast release (6 to 8 bit preamble (1010...) is recommended)
//;Digital filter
spisendcommand(0xca80); //;FIFO COMMAND FIFO IT LEVEL 8 SYNCHRON PATTERN FIFO FILL DISABLE DISABLE THE HIGHLY SEBSITIVE
spisendcommand(0xc4f7); //;AFC COMMAND KEEP THE Foffset VALUE +7Fres to -8Fres
spisendcommand(power); //;TXCTRL bias 75KHz RELATIVE OUTPUT POWER 0dB
}
/******************************************************************************
** 函数: receive(void)
** 入参:
** 返回:
** 说明: 接收
******************************************************************************/
bit receive(void)
{
bit flg;
sdi=0;
nsel=0;
revframe = 0;
if(sdo)
{
fiforxframe();
if (revframe)
{
spisendcommand(0xca83);
flg=1;
}
else
{
flg=0;
}
}
else
{
flg=0;
}
return(flg);
}
/******************************************************************************
** 函数: fiforxframe()
** 入参:
** 返回:
** 说明: ia442x接收一帧数据
******************************************************************************/
void fiforxframe()
{
unsigned char i;
unsigned int k;
n = 0;
spirevbyte();
spirevbyte();
rxdata[0]=spirevbyte();
nsel=1;
if(rxdata[0]==0xfa)
{
sdi=0;
nsel=0;
// while(!sdo);
for(k=0;k<6000;k++)
{
if(sdo)
{
break;
}
}
if(k==6000)
{ // nres=0;
//delayms(50);
//nres=1;
ia442xinit();
spirevtwobyte();
spisendcommand(0x8288); //电源管理 whole receive crystal on
spisendcommand(0xca83); //FIFO COMMAND
if(DEBUG) Printf_String("\r\n[msg:]001 si4421's sdo is dead but she can receive");
return;
}
spirevbyte();
spirevbyte();
rxdata[1]=spirevbyte();
nsel=1;
n=rxdata[1]&0xff; //最大接收255字节
if(n<31)
{
for(i=0;i<n;i++)
{
sdi = 0;
nsel = 0;
// while(!sdo);
for(k=0;k<6000;k++)
{
if(sdo)
{
break;
}
}
if(k==6000)
{ //nres=0;
// delayms(50);
// nres=1;
ia442xinit();
spirevtwobyte();
spisendcommand(0x8288); //电源管理 whole receive crystal on
spisendcommand(0xca83); //FIFO COMMAND
return;
if(DEBUG) Printf_String("\r\n[msg:]002 si4421's sdo is dead but she can receive");
}
spirevbyte();
spirevbyte();
rxdata[i+2]=spirevbyte();
nsel=1;
}
revframe=1;
spisendcommand(0xca81);//Disables the highly sensitive RESET mode.
}
else
{revframe = 0;}
}
else
{
revframe = 0;
}
}
/******************************************************************************
** 函数: txregframe()
** 入参:
** 返回:
** 说明: ia442x发送一帧数据
******************************************************************************/
void txregframe(unsigned char len)
{
unsigned char i;
unsigned int u,k;
//P2 = 0xFF;
sdi = 0;
nsel = 0;
// spisendcommand(0xca83);
spisendcommand(0x8228);//transimission starts turn on crystal
// sdi = 0;
// nsel = 0;
len=len+4; //字节固定同步头
for(i=0;i<len;i++)
{
nsel=0;
//while(!sdo);
for(k=0;k<6000;k++)
{
if(sdo)
{
break;
}
}
if(k==6000)
{ // nres=0;
// delayms(50);
// nres=1;
ia442xinit();
spirevtwobyte();
spisendcommand(0x8288); //电源管理 whole receive crystal on
spisendcommand(0xca83); //FIFO COMMAND
if(DEBUG) Printf_String("\r\n[msg:]003 si4421's sdo is dead but she can receive");
return;
}
u=0xb8;
u<<=8;
u+=txdata[i];
spisendcommand(u);
}
nsel=0;
//while(!sdo);
for(k=0;k<6000;k++)
{
if(sdo)
{
break;
}
}
if(k==6000)
{
// nres=0;
// delayms(50);
// nres=1;
ia442xinit();
spirevtwobyte();
spisendcommand(0x8288); //电源管理 whole receive crystal on
spisendcommand(0xca83); //FIFO COMMAND
if(DEBUG) Printf_String("\r\n[msg:]004 si4421's sdo is dead but she can receive");
return;
}
spisendcommand(0xb8aa);//Transmitter Register Write Command byte aa
nsel=0;
// while(!sdo);
for(k=0;k<6000;k++)
{
if(sdo)
{
break;
}
}
if(k==6000)
{
ia442xinit();
spirevtwobyte();
spisendcommand(0x8288); //电源管理 whole receive crystal on
spisendcommand(0xca83); //FIFO COMMAND
if(DEBUG) Printf_String("\r\n[msg:]005 si4421's sdo is dead but she can receive");
return;
}
spisendcommand(0x8288);//Enables the whole receiver chain Turns on the crystal
spirevtwobyte();//读状态
nsel=1;
}
/******************************************************************************
** 函数: spisendcommand()
** 入参: unsigned int x
** 返回:
** 说明: 写指令
******************************************************************************/
void spisendcommand(unsigned int x)
{
unsigned char comdata1,comdata2;
unsigned int a;
a=x;
nsel=0;
comdata2=a;
comdata1=a>>8;
spisendbyte(comdata1);
spisendbyte(comdata2);
nsel=1;
}
/******************************************************************************
** 函数: spisendbyte(unsigned char x)
** 入参: unsigned char x
** 返回:
** 说明: 写8位数据
******************************************************************************/
void spisendbyte(unsigned char x)
{
unsigned char i,bytedata;
bytedata=x;
for(i=0;i<8;i++)
{
sck=0;
sdi=bytedata&0x80;
bytedata=bytedata<<1;
sck=1;
}
sck=0;
sdi=0;
}
/******************************************************************************
** 函数: unsigned int spirevtwobyte()
** 入参: u
** 返回:
** 说明: 读状态
******************************************************************************/
unsigned int spirevtwobyte() //读状态
{
unsigned int u;
nsel=0;
u=spirevbyte();
u<<=8;
u+=spirevbyte();
nsel=1;
return(u);
}
/******************************************************************************
** 函数: unsigned char spirevbyte()
** 入参:
** 返回: bytedata
** 说明: 读8位数据
******************************************************************************/
unsigned char spirevbyte()
{
unsigned char i,bytedata;
sdi=0;
sck=0;
bytedata=0;
for(i=0;i<8;i++)
{
sck=1;
bytedata=bytedata<<1;
if(sdo) bytedata+=1;
sck=0;
}
return(bytedata);
}
/*********************************@end@**************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -