在回答你的问题之前,我要反问几个问题。
一、你说的是发送一次数据包的长度还是完成一次完整通信的数据长度
二、如果你想的是改动数据包的长度,那好,你写一封信邮寄一张400字的方格纸出去,你为什么要去找能够自定义的方格纸比如347格的方格纸不觉的累么你知道电脑通信都是一个数据包一个数据包的发么,一个数据包是有固定的大小,哪怕你就是发一个1出去,也有可能是4kb的数据包(打个比方),你知道是为什么?
你问的这么不清,我回答起来也巨累,不过接下来还是回答问题了
如果是改动数据包的长度,将define 里的txpack 32(NRF的例程一般会设置数据包长32),找到他,把它改成unsigned char型或unsigned int型,写代码的时候弄成全局变量就可。
然后就是每一次更改数据包大小的发送,你必须重新初始化一次NRF,不然无法更改。
如果是一次完整通信的数据长度,这个就是你子写通信协议了。
我没有资料在 旁边,但我去年刚完成了一个nRF24L01
无线收发的项目,客户已验收
记得一点是这样写的,希望有帮助
#define tx sta^5 //位定义,状态寄存器的第5位
#define max sta^4
wtb(0xa0,mode);//向TX FIFO 写入一个值mode
ce=1;
for(n=43;n>0;n--);//进入接受模式130us,然后下面的是校验说明书上的STATUS内容
sta=wob(0xff); //读状态,wob函数 是write one byte,自己编的程序向24L01寄存器写1个命令
if(tx) //若状态寄存器的第5位 被置1
{
wtb(0x27,0xff); //些入1 清除标志位
wob(0xe1); //清除TX fifo
sta=wob(0xff); //再读一次STATUS,看tx是否被成功清零,成功清0就闪灯,tmp是一个临时 char型变量,前面已定义,
if(tx==0)
{
while(tmp--)
{led1=1;delay(20000);led1=0;delay(20000);} //灯闪烁的次数是为了测试程序是否成功用
}
}
nRF24L01在中断标志置位后,必须写1清零,不然可能死机
发送接收成功,硬件会自动清FIFO,不必手动清0 FIFO,希望有所帮助,
if(max) //达到最大重发次数,清中断标志,清FIFO
{
wtb(0x27,0xff);
wob(0xe1);
sta=wob(0xff);
}
SPI
CSN,SCK,MOSI,MISO :1-4引脚集成 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。 SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息外围设置FLASHRAM、网络控制器、LCD显示驱动器、MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。
1如果这个程序没有错误的话,那这句就是默认进行了字节到位的数据类型转换,当然你也可以不用这句来实现,实现的方法很多!
224L01在时钟上升沿写入,下降沿输出,读出的是状态寄存器的数值。建议看看英文的PDF
你的问题很奇怪噢。。你要测的是无线电还是想测MCU对nrF传输的信号?
如果你要测量MCU的数据到底有没有传到nRF里的话就要用就要用示波器,一只笔接地,一只笔接你要测量的端口,看看是否有波型。
如果你要测的是nRF有没有发出信号,那最好就是用频谱仪,你用仿真机进行调试,全速运行,让nRF不停的发数据,看看频谱仪上是否有信号波型,没有的话可能是你MCU传进nRF的数据没有传到,也可能是MCU与nRF之间有接触不良。
希望能给你点帮助
我用过nRF905,nRF24L01没用过。
当初也在这两者之间选择了一段时间,nRF905用起来更容易一些,距离比24L01远一些,器件比较好选,调试也容易一些。24L01的PCB天线比较容易做,905的PCB天线不太好做,如果你用外接天线,都差不多。
仅供参考。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)