新手上路
- 积分
- 41
- 金钱
- 41
- 注册时间
- 2015-11-13
- 在线时间
- 0 小时
|
5金钱
打算一块探索者STM32F4+2块NRF24L01自发自收,应该是可以实现的吧?只将PG10(FSMC_NE3)拉高了(关掉了SRAM),不知道还有没有其他冲突。现在两个NRF都可以Check(两个Check当然是分开的了)通过,发送端的NRF可以发,但是接收端的NRF就是收不到。<br />
<br />
先说一下现在的情况:<br />
硬件:<br />
①一块探索者STM32F4<br />
②两块NRF24L01模块(找别人试过可以收发)<br />
<br />
连接:<br />
①一块NRF(后称TX_NRF)插开发板的专用接口,作发送<br />
②一块NRF(后称RX_NRF)作接收,用杜邦线将模块与IO口连接起来,连接如下:<br />
1.PG3作IRQ,PG5作CSN,PG7作CE<br />
2.使用PC10~12复用为SPI3<br />
<br />
查了开发板的专用接口的原理图和PCB板图,知道了NRF模块每个脚的功能,所以<span>RX_NRF的连接如下:<br />
</span><br />
<br />
<br />
软件:<br />
①复制原子大哥的24l01.c为RX_NRF24L01.c。里面的RX_NRF24L01_Init负责初始化RX_NRF。<br />
②<span>24l01.c的<span>NRF24L01_Init改名为TX_<span>NRF24L01_Init</span></span>。另外还取消了SPI1_Init函数,直接<span>在</span><span>_NRF24L01_Init</span>里一次过初始化完。<br />
③所有IO的速度都调低为25MHz,SPI预分频值设置为SPI_BaudRatePrescaler_8<br />
④在spi.h和spi.c里增加SPI3_ReadWriteByte函数的声明和定义<br />
⑤main.c去掉了led.h和key.h的使用,并删除了<span>全部</span>led和key的应用代码<br />
<br />
main函数(部分,所有省略号的注释都是省略了代码):<br />
</span><span>
<div style="background-color:#E8E8E8;">
[mw_shl_code=c,true]int main(void)
{
// ……这部分代码先省略了
TX_NRF24L01_Init(); //初始化NRF24L01
RX_NRF24L01_Init(); //初始化NRF24L01
POINT_COLOR=RED; //设置字体为红色
while(TX_NRF24L01_Check())
{
// ……这部分代码先省略了
}
delay_ms(400);
while(RX_NRF24L01_Check())
{
// ……这部分代码先省略了
}
// 初始化mode=0,进入发送模式
mode = 0;
// 生成要发送的字符串
// ……这部分代码先省略了
// 发送端初始化为发送状态
TX_NRF24L01_TX_Mode();
// 接收端初始化为接收状态
RX_NRF24L01_RX_Mode();
while(1)
{
if(mode==0)//TX模式
{
// ...
while(1)
{
if(TX_NRF24L01_TxPacket(tmp_buf)==TX_OK)
{
//……
mode = 1; // 发送成功改变模式
break;
}else
{
LCD_Fill(0,110,lcddev.width,170+16*3,WHITE);//清空显示
LCD_ShowString(30,110,lcddev.width-1,32,16,"Send Failed");
};
delay_ms(500);
}
}
else//RX模式
{
LCD_ShowString(30,170,200,16,16,"RX_Mode");
while(1)
{
if(RX_NRF24L01_RxPacket(tmp_buf)==0) //一旦接收到信息,则显示出来.
{
//……
//mode = 0; // 读取成功就改变模式
break;
}else
{
//……
mode = 0; // 读取失败就改变模式
break;
}
}
}
}
}[/mw_shl_code]
</div>
完整的代码在附件,要重新生成哦(为了减少体积把OBJ里面的都删了)<br />
原子大神,拜托了,能看看吗?有空的话还可以自己拿两个模块搭来试试,看看我的代码到底为什么收不到呢?</span> |
|