24L01发送完成中断TX_DS(IRQ)不产生....

Markerhao 2012-11-20 08:41:05
先调24L01发射部分就不成功....SPI读写寄存器没问题,
Config(地址0x00)寄存器我给的0x0e,说明三种中断任何一种都会触发IRQ是吧
EN_AA(地址0x01)寄存器我给的0x00,也就是所有通道只要发成功,没有ACK也触发发送完成中断,STATUS寄存器的TX_DS位是吧,但是我不停发得到返回的STATUS寄存器是“0x0e 0x0e 0x0f 0x0f 0x0f...后面就是0f了”,CE拉高10uS后,发送完成位没有变1,IRQ用示波器看也没有....百度谷歌都搜遍了....希望CSDN的大神能出没下,哪怕这是该怀疑哪,怎么去试.....

void nRF24L01_TxPacket( uchar * tx_buf)
{
uchar sta=0;
uchar flag=0;


Low_24L01_CE; //StandBy I模式
Hign_24L01_CSN;
Low_24L01_SCK;
delay_nms(100);


SPI_RW_Reg(WRITE_REG+STATUS,0xff); //STATUS复位
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址


SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); //使能P0通道自动应答 此功能禁止后可与24l01通讯
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); //接收地址允许 P0通道接收允许
// SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); //500+86us自动重发15次(文档有问题...)
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); //不自动重发 重发间隔 0us
SPI_RW_Reg(WRITE_REG + RF_CH, 0x00); // 射频通道(工作频率)
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为5字节
// SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 发射功率0dB???
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0e); // 发射功率0dB???


SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送

delay_nms(20);
Hign_24L01_CE; //置高CE,激发数据发送

_delay_us(200);
Low_24L01_CE;

sta1=SPI_Read(STATUS); // 返回状态寄存器
USART_Transmit(sta1); //操作结果

}
...全文
2363 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzyy 2015-04-12
  • 打赏
  • 举报
回复 1
楼主解决了吗?我也是0X1E
程序员小哈 2013-05-16
  • 打赏
  • 举报
回复
引用 楼主 Markerhao 的回复:
先调24L01发射部分就不成功....SPI读写寄存器没问题, Config(地址0x00)寄存器我给的0x0e,说明三种中断任何一种都会触发IRQ是吧 EN_AA(地址0x01)寄存器我给的0x00,也就是所有通道只要发成功,没有ACK也触发发送完成中断,STATUS寄存器的TX_DS位是吧,但是我不停发得到返回的STATUS寄存器是“0x0e 0x0e 0x0f 0x0f 0x0f...后面就是0f了”,CE拉高10uS后,发送完成位没有变1,IRQ用示波器看也没有....百度谷歌都搜遍了....希望CSDN的大神能出没下,哪怕这是该怀疑哪,怎么去试.....

void nRF24L01_TxPacket(  uchar * tx_buf)
{ 
   	uchar sta=0;
   	uchar flag=0;


   	Low_24L01_CE;   //StandBy I模式 
	Hign_24L01_CSN;
	Low_24L01_SCK;
	delay_nms(100);


   SPI_RW_Reg(WRITE_REG+STATUS,0xff);          //STATUS复位
   SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); 
   SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
   

   SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);  //使能P0通道自动应答 此功能禁止后可与24l01通讯
   SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  	//接收地址允许 P0通道接收允许
  // SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); 	//500+86us自动重发15次(文档有问题...)
   SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); 	//不自动重发 重发间隔 0us
   SPI_RW_Reg(WRITE_REG + RF_CH, 0x00);        	//	射频通道(工作频率)
   SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为5字节
  // SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   	//	发射功率0dB???
  SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0e);   	//	发射功率0dB???


  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据 
   SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      	// IRQ收发完成中断响应,16位CRC,主发送

   delay_nms(20);
  Hign_24L01_CE;   							//置高CE,激发数据发送

   _delay_us(200);
   Low_24L01_CE;

	sta1=SPI_Read(STATUS);                   // 返回状态寄存器
	USART_Transmit(sta1);	                 //操作结果

}
楼主你调试通过了吗?我测试发送返回的跟你差不多,“0x1e 0x1e 0x1f 0x1f 0x1f...",能说一下你怎么解决的吗?谢谢啦,我买了两种模块效果都一样的呢
Markerhao 2012-11-23
  • 打赏
  • 举报
