历史上的今天
今天是:2025年02月15日(星期六)
2020年02月15日 | 超小型的无线收发模块LT8920配置思路+单片机发射接收程序
2020-02-15 来源:51hei
近来一直在研究无线项目,其中的重点就是无线收发芯片,可以正常的发送接收数据了,无线项目的大难题也就解决了。于是开始收集各种无线收发芯片的资料,例如NRF24L01,CC1101,一些LoRa模块还有一些超外差无线模块等等,但是他们有着相同的问题,一是例如NRF24L01和CC1101之类的使用QFN封装的模块在自制上存在焊接困难度的问题,再就是这些模块普遍都有着过于繁杂的外围电路(一些电感电容),无法将其做到很小的体积。于是在查阅了很多资料后,有一款小巧的无线模块进入我的眼帘,就是LT8920。
先不谈他的各项参数指标相对其他模块有什么优劣,光是这个采用了SSOP16的引脚封装就使得其焊接容易了许多。并且其简洁的外围电路着实易于制作,只需要一个晶振一个电容即可,这确实在焊接难度和外围电路成本上秒杀其他芯片。于是我开始对这个芯片进行了学习,希望可以使用它做出一些项目。调试起来还是废了一番周折,因为厂家给出的数据手册并不清楚,所以很多东西都是摸着石头过河,在前前后后调试了大概3天左右,终于可以正常的收发数据,下面我就分享一些学习的过程。
拿到一个新的芯片,想要了解他就一定要去下载数据手册,一般在网上都可以找到,有中文的有英文的,遇到英文的数据手册就需要具备一定的英语阅读能力才可以理解清楚意思。这个芯片的数据手册我也会放到文章的最后,大家可以下载来学习。
1.基本介绍
这款芯片使用的是2.4G频段进行通信,可以设置通信频率,发射速率以及发射功率,电源使用2.2V到3.6V的电压都可以,发射时电流在20毫安左右,接受电流在18毫安左右,可以说比较省电的一款芯片。芯片内置倍频电路,但是没有内置晶振,所以需要外接一颗12Mhz的晶振,晶振的补偿电容芯片已经内置了,所以无需外接。对于芯片与MCU的通信方面,使用的是SPI总线协议,最高支持10Mhz的速度。为了更好的兼容一些低速的MCU,这款芯片内置FIFO缓存器。
如下图给出了典型应用电路:
2.通信代码编写
看完了这些参数,我对这款芯片也有了一些了解,下面要做的就是编写程序进行通信了。我使用的是STC8单片机来对这个芯片进行控制,由于模块采用的是4线的SPI总线通信,尽管一些STC的单片机上带有硬件的SPI总线接口,但是为了程序的可移植性,整个程序使用软件模拟SPI总线协议来进行与LT8920的通信。
既然是使用SPI通信,那么肯定数据手册里面就有一些关于通信时序的说明,我在数据手册里面找到如下:
可以看到芯片是在时钟的下降沿读取MOSI线上的数据和在MISO线上发送数据,并且先发送高位,再发送低位。并且可以看出一次需要读取2字节(16位)的数据,看完这个时序图,我就很容易的写出了SPI接口的写入函数。
对于从LT8920上读取寄存器数据,需要注意的一点是每次SPI通信的地址最高位是读写标志位,写入的时候是0,读取的时候是1,所以在SPI读取函数中,所有的地址都需要加0x80,如图:
写完这两个函数之后,寄存器的配置就可以使用这两个函数了,但是我注意到手册中说到,对于FIFO寄存器(就是存储发射和接受数据的寄存器),可以采用单字节读取或者写入,那么我就又写了两个函数,一次读取和写入分别都是单字节的,如图:
写完这两个函数,基本的SPI通信就没问题了,下面我就开始对LT8920的寄存器进行逐一的了解与设置,这耗费了较多的时间。
3.寄存器设置与初始化
对于在LT8920中的寄存器,其地址和其寄存器的编号相同,这就给了编写代码时的便利性,需要操作那个寄存器只需要知道其的编号即可,在LT8920中,一共有近50多个寄存器,对这些寄存器的逐个配置,就可以使用LT8920来收发数据了。但是遗憾的是,手册中并没有逐个逐个说明寄存器的作用,而是只说明了几个重要的寄存器的作用以及配置,但是在手册最后给出了所有寄存器的推荐配置值,于是我参考了手册最后的推荐值以及一些网络上的调试经验,给出了每个寄存器的初值,如图:
可以看出,上电之后先给LT8920进行复位,然后延时5ms,等待晶振输出频率稳定之后就可以开始初始化端口了,我默认使用的都是准双向口,所以将端口设置为1的时候也是作为输入模式。下面是LT8920的初始化时序:
4.接受数据程序
初始化完毕之后就可以开始发送接收数据了,这个芯片有一个外置引脚PKT来指示芯片的FIFO缓存中是否有数据,当有数据的时候,整个外置引脚会被置1,没有的时候则会被置0。所以在编写接受数据的程序时,我只需要不停地判断这个引脚是不是高电平,如果是,那么就进入处理函数,不是就不进入。
对于从LT8920的FIFO中读取接受到的数据,其第一字节表示的是整个数据的长度,单位是字节,所以我在从LT8920的FIFO中读取数据时,先读取一个字节,那么这个字节表示的就是整个数据的长度。具体实现的程序如下:
5.发射数据程序
Lt8920的发射其实也比较简单,向FIFO中写入数据,然后打开发射器等待发射完成(PKT置1),之后读取自动应答寄存器,如果收到应答的话,就代表一次通信成功,实现的代码如下:
发射程序和接受程序都介绍完毕,如果您是使用的其他单片机,如stm32或者arduino,应该整体的配置思路我都讲解的比较清晰,也比较容易就调试好这款模块。
史海拾趣
|
我写了个测试程序测试我RIL的打电话,发短信和电话本功能。 用Line函数写的电话测试程序可以打电话,但Connection和Disconnect状态收不到。 奇怪的是,用SimInitialize函数写的SIM测试部分,初始化的时候就找不到SIM卡(错误:SIM_E_NOSIM)。用S ...… 查看全部问答> |
|
现有多本有关主板、硬盘或者显示器维修方面的图书需要编写,要求作者对主板、硬盘或者显示器维修的原理和实际操作比较精通。 (1)有兼职时间 (2)有实际工作经验 (3)无诚意者勿扰 有意者请将姓名和联系方式发到本人邮箱yzbook@sina.com,作者一定 ...… 查看全部问答> |
|
有一个设备,系统是WINCE4.2,请问各位用VISUTAL STUDIO 2005能开发吗,用2003呢?除了IDE环境之外还需要安装别的什么工具,谢谢了 … 查看全部问答> |
|
如果用PIC的内部晶体的话,,那那两个专门接外部晶体的管脚 1.. 可以做普通IO使用 2。这两个口只能接外部晶体的作用 ,不外接晶体的时候只能空着 选1还是选2,,,哪个内行先辈帮忙 选一。。。1还是2对?? ...… 查看全部问答> |
|
看c6000的EDMA手册,有两个概念:frame和array 按照手册的英文原文: a frame can have staggered or contiguous element. 翻译成中文,似乎应该是:一个帧可以有连续的element构成。 a group of contiguous elements comprise an array. 翻 ...… 查看全部问答> |
|
快过年了,有些人也走了,公司显得有点冷清。 仔细看过去,研发人员还是一直的忙碌,生产维护的也在埋头苦干,那么那些、财务、行政等后勤人员,都在干什么呢?按理说年底,他们的事情很少,那他们来上班,都在干什么事情?若没事情,还不如让他 ...… 查看全部问答> |




