本帖最后由 feiyinglala 于 2016-5-6 22:58 编辑
当前存在的问题是用51驱动nR接收STM32驱动nRF发送的数据过程中,51一直检测不到模块的IRQ引脚的中断,具体代码见2楼
STM32驱动nRF发送数据,51驱动nRF接收数据,都禁能了自动应答。NRF的IRQ引脚接51的外部中断0接口,目前就是无法检测到IRQ的中断进来。
*************分割线:以下为第一个问题的描述,已经解决,当前需要解决的是接收端,代码见2楼************************
我的第一个问题是程序运行依赖仿真器的问题,已经初步找到症结了。
这几天在用STM32F051驱动nRF24L01发送数据,现在遇到一个奇怪的问题。电路板连接仿真器仿真时候运行正常,但是拔掉仿真器就不正常了。
我在程序中用SPI口驱动24L01发送完数据后,读取nRF的STATUS寄存器,如果其中TX_DS标志为1,则熄灭LED1,主循环中一直点亮LED.
仿真状态:让程序一直跑,LED1会一直闪烁
电路板单独运行:LED1常亮,不闪烁
请问这是什么原因,如何排除故障。
void SPI_NRF_TX_DATAS(u8* TBuff,u16 ByteNUM)
{
u8 Status[1];
Status[0] = NRF_IRQ;//读取nRF设备的中断引脚的电平值
while(Status[0]) //如无中断触发则写数据
{
NRF_CE_LOW;
SPI_NRF_Write(SPI2,WR_TX_PLOAD,TBuff,ByteNUM); //发送数据
NRF_CE_HIGH;
Status[0] = NRF_IRQ;
}
NRF_CE_LOW;
Delay_ms(1);
SPI_NRF_Read(SPI2,nRF_READ_REG+STATUS,Status,1);//读取Status寄存器值
NRF_CE_HIGH;
if(Status[0]&TX_DS)
{
LED_Close(1);//熄灭LED1
Delay_ms(500);
Status[0] = 0xfe;
SPI_NRF_Write(SPI2,nRF_WRITE_REG+STATUS,Status,1); //清楚中断标志
}
SPI_NRF_Write(SPI2,FLUSH_TX,TBuff,0);
SPI_NRF_Read(SPI2,nRF_READ_REG+STATUS,Status,1);//读取Status寄存器值
}
以下为初始化代码 u8 TX_RX_ADDR[5]={0x34,0x43,0x10,0x10,0x01};
NRF_CE_LOW; //禁能设备
SPI_NRF_Write(SPI2,nRF_WRITE_REG + TX_ADDR,TX_RX_ADDR,5); //配置发送地址
SPI_NRF_Write(SPI2,nRF_WRITE_REG + RX_ADDR_P0,TX_RX_ADDR,5);//配置通道0地址
TX_Array[0]=0x00;
SPI_NRF_Write(SPI2,nRF_WRITE_REG + EN_AA, TX_Array, 1);//禁能自动应答
TX_Array[0]=0x00;
SPI_NRF_Write(SPI2,nRF_WRITE_REG + EN_RXADDR, TX_Array, 1); //禁能通道
TX_Array[0]=0x00;
SPI_NRF_Write(SPI2,nRF_WRITE_REG + SETUP_RETR, TX_Array, 1); //禁能自动重发
TX_Array[0]=40;
SPI_NRF_Write(SPI2,nRF_WRITE_REG + RF_CH, TX_Array, 1); //配置通信频率
TX_Array[0]=0x07;
SPI_NRF_Write(SPI2,nRF_WRITE_REG + RF_SETUP, TX_Array, 1); //配置发射功率
TX_Array[0]=0x0e;
SPI_NRF_Write(SPI2,nRF_WRITE_REG + CONFIG, TX_Array, 1); // 主发送功能,设备上电
TX_Array[0]=0xfe; //1111 xxxx STATUS
SPI_NRF_Write(SPI2,nRF_WRITE_REG+STATUS,TX_Array,1);
NRF_CE_HIGH; //CE=1 使能设备
Delay_ms(1); //延时
找到问题在哪里了,原来是systick函数中,us和ms延时函数的定义影响到了,但具体怎么导致这个问题的,我也解释不了systick的配置SysTick_Config(SystemCoreClock/1000)
运行正常的配置
void Delay_ms(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void Delay_us(uint16_t x)
{
Delay_ms(1);
}
之前的程序中,ms同上,us延时的定义如下
void Delay_us(uint16_t x)
{
TimingDelay = 1;
while(TimingDelay!=0);
}
说明:芯片是STM32F051R8 系统:win7 64位 开发环境:uVersion V5.11
下载器:J-LINK (USB口连到电脑,然后通过SWD连接电路板)
|
|