回复
感谢大神!!!回去我试试
Markerhao 2012-11-23
  • 打赏
  • 举报
回复
诶呦 2012-11-23
  • 打赏
  • 举报
回复
引用 8 楼 Markerhao 的回复:
感谢大神!!!回去我试试
我还是学生……一起学习,我只是最近也在用这个无线设备
Markerhao 2012-11-22
  • 打赏
  • 举报
回复
是avr的真SPI不是模拟的,SPI应该没问题,因为我写了寄存器读出来是对的。然后就怀疑是硬件坏了?
诶呦 2012-11-22
  • 打赏
  • 举报
回复

//-----------------------------------------------------------------------------------
// Function		:	nRF24L01_Init()
//-----------------------------------------------------------------------------------
// Description	:	初始化nRF24L01
// Parameter	:	None
// Return Value	:	None
// Note			:	None
// Date			:	2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_Init()
{
	RF_CE  = 0;
	RF_CSN = 1;
	RF_SCK = 0;															// 注:SPI模式不同,初始化不同
	RF_IRQ = 1;
	
	SPI_RF_RW_Reg(WRITE_REG + EN_AA, 0x00);								// 不使用自动应答
  	SPI_RF_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  						// 使能Pipe0
	SPI_RF_RW_Reg(WRITE_REG + SETUP_AW, 0x03);							// 5字节的地址
	SPI_RF_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);						// 禁止重发
	SPI_RF_RW_Reg(WRITE_REG + RF_CH, 20);        						// 设置工作通道频率(收发必须一致)
  	SPI_RF_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   						// 设置射频寄存器
	
																		// 新加初始化:发送接收只设置一次
	SPI_RF_RW_Reg(FLUSH_TX, 0x00);										// 清空发送缓冲区
	SPI_RF_RW_Reg(FLUSH_RX, 0x00);										// 清空接收缓冲区
	SPI_RF_RW_Reg(WRITE_REG + RX_PW_P0, RTX_WIDTH); 					// 设置Pipe0接收通道有效数据宽度
	SPI_RF_Write_Buf(WRITE_REG + TX_ADDR   , TX_Adr, TX_ADR_WIDTH);		// 设置发送地址
  	SPI_RF_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_Adr, RX_ADR_WIDTH);		// 设置接收地址
	
}

//-----------------------------------------------------------------------------------
// Function		:	nRF24L01_TX_Mode()
//-----------------------------------------------------------------------------------
// Description	:	设置发送模式并发送数据
// Parameter	:	tx_buf		- 发送的数据
// Return Value	:	None
// Note			:	None
// Date			:	2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_TX_Mode_Data(uchr* tx_buf)
{
	RF_CE = 0;
	
	SPI_RF_Write_Buf(WR_TX_PLOAD, tx_buf, RTX_WIDTH); 					// 设置发送数据
	SPI_RF_RW_Reg(WRITE_REG + CONFIG, 0x0e);							// 设置发送模式
	
	RF_CE = 1;
	Delay_us(13);														// 至少延时10us
	
}

//-----------------------------------------------------------------------------------
// Function		:	nRF24L01_RX_Mode()
//-----------------------------------------------------------------------------------
// Description	:	设置接收模式
// Parameter	:	None
// Return Value	:	None
// Note			:	None
// Date			:	2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_RX_Mode()
{
	RF_CE = 0;
	
	SPI_RF_RW_Reg(WRITE_REG + CONFIG, 0x0f);     						// 设置接收模式
  	
	RF_CE = 1;
	Delay_us(150);														// 至少延时130us
}
这个试试
诶呦 2012-11-22
  • 打赏
  • 举报
回复
//-----------------------------------------------------------------------------------
// Function		:	nRF24L01_Init()
//-----------------------------------------------------------------------------------
// Description	:	初始化nRF24L01
// Parameter	:	None
// Return Value	:	None
// Note			:	None
// Date			:	2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_Init()
{
	RF_CE  = 0;
	RF_CSN = 1;
	RF_SCK = 1;
	RF_IRQ = 1;
	
	SPI_RF_RW_Reg(WRITE_REG + EN_AA, 0x01);								// Pipe0自动应答使能
  	SPI_RF_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  						// 使能Pipe0
	SPI_RF_RW_Reg(WRITE_REG + SETUP_AW, 0x03);							// 5字节的地址
	SPI_RF_RW_Reg(WRITE_REG + SETUP_RETR, 0xff);						// 4000+86us间隔,16次重发
	SPI_RF_RW_Reg(WRITE_REG + RF_CH, 20);        						// 设置工作通道频率(收发必须一致)
  	SPI_RF_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   						// 设置射频寄存器
	
																		// 新加初始化:发送接收只设置一次
	SPI_RF_RW_Reg(FLUSH_TX, 0x00);										// 清空发送缓冲区
	SPI_RF_RW_Reg(FLUSH_RX, 0x00);										// 清空接收缓冲区
	SPI_RF_RW_Reg(WRITE_REG + RX_PW_P0, RTX_PLW); 						// 设置Pipe0接收通道有效数据宽度
}

