⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 si4421.c

📁 c8051f310xmodembootloader.rar
💻 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 + -