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

📄 txd.c

📁 2.4G无线芯片NRF24L01的控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//  PWR_UP is set, CRC(2 bytes) is enabled, & PRIM:TX.
//
//  ToDo: One high pulse(>10祍) on CE will now send this
//  packet and expext an acknowledgment from the RX device.
//
//
//  Author: RSK   Date: 28.11.05
//**********************************************************
void TX_Mode(void)
{
  SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_LENGTH);    // Writes TX_Address to nRF24L01
  SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_LENGTH); // RX_Addr0 same as TX_Adr for Auto.Ack
 // SPI_Write_Buf(WR_TX_PLOAD, TX_PAYLOAD, TX_PLOAD_WIDTH); // Writes data to TX payload

  SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);            // Enable Auto.Ack:Pipe0
  SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);        // Enable Pipe0
  SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);       // 500祍 + 86祍, 10 retrans...
  SPI_RW_Reg(WRITE_REG + RF_CH, rff);              // Select RF channel 40
  SPI_RW_Reg(WRITE_REG + RF_SETUP, rate);         // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x4e);           // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
  SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
  CE1;

}
void mod_select(uchar tr)
{if(tr==1)
{SPI_COM(FLUSH_TX);
 SPI_COM(FLUSH_RX);
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x4e); 
 SPI_COM(FLUSH_TX);
SPI_COM(FLUSH_RX);
}
 else if(tr==0)
 {
 SPI_COM(FLUSH_TX);
 SPI_COM(FLUSH_RX);
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x3f);  
SPI_COM(FLUSH_TX);
 SPI_COM(FLUSH_RX);
 }

}

//**********************************************************
//
//  Function: RX_Mode
//
//  Description:
//  This function initializes one nRF24L01 device to
//  RX Mode, set RX address, writes RX payload width,
//  select RF channel, datarate & LNA HCURR.
//  After init, CE is toggled high, which means that
//  this device is now ready to receive a datapacket.
//
//  Author: RSK   Date: 28.11.05
//**********************************************************
void RX_Mode(void)
{
  SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_LENGTH); // Use the same address on the RX device as the TX device

  SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);            // Enable Auto.Ack:Pipe0
  SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);        // Enable Pipe0
  SPI_RW_Reg(WRITE_REG + RF_CH, rff);              // Select RF channel 40
  SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width
  SPI_RW_Reg(WRITE_REG + RF_SETUP, rate);         // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x3f);           // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..

  //CE = 1; // Set CE pin high to enable RX device
//CE1;
  //  This device is now ready to receive one packet of 16 bytes payload from a TX device sending to address
  //  '3443101001', with auto acknowledgment, retransmit count of 10, RF channel 40 and datarate = 2Mbps.

}
uchar trans2401(uchar *databuf)
{uchar sta;
 SPI_Write_Buf(WR_TX_PLOAD, databuf, TX_PLOAD_WIDTH);
 SPI_Write_Buf(WR_TX_PLOAD, databuf, TX_PLOAD_WIDTH);
 SPI_Write_Buf(WR_TX_PLOAD, databuf, TX_PLOAD_WIDTH);
 while(flag_max<3)
 {;
 // if((SPI_Read(READ_REG +OBSERVE_TX)&0xf0)>0xa0)
  //{ uart0_txd(0xae);SPI_RW_Reg(WRITE_REG + RF_CH, rff);return 0;}
 }
 flag_max=0;
 return 1;
 
 
}





void testxx(uchar i)
{ flag_rx=i-1;
   uart0_txd(flag_rx);
}
uchar rxd_poll(void)
{
	if(rxd_fifo_out==rxd_fifo_in)return 0;
	else return 1;
}

