C51- NRF24L01 无线串口模块

1.硬件知识

C51- NRF24L01 无线串口模块_第1张图片

1.1 nRF24L01的引脚功能

(IO方向是相对模块而言的)

C51- NRF24L01 无线串口模块_第2张图片
C51- NRF24L01 无线串口模块_第3张图片

CE:Chip Enable,芯片使能,在发送和接收过程中都要将这个引脚拉高。
IRQ: 低电平触发,当状态寄存器中 TX_DS、RX_DR 或 MAX_RT 为高时触发中断,当 MCU 给中断源写 1 时,中断引脚被禁止。默认状态下所有的中断源是被禁止的。

1.2 通信条件

两个NRF24L01,收发双方需要满足4个条件:
1.发射接收频道相同(设置频道寄存器RF_CH 0-125)
2.发射接收地址相同(设置TX_ADDR和RX_ADDR_P0相同 5个8位地址 )
3.发射接收数据宽度相同(n<=32)
4.发射接收速率相同(250K 1M 2M)
C51- NRF24L01 无线串口模块_第4张图片

1.2.1 传输协议如下

C51- NRF24L01 无线串口模块_第5张图片

2.代码块

/*********************************************************************************************************
function:nRF24L01_TxPacket(unsigned char* rx_buf)
Description:发送 tx_buf 中数据,尽量配置一下TX_PLOAD_WIDTH,发送的长度,最高32字节,设置太高没必要后面都是0无效数据
Input:unsigned char* rx_buf 要发送的数据
Output:返回0x10 说明达到最发重发次数,返回0x20说明发送成功,返回0xFF说明发送错误
Return:
*********************************************************************************************************/
unsigned char NRF24L01_TxPacket(u8 *tx_buf)
{
	u8 sta;	
	EXTI->IMR&=~(EXTI_Line8);//关闭中断
	NRF2401_CE_LOW;										//只有在 CE=0 时才能对NRF24L01进行设置,否则易出现问题 
	SPI_Write_Buf(NRF24L01_WRITE_REG + RX_ADDR_P0,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH); //装载接收端地址
	SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);   //装载数据,以及发送数据的长度
	//SPI_RW_Reg(NRF24L01_WRITE_REG + CONFIG, 0x0e);   	//IRQ收发完成中断响应,16位CRC,主发送
	NRF2401_CE_HIGH;		 							//置高CE,激发数据发送
	Delay_us(10);										//CE拉高后必须有一个10us以上的延时
	
	while(GPIO_ReadInputDataBit(NRF2401_IRQ_PORT,NRF2401_IRQ_PIN));		//发送完成IRQ会拉低,自动置高
	sta = SPI_Read(STATUS);
	SPI_RW_Reg(FLUSH_TX,0xff);											//把TX_FIFO清空,就发一次
	SPI_RW_Reg(NRF24L01_WRITE_REG + STATUS, sta);
	if(sta&STATUS_MAX)													//判断是否达到最大重发次数
	{
		
		SPI_RW_Reg(FLUSH_TX,0xff);										//清除TX FIFO寄存器 
		EXTI->IMR|=EXTI_Line8;//打开中断
		return STATUS_MAX;												//返回0x10
	}
	
	if(sta&STATUS_TX)													//判断是否发送完成
	{
		EXTI->IMR|=EXTI_Line8;
		return STATUS_TX;												//返回0x20	
	}
	EXTI->IMR|=EXTI_Line8;
	return 0xff;														//发送失败,返回0xFF
}

你可能感兴趣的:(51系列单片机,单片机,fpga开发,物联网)