//-----------------------------------------------------------------------------------
// Function		:	nRF24L01_TX_Mode()
//-----------------------------------------------------------------------------------
// Description	:	设置发送模式并发送数据
// Parameter	:	tx_buf		- 发送的数据
// Return Value	:	None
// Note			:	None
// Date			:	2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_TX_Mode_Data(uchr* tx_buf)
{
	RF_CE = 0;

	SPI_RF_Write_Buf(WRITE_REG + TX_ADDR   , TX_Adr, RTX_AW);			// 设置发送地址
  	SPI_RF_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_Adr, RTX_AW);			// 设置自动应答就收地址(与TX_ADDR必须一致)
	SPI_RF_Write_Buf(WR_TX_PLOAD, tx_buf, RTX_PLW); 					// 设置发送数据
	SPI_RF_RW_Reg(WRITE_REG + CONFIG, 0x0e);							// 设置发送模式
	
	RF_CE = 1;
	Delay_us(13);														// 至少延时10us
}

//-----------------------------------------------------------------------------------
// Function		:	nRF24L01_RX_Mode()
//-----------------------------------------------------------------------------------
// Description	:	设置接收模式
// Parameter	:	None
// Return Value	:	None
// Note			:	None
// Date			:	2012.09.05
//-----------------------------------------------------------------------------------
void nRF24L01_RX_Mode()
{
	RF_CE = 0;
	
	SPI_RF_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_Adr, RTX_AW);			// 设置接收地址(貌似设置一次就行了)
	SPI_RF_RW_Reg(WRITE_REG + CONFIG, 0x0f);     						// 设置接收模式

	RF_CE = 1;
	Delay_us(150);														// 至少延时130us
}
诶呦 2012-11-21
  • 打赏
  • 举报
回复
RF_CH的默认值是0x02
诶呦 2012-11-21
  • 打赏
  • 举报
回复
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); //接收地址允许 P0通道接收允许 ======================================================================= 这一句,Pipe0-5有低6位控制,enable pipe0是0x01 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 发射功率0dB ======================================================================= 这个就可以了,不用0x0e SPI_RW_Reg(WRITE_REG + RF_CH, 0x00); // 射频通道(工作频率) ======================================================================= 这个频率两端要设置一致 Hign_24L01_CE; //置高CE,激发数据发送 ======================================================================= 发送至少延时10us,接收至少延时130us 还是就是接收发送地址要对应 最后是你的中断IRQ怎么弄的?
诶呦 2012-11-21
  • 打赏
  • 举报
回复
1.先看硬件是否OK 2.模拟SPI?时序能保证正确么?先保证通过SPI操作nRF24L01没有问题
Markerhao 2012-11-21
  • 打赏
  • 举报