//***********************************************************************************************************************
//函数作用:从串口的fifO读取一个字节
//参数说明:无
//注意事项:
//返回说明:无
//***********************************************************************************************************************
uchar rxd_read_fifo(void)
{
	uchar ch;
	
	ch=rxd_fifo[rxd_fifo_out];//得到当前要读取的字符
	rxd_fifo_out++;//指向下一个要读取的字符
	if(rxd_fifo_out>=1000)rxd_fifo_out=0;//如果到了fifo末尾 则重从头开始
	return  ch;
}
//***********************************************************************************************************************
//函数作用:查询串口 如果有数据读取一个字节
//参数说明:ch---读取字符存放地址
//注意事项:
//返回说明:如果有数据返回1
//***********************************************************************************************************************
uchar rxd_read_char(uchar *ch)
{
	if(!rxd_poll())return 0;
	*ch=rxd_read_fifo();
	return 1;
}
//////////$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//////////$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//////////$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//////////$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
#pragma interrupt_handler uart0_isr:19
static void uart0_isr(void)
{       uchar temp,i;
	UA00R=	UDR0;
	uart0_txd(UA00R);
	if(UA00R==0x01)
    {mod_select(1);//1 tx  0 rx
	  TX_PAYLOAD[0]=0XD7; TX_PAYLOAD[1]=0X31;
	   TX_PAYLOAD[2]=0XA0; TX_PAYLOAD[3]=0X7D;
	  SPI_Write_Buf(WR_TX_PLOAD, TX_PAYLOAD, TX_PLOAD_WIDTH);
	 cmd_or_data=1;
	}
	else if(UA00R==0x02)
    {mod_select(1);//1 tx  0 rx
	  TX_PAYLOAD[0]=0XD7; TX_PAYLOAD[1]=0X31;
	   TX_PAYLOAD[2]=0XA1; TX_PAYLOAD[3]=0X7D;
	  SPI_Write_Buf(WR_TX_PLOAD, TX_PAYLOAD, TX_PLOAD_WIDTH);
	 cmd_or_data=0;
	  // rxdtemp=0;
	}
	
}
BYTE spi_read_fifo(BYTE reg, BYTE bytes)
{
BYTE status,byte_ctr;

  SS0;                                     // Set CSN low, init SPI tranaction
  status = SPI_RW(reg);                           // Select register to write to and read status byte
   byte_ctr=SPI_RW(0);
   
 if((byte_ctr==(rxdtemp+1))||(cmd_or_data==1))
 {
   if(cmd_or_data==1)//如果是命令数据
   rxd_fifo[rxd_fifo_in++]=byte_ctr;
   else rxdtemp=byte_ctr;
 ////////////////////////////
  // rxd_fifo[rxd_fifo_in++]=byte_ctr;
   //////////////////////////////////
  for(byte_ctr=0;byte_ctr<(bytes-1);byte_ctr++)
   {rxd_fifo[rxd_fifo_in++]=SPI_RW(0);
     if(rxd_fifo_in>=RXD_FIFO_SIZE)rxd_fifo_in=0;
   }
 }
 else 
  {error++;uart0_txd(0xad);
    if(error>=10)
	 //PORTF=0X00;
	  LED_OFF;
	
    for(byte_ctr=0;byte_ctr<(bytes-1);byte_ctr++)
     SPI_RW(0);
  }
   // *pdata++=SPI_RW(0);
  SS1;                                     // Set CSN high again
    if(((rxd_fifo_in-rxd_fifo_out)>=800)&&(rxd_fifo_in>rxd_fifo_out))
		{//start_stop=0;
		  rxd_stop;
		  //uart0_txd(0xbb);
		}
		if(((rxd_fifo_out-rxd_fifo_in)<=200)&&(rxd_fifo_in<rxd_fifo_out))
		{//start_stop=0;
		    rxd_stop;
		}
  
  return(status);                                 // return nRF24L01 status byte
}/*
BYTE spi_read_fifo(BYTE reg, BYTE bytes)
{
BYTE status,byte_ctr;

  SS0;                                     // Set CSN low, init SPI tranaction
  status = SPI_RW(reg);                           // Select register to write to and read status byte
   byte_ctr=SPI_RW(0);
 if(byte_ctr==(rxdtemp+1))
 {rxdtemp=byte_ctr;
 ////////////////////////////
  // rxd_fifo[rxd_fifo_in++]=byte_ctr;
   //////////////////////////////////
  for(byte_ctr=0;byte_ctr<(bytes-1);byte_ctr++)
   {rxd_fifo[rxd_fifo_in++]=SPI_RW(0);
     if(rxd_fifo_in>=RXD_FIFO_SIZE)rxd_fifo_in=0;
   }
 }
 else 
  {error++;
    if(error>=10)
	 PORTF=0X00;
	
    for(byte_ctr=0;byte_ctr<(bytes-1);byte_ctr++)
     SPI_RW(0);
  }
   // *pdata++=SPI_RW(0);
  SS1;                                     // Set CSN high again
    if(((rxd_fifo_in-rxd_fifo_out)>=800)&&(rxd_fifo_in>rxd_fifo_out))
		{//start_stop=0;
		  rxd_stop;
		  //uart0_txd(0xbb);
		}
		if(((rxd_fifo_out-rxd_fifo_in)<=200)&&(rxd_fifo_in<rxd_fifo_out))
		{//start_stop=0;
		    rxd_stop;
		}
  
  return(status);                                 // return nRF24L01 status byte
}*/


