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

📄 transmit.c

📁 采用大规模专用射频集成电路nRF2401A设计、实现短距离无线数据传输设备
💻 C
📖 第 1 页 / 共 2 页
字号:
// 突发模式 30位地址 16CRC 发送6个字节的数据 地址前20为ac 交替出现******************************
//*************************ICCAVR6.31A编译**************************************
//******************************************************************************
#include <iom16v.h>
#include <macros.h>


#define	SETBIT(x,y) (x|=(1<<y))      //set bit y in byte x
#define	CLRBIT(x,y) (x&=(~(1<<y)))   //clear bit y in byte x
#define	CHKBIT(x,y) ((x&(1<<y))>>y)       //check bit y in byte x

#define PWR_UP  	 PD7
#define CE      	 PD6
#define CS			 PD5
#define CLK1		 PD4
#define DATA   		 PD3
#define DR1			 PD2

#define set_pwr_up()	SETBIT(PORTD,PWR_UP)
#define clr_pwr_up()    CLRBIT(PORTD,PWR_UP)
#define set_ce()  	    SETBIT(PORTD,CE)
#define clr_ce()  		CLRBIT(PORTD,CE)
#define set_cs()   		SETBIT(PORTD,CS)
#define clr_cs()        CLRBIT(PORTD,CS)
#define set_clk1()   	SETBIT(PORTD,CLK1)
#define clr_clk1()      CLRBIT(PORTD,CLK1)
#define set_data()  	SETBIT(PORTD,DATA)
#define clr_data()  	CLRBIT(PORTD,DATA)
#define chk_dr1()  		CHKBIT(PIND,DR1)
#define chk_data()  	CHKBIT(PIND,DATA)
//-----------------------------------------------------------------------------
//*************************全局变量定义**************************************//
//-----------------------------------------------------------------------------

#define BUFF_SIZE  36
unsigned char rx_buffer[BUFF_SIZE];//设置UART接收数据缓冲区
unsigned char tx_buffer[BUFF_SIZE];//设置UART发送数据缓冲区
volatile unsigned char rd_index=0;          //UART接收缓冲区读指针
volatile unsigned char wr_index=0;          //UART接收缓冲区写指针
volatile unsigned char rx_buffer_ok= 0;     //UART接收数据完成标志
volatile unsigned char rx_buffer_top=0;     //接收数据帧头标志
volatile unsigned char rd_index0=0;         //发送缓冲区读指针
volatile unsigned char wr_index0=0;         //发送缓冲区写指针
volatile unsigned char tx_buffer_top=0;     //发送数据帧头标志

 
unsigned char DataBaud=0x07;             //对应波特率参数

unsigned char pw_data[32];       	     //nRF2401a发送的数据
unsigned char data_cnt=6;			     //发送数据的字节数
unsigned char buffer[32];      		     //接收到shockburstTM发送的数据
unsigned char buf_cnt;		  		     //buffer的指针
unsigned char adr[4]={0xfa,0xfa,0xfa,0x17}; //{0xac,0xac,0xac,0x1a}	;			 //接收方地址

//----------------------------------------------------------------------------
//*********************************延时子函数*********************************
//----------------------------------------------------------------------------
void delay_1ms(void)                   //1ms延时
{
    unsigned int i;
    for(i=0;i<(unsigned int)(1142);i++)//晶振为8MHz,1142=143*xtal-2 xtal为晶振
       ;
}

void delay(unsigned int n)            //整数倍ms延时
{  
   unsigned int i=0;
   for(i=0;i<n;i++)
   delay_1ms();
 }
 
void delay_us(unsigned int i)//8.000M晶振 延时i+2us
{
 if(i==0)
 return;
 while(i--)
 {
 NOP();
 NOP();
 }
 
}


  
 
//------------------------------------------------------------------------------
//********************************RF寄存器配置**********************************
//------------------------------------------------------------------------------
unsigned char RFConf[15]=
{
    0x20,			     			 	  //接受频道2有效数据的长度
    0x50,					 	 		  //接受频道1有效数据的长度
  	0x0a,0x0b,0x0c,0x0d,0x0e,			  //接受频道2的地址,最高为5个字节
    0xab,0xac,0x28,0x12,0x1a,			  //接受频道1的地址,最高为5个字节
    0xa3,								  //接受频道地址位数(6位);8位或16位CRC校验(1位);使能CRC校验(1位)
    0x47,								  //使能第二频道(1位) 通信方式设置(1位) 发射数据速率(1位)	
										  // 晶振频率 3位	发射输出电源功率 2位 
	0x64			 				      //频道设置 7位 接受或发射操作 
};

void trans(unsigned char *p,unsigned char len,signed char ii)//发送len个字节的数据
{
 signed char  i;
 unsigned char len1;
 for(len1=0;len1<len;len1++)
 {
	 for(i=ii;i>=0;i--)
	 {
		 if(CHKBIT(p[len1],i)!=0)
		 set_data();
		 else
		 clr_data(); 		  
		   
		   NOP();		 
		   NOP();		   // Ts 延时大于500ns
		 set_clk1(); 
		   
		   NOP();
		   NOP();    //延时大约500ns
		 clr_clk1();
	 }
 }
}
void transform(unsigned char *p,unsigned char len)
{
unsigned char  i;
 for(i=len;i>0; i--) 

 p[i]^=((p[i-1]<<7)|(p[i]>>1)); 
 
 p[0]^=p[0]>>1;
 
 
}
void trans2(unsigned char *p,unsigned char len)//发送len个字节的数据
{
 
 unsigned char len1=0;
 
 while(len1<len)
 {
   	
		PORTD^=(p[len1]&0x80)>>4;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(p[len1]&0x40)>>3;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(p[len1]&0x20)>>2;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(p[len1]&0x10)>>1;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(p[len1]&0x08);		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(p[len1]&0x04)<<1;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(p[len1]&0x02)<<2;	 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(p[len1]&0x01)<<3;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();		 
	 
	 len1++;
 }
}
void trans3(unsigned char adr)//发送一个字节的后六位
{   	
		PORTD^=(adr&0x20)>>2;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(adr&0x10)>>1;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(adr&0x08);		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(adr&0x04)<<1;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(adr&0x02)<<2;	 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
		
		PORTD^=(adr&0x01)<<3;		 
        NOP();	
        NOP();        // Ts 延时大于500ns
        set_clk1();         
        NOP();
        NOP();    //延时大约500ns
        clr_clk1();
}

//发送数据
void transmit()
{
 DDRD=0XF8;
 set_ce();
 //delay_us(5);
 transform(pw_data,data_cnt-1);
 trans3(adr[0]);
 trans2(&adr[1],1);
 trans2(&adr[2],1);
 trans2(&adr[3],1);
 trans2(pw_data,data_cnt);
 clr_ce(); 
 
}
/*void transmit()
{
 DDRD=0XF8;
 set_ce();
 delay_us(5);
 trans(&adr[0],1,5);
 trans(&adr[1],1,7);
 trans(&adr[2],1,7);
 trans(&adr[3],1,7);
 trans(pw_data,data_cnt,7);
 clr_ce(); 
 
}*/
unsigned char rec_char()				 //shockburst方式接受一个字节的数据
{
 unsigned char data=0;
 signed char i=8;
 
 while(i>=1)
 {
  	 --i;
	 set_clk1();	
	 NOP();
	 NOP();	
	 NOP();
	 NOP();
	 data|=(chk_data()<<i);	   
	 clr_clk1();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -