完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
无线调试必须两个模块,因为你要设置一样的频率,一块的话不知道你有没有带天线的示波器,用示波器看也行!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
回复【4楼】发烧友:
-------------------------------- 用stm8s208cb的内部SPI,寄存器操作,弄了两三天了,崩溃了!!!!能检测NRF24L01模块成功,但是就是收发不了数据。 |
|
|
|
|
|
#include "stm8s208cb.h" #include "lcd12864.h" _Bool CSN @PC_ODR:1; //片选信号,推挽输出 _Bool IRQ @PC_IDR:2; //IRQ主机数据输入,上拉输入 _Bool CE @PC_ODR:3; //发送/接收模式选择?仆焓涑? _Bool SCK @PC_ODR:5; //PC5 推完输出 _Bool MOSI @PC_ODR:6; //PC6 MOSI 主机推挽输出 (根据速率初始化PC_CR2寄存器) _Bool MISO @PC_IDR:7; //PC7 SCK 主机不带中断的悬浮输入 unsigned char TxAddr[]={0xE7,0xE7,0xE7,0xE7,0xE7};//发送地址 unsigned char RxAddr[]={0xE7,0xE7,0xE7,0xE7,0xE7};//接收偷刂? unsigned char tx_buf[]="send data"; void CLK_Init(void) { CLK_CKDIVR = 0x01; CLK_SWCR |= 0x02; //启动时钟切换使能 CLK_SWR = 0xB4; // //配置系统主时钟为外部时钟,准备时钟自动切换 while(!(CLK_SWCR & 0x08)); //等待SWIF置位,表示时钟切换完毕,新时钟代替原时钟 if (CLK_CMSR != 0xB4) while(1); //校验时钟是否切换 CLK_ICKR = 0x00; //关闭内部时钟HSI CLK_CSSR |= 0x01; //开启时钟安全系统:即外部晶振发生意外故障可转换到内部时钟16M } void delayms(unsigned int z) { unsigned int i,j; for(i=z;i>0;i--) for(j=325;j>0;j--); } void SPI_GPIO_Init(void) { //0110 1010 0000 1010 } void nRF24L01_Pin_Conf(void) { SPI_CR1 =0x0c; // 【5:3】24M/4=6M; MSB 先;主设备;CPOL = 0;CPHA= 0 SPI_CR2 =0x03; // 双线全双工;软件管理;无CRC SPI_CR1|=0x40; // 开启SPI总线 } unsigned char nRF24L01_SPI_RW(unsigned char data) { unsigned char temp; while (!(SPI_SR&0X02)); SPI_DR = data; while (!(SPI_SR&0X01)); temp = SPI_DR; return temp; } unsigned char nRF24L01_Read_Reg(unsigned char RegAddr) { unsigned char BackData; CSN = 0;//启动时序 nRF24L01_SPI_RW(RegAddr); /* 写寄存器地址 */ BackData = nRF24L01_SPI_RW(0); /* 写入读寄存器指令 */ CSN = 1; return BackData; } unsigned char nRF24L01_Write_Reg(unsigned char RegAddr,unsigned char data) { unsigned char BackData; CSN = 0; /* 启动时序 */ BackData = nRF24L01_SPI_RW(RegAddr); /* 写入地址 */ nRF24L01_SPI_RW(data); /* 写入值 */ CSN = 0; return(BackData); } unsigned char nRF24L01_Read_RxData(unsigned char RegAddr,unsigned char *RxData,unsigned char DataLen) { unsigned char BackData,i; CSN = 0; BackData = nRF24L01_SPI_RW(RegAddr); /* 写入要读取的寄存器地址 */ for(i = 0; i < DataLen; i++) /* 读取数据 */ { RxData = nRF24L01_SPI_RW(0); } CSN = 1; return(BackData); } unsigned char nRF24L01_Write_TxData(unsigned char RegAddr,unsigned char *TxData,unsigned char DataLen) { unsigned char BackData,i; CSN = 0; BackData = nRF24L01_SPI_RW(RegAddr); /* 写入要写入寄存器的地址 */ for(i = 0; i < DataLen; i++) /* 写入数据 */ { nRF24L01_SPI_RW(*TxData++); } CSN = 1; return(BackData); } unsigned char NRF24L01_TxPacket(void) { unsigned char sta; while(!(sta&0x20)) { sta=nRF24L01_SPI_RW(0x07); } CE=0; nRF24L01_Write_Reg(0x20+0x07,0XFF); //清除TX_DS或MAX_RT中断标志 CSN =0 ; nRF24L01_SPI_RW(0XE1);//清除TX FIFO寄存器 CSN =1; L12864_string(4,0,"nima"); } void nRF24L01_Set_TxMode(void) { CE = 0; nRF24L01_Write_TxData(0x20+0x10,TxAddr,5); /* 为了应答接收设备,接收通道0地址和发送地址相同 */ nRF24L01_Write_TxData(0x20+0x0a,RxAddr,5); nRF24L01_Write_TxData(0xa0,tx_buf,32); nRF24L01_Write_Reg(0x20+0x01,0x00); //配置自动应答 nRF24L01_Write_Reg(0x20+0x02,0x00); //使能接收通道0 nRF24L01_Write_Reg(0x20+0x04,0x0a);//建立自动重发250us+86us,自动重发10次 nRF24L01_Write_Reg(0x40+0x05,0x40);//选择射频通道0x40 nRF24L01_Write_Reg(0x20+0x06,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 nRF24L01_Write_Reg(0x20+0x11,32); nRF24L01_Write_Reg(0x20+0x00,0x0e); // CRC使能,16位CRC校验,上电 CE = 1; } unsigned char NRF24L01_Check(void) { unsigned char buf[5]={0XA5,0xa5,0XA5,0XA5,0XA5}; unsigned char bu1[5]; unsigned char i; nRF24L01_Write_TxData(0x30,buf,5);//写入5个字节的地址. nRF24L01_Read_RxData(0x10,bu1,5); //读出写入的地址 for(i=0;i<5;i++)if(bu1!=0XA5)break; if(i!=5)return 1;//检测24L01错误 else return 0; //检测到24L01 } main() { CLK_Init(); LCD12864_GPIO_INIT(); lcd12864_Init(); SPI_GPIO_Init(); nRF24L01_Pin_Conf(); while(NRF24L01_Check())//检测不到24L01//返回值为零:成功 { L12864_string(1,0,"Check Failed!"); delayms(800); L12864_string(1,0,"lease Check!"); delayms(800); } CLE_Screen(); L12864_string(1,0,"Check OK"); ///////////////////////////////////////////////////////////////////////////////// while (1) { nRF24L01_Set_TxMode(); NRF24L01_TxPacket(); } }
|
|
|
|
|
|
|
|
|
|
|
|
另外我分了压,给无线模块供电大概为3.3V左右。。。
|
|
|
|
|
|
我发送了一个数据,我只要能知道发出去了就行了。所以在NRF24L01_TxPacket()函数里面弄了一个输出标志: L12864_string(4,0,"nima"); |
|
|
|
|
|
自动ACK是要两块无线模块才可以吧,不然没应答的。所以尝试了设置自动应答和不自动应答的;nRF24L01_Write_Reg(0x20+0x01,0x00); //配置自动应答 nRF24L01_Write_Reg(0x20+0x02,0x00); //使能接收通道0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
929 浏览 0 评论
如何使用STM32+nrf24l01架构把有线USB设备无线化?
3089 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2989 浏览 5 评论
3851 浏览 3 评论
3313 浏览 8 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
1270浏览 1评论
1215浏览 0评论
886浏览 0评论
975浏览 0评论
929浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 17:12 , Processed in 1.401869 second(s), Total 109, Slave 90 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1866