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

📄 rx433.c

📁 nrf9e5带超时无线收发:从串口接收数据(靠超时判断而不是字节判断)
💻 C
字号:
/*******************************************
双机无线收发接收端程序:
        将无线接收到的字符显示在PC串口。

修改:将接收的数据个数由原先的缓冲区大小判断改成由接收到第一个字节判断。
******************************************/

#include <Nordic\reg9e5.h>

#define   HFREQ 0                     // 0=433MHz, 1=868/915MHz     (方便更改)
#define   UART_BUFFER_SIZE    10       //定义串口缓冲区大小 10 bytes

unsigned char UART_BUFFER[UART_BUFFER_SIZE+1];


//串口发送1Byte
void PutChar(char c)
{
    while(!TI)			            //Wait until finished seri-port transmitting
        ;
	TI = 0;			               //Clear interrupt flag
    SBUF = c;			           //sending a byte
}

//串口发送字符串
void PutString(const char *s,unsigned char strlen)
{
    unsigned char k;
	//EIE &= 0xF0;
    for(k=1;k<=strlen;k++)
       {
         PutChar(*(s+k));
       }
	//EIE |= 0x0F;
}


unsigned char SpiReadWrite(unsigned char b)
{
    EXIF &= ~0x20;                  // Clear SPI interrupt        (EXIP.5=0)
    SPI_DATA = b;                   // Move byte to send to SPI data register
    while((EXIF & 0x20) == 0x00)    // Wait until SPI hs finished transmitting   (测试EXIF.5的状态)
          ;
    return SPI_DATA;
}


void Receiver(void)
{
    unsigned char i=0;
    TXEN = 0;
    TRX_CE = 1;                     //进入接收模式
    while(DR == 0)                  //DR=0表示数据未准备好,等待
        ;

    TRX_CE=0;                       //进入待机模式才可读写SPI
    RACSN = 0;                      //内部SPI开始等待命令(1到0的跳变)
    SpiReadWrite(RRP);  
/*
while(DR == 1)
{ 	UART_BUFFER[i] = SpiReadWrite(0); 
    i++;
}
*/            		
	UART_BUFFER[0] = SpiReadWrite(0); 
	for(i=1;i<=UART_BUFFER[0];i++)   //****修改处*****
	{
		UART_BUFFER[i] = SpiReadWrite(0); 		 
	}
	P04 = ~P04;
    RACSN = 1;
//    TRX_CE = 1;                     //这时MCU才从SPI读数据
}

void UART_Init(void)                //nRF9E5串口初始化
{
    TH1 = 0xE6;                      // 9600@16MHz (when T1M=1 and SMOD=1)
    CKCON |= 0x30;                  // T1M=1 (/4 timer clock)
    PCON = 0x80;                    // SMOD=1 (double baud rate)
    SCON = 0x52;                    // Serial mode1, enable receiver
    TMOD = 0x20;                    // Timer1 8bit auto reload 
    TR1 = 1;                        // Start timer1  
    P0_ALT |= 0x06;
    P0_DIR  = 0xA2;                 // P0.1 (RxD) is input
}

void Init(void)                     //nRF9E5无线模块初始化
{
    unsigned char tmp,cklf;
    SPICLK = 0;                     // Max SPI clock
    SPI_CTRL = 0x02;                // Connect internal SPI controller to Radio

    // Configure Radio:
    RACSN = 0;
    SpiReadWrite(WRC | 0x03);       // Write to RF config address 3 (RX payload)
    SpiReadWrite(0x01);             // One byte RX payload
    SpiReadWrite(0x01);             // One byte TX payload
    RACSN = 1;

    RACSN = 0;
    SpiReadWrite(RRC | 0x01);       // Read RF config address 1
    tmp = SpiReadWrite(0) & 0xf1;   // Clear the power and frequency setting bits  
                                    //PA_PWR[1:0]=00(输出电源-10dBm)Bit1:HFREQ_PLL=0(433MHz)
    RACSN = 1;

    RACSN = 0;
    SpiReadWrite(WRC | 0x01);           // Write RF config address 1
    SpiReadWrite(tmp | (HFREQ << 1));   // Change to 433 or 868/915MHz defined by HFREQ above:
    RACSN = 1;


    // 将时钟频率改为16MHz:
    RACSN = 0;
    SpiReadWrite(RRC | 0x09);
    cklf = SpiReadWrite(0) | 0x1c;
    RACSN = 1;
    RACSN = 0;
    SpiReadWrite(WRC | 0x09);
    SpiReadWrite(cklf);
    RACSN = 1;


    RACSN = 0;
    SpiReadWrite(WRC | 0x05);       //设置本接收器可接受的地址,与tx433里的配置一样才可通信
    SpiReadWrite(0x18);
    SpiReadWrite(0x32);
    SpiReadWrite(0x40);
    SpiReadWrite(0xAF);
    RACSN = 1;

    RACSN = 0;
    SpiReadWrite(WRC | 0x03);       //设置本接收器可接受的数据宽度,与tx433里的配置一样才可通信
    SpiReadWrite(0x20);             //接受数据宽度为32个字节
    RACSN = 1;


}

void main(void)
{
    Init();
    UART_Init();
//    EA=1;
//    ES=1;

    while(1)
     { 
      Receiver();
      PutString(UART_BUFFER,UART_BUFFER[0]);
     }
}

⌨️ 快捷键说明

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