void get_data_message(void)
{uchar temp;
  
 
  while(rxd_read_char(&temp))
  {//uart0_txd(temp);
  // return ;
  // delayms(1);
   if(step1==0)
    {
      if(temp==0xff)
	  {step1=1;
	    //uart0_txd(0xdd);
	  }
	}
	else if(step1==1)
	{
       if(temp==0xd8) 
	   {
	    step1=2;
		 //dainc=1;
		// dataindex=0;
		// databuffer[dataindex++]=dainc++;
	     uart0_txd(0xff);
		   uart0_txd(0xd8);
	   }
	   else if(temp==0xe2)
	    step1=3;	
	   else 
	   step1=0;
	
	} 
	else if(step1==2)
	{
	  if((temp==0xff)&&(step2==0))
	   step2=1;
	  else if(step2==1)
	  {  step2=0;
	     if(temp==0xd9)
	     {
	     
	        step1=0;
			rxdtemp=0;
			uart0_txd(0xff);
		   uart0_txd(0xd9);
		  
		 }
		 else 
		 {
		  uart0_txd(0xff);
		   uart0_txd(temp);
		 
		 }
	  }//else if(step2==1)
	  else//主要数据接收
	  {if(((rxd_fifo_in-rxd_fifo_out)<=200)&&(rxd_fifo_in>rxd_fifo_out))
		{//start_stop=1;
		//delayms(1);
		  rxd_start;
		}
		if(((rxd_fifo_out-rxd_fifo_in)>=800)&&(rxd_fifo_in<rxd_fifo_out))
		{  rxd_start;
		//delayms(1);
		}
	     uart0_txd(temp);
		 
	  }
	 
	}
	else if(step1==3)
	{
	
	
	}
	else if(step1==4)
	{
	
	}
	else 
	{
	  step1=0;
	 
	}
  
  }
  
}
void out(void)
{
 //DDRA=0X00;
	   A00;//
   A10;// 选择68013的2号端口作为输出口所以这里PORTA作为输入DDRA=0X00;
   OE0;
}
void get_usb_cmd(void)
{ uchar i=0;
  out();
   while(FLAGC)//FLAGB FULL  FLAGC EMPTY
     {TX_PAYLOAD[i++]=exemm1;
       if(i==32)
	   { mod_select(1);//1 tx  0 rx
	      if(TX_PAYLOAD[2]==0xa0)
	      cmd_or_data=1;
		  else if(TX_PAYLOAD[2]==0xa1)
		   cmd_or_data=0;
		   
		   uart0_txd(TX_PAYLOAD[2]);
		   
	      SPI_Write_Buf(WR_TX_PLOAD, TX_PAYLOAD, TX_PLOAD_WIDTH);
	     
		}
     }
   in();
   
}
void get_cmd_message(void)
{uchar temp,i;
  while(rxd_read_char(&temp))
    { in();
	   if(FLAGB)
	   { write_usb_count++;
	     exemm1=temp;
		 if(write_usb_count==32)
		 {write_usb_count=0;
		   PK0;PK1;
		 }
	   }
	  
	}
}
void get_data_message_usb(void)
{uchar temp;
  
 
  while(rxd_read_char(&temp))
  {//uart0_txd(temp);
   // return ;
  // delayms(1);
   if(step1==0)
    {
      if(temp==0xff)
	  {step1=1;
	    //uart0_txd(0xdd);
	  }
	}
	else if(step1==1)
	{
       if(temp==0xd8) 
	   {write_usb_count2=0;
	    step1=2;
		 //dainc=1;
		// dataindex=0;
		// databuffer[dataindex++]=dainc++;
	    // uart0_txd(0xff);
		  // uart0_txd(0xd8);
		   in();
	      while(!FLAGB);//FLAGB FULL  FLAGC EMPTY
	       write_usb_count2++;
	        exemm1=0xff;
		    write_usb_count2++;
	        exemm1=0xd8;
	      
		   
	   }
	   else if(temp==0xe2)
	    step1=3;	
	   else 
	   step1=0;
	
	} 
	else if(step1==2)
	{
	  if((temp==0xff)&&(step2==0))
	   step2=1;
	  else if(step2==1)
	  {  step2=0;
	     if(temp==0xd9)
	     {
	     
	        step1=0;
			rxdtemp=0;
			//uart0_txd(0xff);
		   //uart0_txd(0xd9);
		    in();
	       while(!FLAGB);//FLAGB FULL  FLAGC EMPTY
		    write_usb_count2++;
	        exemm1=0xff;
			if(write_usb_count2==32)
		   {write_usb_count2=0;
		      PK0;PK1;
		    }
			
			 in();
	       while(!FLAGB);//FLAGB FULL  FLAGC EMPTY
			write_usb_count2++;
	        exemm1=0xd9;
			while(write_usb_count2<32)
			{exemm1=0x00;
			  write_usb_count2++;
			}
			//if(write_usb_count2==32)
		     write_usb_count2=0;
		      PK0;PK1;
		    
		  
		 }
		 else 
		 {
		  //uart0_txd(0xff);
		  // uart0_txd(temp);
		    in();
	       while(!FLAGB);//FLAGB FULL  FLAGC EMPTY
		    write_usb_count2++;
	        exemm1=0xff;
			if(write_usb_count2==32)
		   {write_usb_count2=0;
		      PK0;PK1;
		    }
			
			 in();
	       while(!FLAGB);//FLAGB FULL  FLAGC EMPTY
			write_usb_count2++;
	        exemm1=temp;
			if(write_usb_count2==32)
		   {write_usb_count2=0;
		      PK0;PK1;
		    }
		 
		 }
	  }//else if(step2==1)
	  else//主要数据接收
	  {if(((rxd_fifo_in-rxd_fifo_out)<=200)&&(rxd_fifo_in>rxd_fifo_out))
		{//start_stop=1;
		//delayms(1);
		  rxd_start;
		}
		if(((rxd_fifo_out-rxd_fifo_in)>=800)&&(rxd_fifo_in<rxd_fifo_out))
		{  rxd_start;
		//delayms(1);
		}
	     //uart0_txd(temp);
		  in();
	       while(!FLAGB);//FLAGB FULL  FLAGC EMPTY
			write_usb_count2++;
	        exemm1=temp;
			if(write_usb_count2==32)
		   {write_usb_count2=0;
		      PK0;PK1;
		    }
		 
	  }
	 
	}
	else if(step1==3)
	{
	
	
	}
	else if(step1==4)
	{
	
	}
	else 
	{
	  step1=0;
	 
	}
  
  }
  
}
void in(void)
{
A00;//
	 A11;//选择68013的4号端口作为输入口  和上面相反
	 OE1;
}
void main()
{
 uchar i,xff ;
 flag_max=0;
 flag_rx=0;
 CLI();
 port_init();
 uart0_init((ulong)115200);

  MCUCR |= 0xC0;
 spi_init();
  exint_init(0,2);//x=0---7  //kind  0--3 0 低电平  大板中断0
 // exint_init(7,2);//x=0---7  //kind  0--3 0 低电平  小板中断7
  delayms(100);
  
out(); //select  usb out fifo 
 xff=8;




txdtime=0; rxd_count=0;
////////////////////////////2401 2401
      CE0;
	    TX_Mode();
	   delayms(200);
	
	   CE1;
	   delayms(200);
	 mod_select(0);//1 tx  0 rx
	 EIFR=0XFF;
  delayms(2300);

 SEI();
	
	  delayms(1000);
	   flag_rx=0;
	   i=0;
	   rxdtemp=0;
	   //while(1);
	 while(1)
  {if(cmd_or_data==0)
   //  get_data_message();
	 get_data_message_usb();
	if(cmd_or_data==1)
     get_cmd_message();
	 
	 get_usb_cmd();
  }
	 
}

⌨️ 快捷键说明

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