SPI和IIC协议解析3

博客作者决定整理NRF24l01,先介绍了头文件定义的函数,接着阐述寄存器的读写,写成功status不为零,读成功reg_val为所需数据;还提及在指定位置读写固定长度字节,status指示读写是否成功,此外还涉及启动发送、接收及模式设置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本来不打算整理NRF24l01了,但是看了看发现还是很重要,而且有点东西,还是整理一下吧。
同样头文件中的宏定义很多。。。
1、先看头文件定义的函数:

void NRF24L01_Init(void);				
void NRF24L01_RX_Mode(void);			
void NRF24L01_TX_Mode(void);		
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);
u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);
u8 NRF24L01_Read_Reg(u8 reg);		
u8 NRF24L01_Write_Reg(u8 reg, u8 value);		
u8 NRF24L01_Check(void);					
u8 NRF24L01_TxPacket(u8 *txbuf);				
u8 NRF24L01_RxPacket(u8 *rxbuf);				

感觉这个东西会很常用,决定还是记一下使用方法和寄存器结构等等。

2、寄存器的读写

u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
	u8 status;	
   	NRF24L01_CSN=0;           
  	status =SPI2_ReadWriteByte(reg);
  	SPI2_ReadWriteByte(value);    
  	NRF24L01_CSN=1;         
  	return(status);       	
}


u8 NRF24L01_Read_Reg(u8 reg)
{
	u8 reg_val;	    
 	NRF24L01_CSN = 0;          
  	SPI2_ReadWriteByte(reg);   
  	reg_val=SPI2_ReadWriteByte(0XFF);
  	NRF24L01_CSN = 1;       	    
  	return(reg_val);         
}	

这里的reg与其说是寄存器地址,更像是命令字,当然也决定了寄存器的地址,同时也决定了下一次收发操作的性质。

对于写,完成的话status应该不为零,失败为0
对于读,读到数据的话reg_val就是所要的数据,否则就是0

3、在指定位置读写固定长度的字节

u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
	u8 status,u8_ctr;	       
  	NRF24L01_CSN = 0;         //使能SPI,实际上是SPI的片选信号
  	status=SPI2_ReadWriteByte(reg); 	   
 	for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);
  	NRF24L01_CSN=1;     //关闭
  	return status;       
}



u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{
	u8 status,u8_ctr;	    
 	NRF24L01_CSN = 0;        
  	status = SPI2_ReadWriteByte(reg);
  	for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++);
  	NRF24L01_CSN = 1;       
  	return status;     
}				   

这里的status都是用来指示是否读写成功的,如果是0,说明没成功。
reg属于命令字加地址?不太懂,寄存器不都是八位的吗为啥要写一串。。?

4、启动NRF发送一次数据

u8 NRF24L01_TxPacket(u8 *txbuf)
{
	u8 sta;
 	SPI2_SetSpeed(SPI_BaudRatePrescaler_8);
	NRF24L01_CE=0;
  	NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);
  	
 	NRF24L01_CE=1;   
	while(NRF24L01_IRQ!=0);
	sta=NRF24L01_Read_Reg(STATUS);  	   
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); 
	if(sta&MAX_TX)
	{
		NRF24L01_Write_Reg(FLUSH_TX,0xff);
		return MAX_TX; 
	}
	if(sta&TX_OK)
	{
		return TX_OK;
	}
	return 0xff;
}

5、启动一次接收

u8 NRF24L01_RxPacket(u8 *rxbuf)
{
	u8 sta;		    							   
	SPI2_SetSpeed(SPI_BaudRatePrescaler_8);    
	sta=NRF24L01_Read_Reg(STATUS);     	 
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); 
	if(sta&RX_OK)
	{
		NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);
		NRF24L01_Write_Reg(FLUSH_RX,0xff);
		return 0; 
	}	   
	return 1;
}					  

6、模式设置

void NRF24L01_RX_Mode(void)
{
	NRF24L01_CE=0;	  
  	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);
	  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);     
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); 	 
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);	  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
  	
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);
  	
  	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);
  	
  	NRF24L01_CE = 1; 
}						 



void NRF24L01_TX_Mode(void)
{														 
	NRF24L01_CE=0;	    
  	NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);
  	
  	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);

  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);       
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); 
  	NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);
  	
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  
  	
  	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);  
  	
	NRF24L01_CE=1;
}

好多对寄存器的配置,但不知道都是啥意思,额写不下去了睡了睡了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值