初学者,学校给了模拟任务是做一个能主机从机通信的温度预警仪,这几天在一直调试 NRF24L01模块,
用的是MINI板,代码初始化部分是用原子的例程,用的初始化比较多,但是各个模块不冲突,SD卡怕影响无线通信注释掉了。
现在的问题是,1.板子平时处于接收状态,但是数据发过来接收不了,进不去if(NRF24L01_RxPacket(tmp_buf)==0);2.数据能发过去,但是发过去只会执行if(NRF24L01_TxPacket(tmp_buf)==TX_OK),不会进IF语句里,会return 0xff。以下是NRF24L01_TxPacket(tmp_buf)函数
[mw_shl_code=c,true]//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
SPI1_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节 (指令,数据,宽度(字节))
NRF24L01_CE=1;//启动发送
while(NRF24L01_IRQ!=0);//等待发送完成
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&MAX_TX)//达到最大重发次数
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
return MAX_TX;
}
if(sta&TX_OK)//发送完成
{
return TX_OK;
}
return 0xff;//其他原因发送失败
}[/mw_shl_code]
各位大神帮忙看一下以下代码有什么问题,
1.有什么方法能稳定的让主从机平时处于接收状态,需要发数据时候(手动发送,隔一段时间发送一次)切换成发送模式,发完回到接收状态。
2.可以的话贴一下代码演示一下,谢谢!
PS:如果代码里只有发送或接收是没问题的,一篇代码如果发送接收都在就会出问题。原子的无线通信例程也可以实现发送接收。
代码如下
[mw_shl_code=c,true]#include "stdio.h"
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "remote.h"
#include "ds18b20.h"
#include "timer.h"
#include "usmart.h"
#include "24l01.h"
extern int sec,second;
extern int temperature,oC;
#include "malloc.h"
#include "MMC_SD.h"
#include "ff.h"
#include "exfuns.h"
#include "rtc.h"
FIL fil;
FRESULT res;
UINT bww;
u8 buf[10];
u8 Tmf_buf[33];
u8 tmp_buf[33];
int oC;
int Temperature;
GPIO_InitTypeDef GPIO_InitStructure;
void Temperature_LCD_USART();//温度数据显示(LCD,USART)
int main(void)
{
u8 key,mode;
int flag;
u8 t=0;
u8 *str=0;
delay_init(); //延时函数初始?
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init();
RTC_Init();
Remote_Init(); //红外接收初始化
//usmart_dev.init(72);
// mem_init(); //初始化内存池
TIM3_Int_Init(9999,7199);//10Khz的计数频率,计数到5000为500ms
//exfuns_init(); //为fatfs相关变量申请内存
//f_mount(fs[0],"0:",1); //挂载SD卡
//f_mount(fs[1],"1:",1); //挂载FLASH.
NRF24L01_Init(); //初始化NRF24L01
LCD_LED = 0;//LCD熄屏
POINT_COLOR=BLUE;//设置字体为红 {MOD}
temperature=DS18B20_Get_Temp(); //获取温度
LCD_ShowNum(100+330,775,temperature/10,2,24); //显示正数部分
LCD_ShowChar(100+330+24,775,'.',24,0);
LCD_ShowNum(100+330+34,775,temperature%10,1,24); //显示小数部分
LCD_ShowString(60,742,200,16,16," - - ");
LCD_ShowString(60,775,200,16,16," : : ");
while(1)
{
key=Remote_Scan();
if(mode == 0)
{
NRF24L01_RX_Mode();
if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
{
LCD_ShowString(60,250,200,16,16,"NRF24L01 RX_Mode");
LCD_ShowString(60,270,200,16,16,"Received DATA:");
if(tmp_buf[0] == 0xaa)
LCD_ShowString(16,320,200,16,16,"0xaa");
tmp_buf[0] = 0;
tmp_buf[1] = 1;
tmp_buf[32]=0;//加入字符串结束符
}
}
if(t!=calendar.sec)//时间显示
{
POINT_COLOR = BLACK;//设置字体为红 {MOD}
t=calendar.sec;
LCD_ShowNum(60,742,calendar.w_year,4,16);
LCD_ShowNum(100,742,calendar.w_month,2,16);
LCD_ShowNum(124,742,calendar.w_date,2,16);
LCD_ShowNum(60,775,calendar.hour,2,16);
LCD_ShowNum(84,775,calendar.min,2,16);
LCD_ShowNum(108,775,calendar.sec,2,16);
}
if(sec == 60 && LCD_LED == 1)//熄灭LCD
{
LCD_LED = 0;//LCD熄屏
sec = 0;
}
NRF24L01_RX_Mode();
if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
{
tmp_buf[32]=0;//加入字符串结束符
LCD_ShowString(0,190,239,32,16,tmp_buf);
}
if(second >=10)//10秒更新一次温度,发送心跳
{
LCD_ShowString(60,350,200,16,16,"NRF24L01 TX_Mode");
NRF24L01_TX_Mode();
tmp_buf[1] = 0xaa;
tmp_buf[2] = 0x02;
tmp_buf[3] = 0x01;
tmp_buf[4] = Temperature/10;
tmp_buf[5] = Temperature%10;
tmp_buf[6] = 0x55;
if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
{
LCD_ShowString(60,370,239,32,16,"Sended DATA:");
LCD_ShowNum(0,390,Temperature/10,2,16); //显示正数部分
LCD_ShowChar(16,390,'.',16,0);
LCD_ShowNum(24,390,Temperature%10,1,16); //显示小数部分
tmp_buf[32]=0;//加入结束符
second = 0;
NRF24L01_Init(); //初始化NRF24L01
}else
{
LCD_ShowString(60,370,239,32,16,"Send Failed ");
LCD_Fill(0,370,340,218,WHITE);//清空上面的显示
};
}
if(key)
{
switch(key)
{
// case 0:str="ERROR";break;
// case 162:str="POWER";break;
// case 98:str="UP";break;
case 2:str="PLAY";break;
// case 226:str="ALIENTEK";break;
// case 194:str="RIGHT";break;
// case 34:str="LEFT";break;
// case 224:str="VOL-";break;
// case 168:str="DOWN";break;
// case 144:str="VOL+";break;
// case 104:str="1";break;
// case 152:str="TX";break;
// case 176:str="3";break;
// case 48:str="4";break;
// case 24:str="5";break;
// case 122:str="6";break;
// case 16:str="7";break;
// case 56:str="8";break;
// case 90:str="9";break;
// case 66:str="0";break;
// case 82:str="DELETE";break;
default:str = "ERROR";
}
if(str == "PLAY")
{
LCD_LED=1;//开启背光
sec = 0;
LCD_ShowString(60,50,200,24,24,"Mini STM32");
LCD_ShowString(60,80,200,24,24,"IL-24");
LCD_ShowString(60,110,200,24,24,"2018/12/24");
LCD_ShowString(60,140,200,24,24,"KEYVAL:");
LCD_ShowString(60,170,200,24,24,"SYMBOL:");
LED1 =!LED1;delay_ms(50);LED1 =!LED1;
LCD_ShowNum(144,140,key,3,24); //显示键值
}
LCD_Fill(144,70,144+12*12,170+24,WHITE); //清楚之前的显示
LCD_ShowString(144,70,200,24,24,str); //显示SYMBOL
}
}
}
[/mw_shl_code]
那么你切换状态有没规定好协议,比如主机平时接收,突然转为发送状态。
而你从机这时候是什么状态?
一周热门 更多>