回复
哇~首先感谢老鸟的关注,我是想,先撇开接受部分,所有RX相关的寄存器咱们都可以不关注吧?“IRQ我是怎么弄的”?什么意思?IRQ我就是用示波器看,发现全都是3.多V,没有拉低的迹象,然后每次发完都去读“STATUS”的TX_DS位也一样没有置“1”....大神有想法吗?
校园智能路灯设计方案 设计名称 基于NRF24L01的校园智能路灯初步粗略设计方案 摘要 近年来,低碳生活,节能减排越来越受到国家的大力支持,在校园生活中平均一盏路灯的功率在200W-300W之间,每晚大概需要点亮时长为18:00--5:00,粗略的计算会发现每盏路灯的功耗大概在2.2--3.3kW·h,学校大多用电平局一度电在0.55元左右,因此,每晚一盏路灯所产生的电费大概在1.2--1.8元左右,大学校园犹如一个小城市,每个学校的路灯至少上百盏,路灯的数量有的会达到上千盏甚至更多。这给学校每天的开销带来了一部分没必要的浪费。 节约校园照明用电消耗成为响应国家对于节能号召的重要措施之一。一般的校园照明系统只是运用普通的声控及光控传感器组成开环的控制系统,其灵活性差,功耗大,不可人为干预。而市场上闭环控制的照明系统投入资金大,稳定性差,无法在校园中得到推广。 校园智能路灯设计方案全文共33页,当前为第1页。设计目的 校园智能路灯设计方案全文共33页,当前为第1页。 了解NRF24L01的基本通信原理 掌握stm32f103芯片的AD转换原理 熟练掌握光敏电阻的应用 将本学年所学知识进行一次综合汇总 设计原理 系统的设计主要有以下四个模块部分:微控制器STM32,光敏电阻模块, LED照明电路.无线射频模块。 其中光敏电阻模块与LED照明电路组成检测照明部分,主要负责检测外界光的强度,人流高峰期会默认开启普通照明模式,夜间会默认开启节能模式。 微控制器STM32负责收集采集数据,以及AD转换,通过串口向PC机发送消息。 校园智能路灯设计方案全文共33页,当前为第2页。无线射频模块负责向主机传递信息,当从机照明电路出现错误时会触发射频模块发射数据,不同从机对应不同数据。发送完成结束传输。 校园智能路灯设计方案全文共33页,当前为第2页。 本设计的设计要求 (1).综合考虑选择是一主多从还是一从多主。 (2).硬件设计上应该考虑到滤波的重要性,结构尽量简单实用,易于实现,使系统电路尽量简单。 (3).软件设计必须要有完善的思路,要充分考虑到各种传感器和无线收发器的时序,做到程序简单,调试方便。 (4).通过软件设计尽量降低无线数据传输的误码率 2.主要硬件介绍 (1).NRF24L01无线模块简介 各管脚如下定义: 8.IRQ 7.MISO 6.MOSI 5.SCK 4.CSN 3.CE 2.VCC 1.GND 具体说明: 校园智能路灯设计方案全文共33页,当前为第3页。3.CE 芯片的模式控制线。在 CSN 为低的情况下,CE 协同NRF24L01 的CONFIG 寄存器共同决定NRF24L01 的状态(参照NRF24L01 的状态机)。 校园智能路灯设计方案全文共33页,当前为第3页。 4.CSN 为芯片的片选线 CSN 为低电平芯片工作 5.SCK 为芯片控制的时钟线(SPI时钟) 6.MOSI 为芯片控制数据线(Master output slave input) 主输出 从输入 7.MISO 芯片控制数据线 (Master input slave output)主输入 从输出 8.IRQ 中断信号引脚。中断时变为低电平,即NRF24L01内部发生中断IRQ 引脚从高电平变为低电平。引脚会在以下三种情况变低:Tx FIFO 发完并且收到ACK(使能ACK情况下)、Rx FIFO 收到数据、达到最大重发次数。 中断: nRF24L01中断引脚(IRQ)为低电平触发,当状态寄存器中TX_DS(数据发送完成中断位)、RX_DR(接收数据中断位) 或MAX_RT(达到最多次重发中断位)为高时触发中断。当MCU 给中断源写'1'时,中断引脚被禁止。可屏蔽中断可以被IRQ 中断屏蔽。通过设置可屏蔽中断位为高,则中断响应被禁止。默认状态下所有的中断源是被禁止的。 校园智能路灯设计方案全文共33页,当前为第4页。 校园智能路灯设计方案全文共33页,当前为第4页。 系统结构框图如下所示 检测照明部分检测照明部分检测照明部分 检测照明部分 检测照明部分 检测照明部分 STM32微控制器 STM32 微控制器 STM32微控制器STM32微控制器 STM32 微控制器 STM32 微控制器 ...... ...... NRF24L01发射或接收NRF24L01发射或接收NRF24L01发射或接收 NRF24L01发射或接收 NRF24L01发射或接收 NRF24L01发射或接收 校园智能路灯设计方案全文共33页,当前为第5页。 校园智能路灯设计方案全文共33页,当前为第5页。 NRF24L01通道 NRF24L01通道 五.设计原理 NRF24L01工作原理 发射数据时,首先将nRF24L01配置为发射模式:接着把接收节点地址TX_AD

3,846

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 无线
社区管理员
  • 无线
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