LoRa---sx1278的FIFO工作流程和应用注意事项
单开一篇,介绍sx1278的FIFO工作流程和应用设置,分析下出的一些小问题,毕竟也困扰了我几天。亦或是我比较愚钝。总之,记下来吧!
/******************************************************************************************************************************************************************************/
SX1278的FIFO介绍:
先贴一段datasheet的定义: SX1276/77/78配备了256字节的RAM数据缓存,该缓存仅能通过LoRa模式进行访问。 RAM区(以下称为“FIFO数据缓存”)可以完全由用户定制,用于访问接收的或发送的数据。LoRaTMFIFO数据缓存只能通过SPI接口访问。
这些FIFO数据缓存保存与最后接收操作相关的数据,除睡眠模式之外,在其他操作模式下 均可读。在切换到新的接收模式时,它会自动清除旧内容。
这段介绍是说,在睡眠模式下,会清空FIFO数据缓存区的数据。在其他模式都是可以读的。另外,在datasheet的其他地方有提到,FIFO数据缓存区仅在待机模式可写。
话不多说,先贴张图:

这张图可以说是很详细,一眼看过去就全清楚了。首先,在LoRa模式下,SX1278芯片接收到的数据和要发送的数据,都是存放在这个256byte的FIFO数据缓冲区中,其次,发送缓存区指针RegFifoTxBaseAddr 和接受缓冲区指针RegFifoRxBaseAddr
分别指向缓冲区的某一个位置,这个位置可以由用户自己设置,即要用多大的空间由用户自己说了算,如果一次性收发的数据量很大(小于256byte),可以把整个FIFO缓冲区当作接收或者发送缓冲区,是不是很棒呢。官方原话是这么说的(FIFO数据缓存拥有双端口配置,因此可以在缓存内同时存储将要发送和接收的信息。寄存器RegFifoTxBaseAddr明确规定了存储将要发送信息的起始位置。同样的,针对接收操作,寄存器RegFifoRxBaseAddr也显示了接收操作中写入缓存的起始位置。)
两个基地址RegFifoTxBaseAddr 和RegFifoRxBaseAddr 默认值是0x80和0x00,即各128byte。
再看一遍图,发现还有两个指针RegFifoRxCurrentAddr 和 RegFifoAddrPtr 。下面着重讲这两个指针(为什么?因为官方讲的太隐晦了,导致我只能猜,然后找证据):
RegFifoRxCurrentAddr 用于连续接受模式,图中它也指向接收缓冲区FIFO,作用是记录本次接收数据的起始地址,用户在这个地方开始读取本次接受到的数据。--------为什么要用这货(RegFifoRxCurrentAddr)?由于连续接受模式,新数据包的第一个字节会在上一个数据包的最后一个字节之后立即写入,这个时候,接受指针(RegFifoRxByteAddr就是这货)已经随着接收到的数据,在FIFO中移动到了数据地址的最尾端,如果要读取RegFifoRxBaseAddr处的数据,是读不到的,因为这个地址后面没有数据,RegFifoRxCurrentAddr实质上是保存的上一个数据接受完成后RegFifoRxBaseAddr的地址值,即本次接收数据的起始地址。(应该说清楚了吧?没说清楚?下面补充!)。
RegFifoAddrPtr用于用户读取FIFO中的数据,它指向FIFO的哪里,便从哪里开始读,读多少数据也是用户自己来定。--------那读多少数据呢?在显式报头的情况下,收到的数据包中包含了本次有效数据的长度(RegRxNbBytes ),在取得数据前,可以先获得本次数据的长度,这样就可以读出这次发送的全部数据了。
由于datasheet关于指针的描述很隐晦,这里进行说明和举证:
Q1、datasheet中的接收指针(The RX modem address pointer )是啥?
A1:接收指针是这货RegFifoRxByteAddr,上面已经提到了这点,那为什么是这货,举证:
datasheet描述:可以手动将RegFifoAddrPtr设置为RegFifoRxByteAddr减去RegRxNbBytes的值,使该指针从当前数据包开始,一直指向最后接收的数据包的存储位置。可以通过RegRxNbBytes次读取寄存器RegFifo中的地址,以提取数据包的有效负载字节。(英文:it is possible to manually point to the location of the last packet received, from the start of the currentpacket, by setting RegFifoAddrPtr to RegFifoRxByteAddr minus RegRxNbBytes. The payload bytes can then be read from the FIFO by reading the RegFifo address RegRxNbBytes times. )
这句话的意思是在连续接受模式读取FIFO中数据的另外一种方式:用RegFifoRxCurrentAddr = RegFifoRxByteAddr - RegRxNbBytes。这就说明了接收指针就是RegFifoRxByteAddr,接收数据前,它被用户指定指向FIFO中的某一个地址(缺省值为0x00),接收到数据后,它会指向接受到的数据的末尾地址。
Q2、单次接收模式下,一次接收数据结束后,RegFifoRxByteAddr会重置为基地址0x00(或者用户设定的某一个地址)吗?
A2、会,datasheet中有单次接收流程:用户从FIFO的基地址0x00处(如果你把基地址设置为其他值,则从你设置的值处)开始读取数据,一次读取数据结束,下次读取时,需要将再次从基地址0x00处(如果你把基地址设置为其他值,则从你设置的值处)读取,那么就是说完成每次的单次接收后,都会RegFifoRxByteAddr都会重置。(datasheet没有说明,就只能这样猜测了,没有直接证据)
Q3、连续接收模式下,需要判断接收缓冲区满的情况吗?
A3、需要的,datasheet中也明确说明:关联微控制器MCU必须对地址指针进行处理,以保证FIFO数据缓存不会溢出。这种情况下,就要视情况来对接收指针RegFifoRxByteAddr进行设置,只要在FIFO没有满的情况下,将接收指针RegFifoRxByteAddr指向基地址就行,当然,RegFifoRxCurrentAddr也要同时指向基地址。
补充一下,MCU通过SPI读取接受到的数据是发送寄存器RegFifo地址(0x00)来读取寄存器中的值。
LoRa---sx1278的FIFO工作流程和应用注意事项的更多相关文章
- [Servlet]Servlet工作流程及注意事项
Servlet工作过程 采用Servlet完成Web实际的工作流应用程序是通过Tomcatserver公布服务,client与server遵循的端部之间的相互作用Http议完毕的. 详细工作流程例如以 ...
- MapReduce工作流程及Shuffle原理概述
引言: 虽然MapReduce计算框架简化了分布式程序设计,将所有的并行程序均需要关注的设计细节抽象成公共模块并交由系统实现,用户只需关注自己的应用程序的逻辑实现,提高了开发效率,但是开发如果对Map ...
- Mybatis工作流程及其原理与解析
Mybatis简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBat ...
- Android 12(S) 图形显示系统 - BufferQueue的工作流程(八)
题外话 最近总有一个感觉:在不断学习中,越发的感觉自己的无知,自己是不是要从"愚昧之巅"掉到"绝望之谷"了,哈哈哈 邓宁-克鲁格效应 一.前言 前面的文章中已经 ...
- struts2工作流程
struts2的框架结构图 工作流程 1.客户端请求一个HttpServletRequest的请求,如在浏览器中输入http://localhost: 8080/bookcode/Reg.action ...
- SecondaryNameNode的工作流程
SecondaryNameNode是用来合并fsimage和edits文件来更新NameNode和metadata的. 其工作流程为: 1.secondary通知namenode切换edits文件 2 ...
- Storm 中什么是-acker,acker工作流程介绍
概述 我们知道storm一个很重要的特性是它能够保证你发出的每条消息都会被完整处理, 完整处理的意思是指: 一个tuple被完全处理的意思是: 这个tuple以及由这个tuple所导致的所有的tupl ...
- gitlab工作流程简介
gitlab工作流程简介 新建项目流程 创建/导入项目 可以选择导入github.bitbucket项目,也可以新建空白项目,还可以从SVN导入项目 建议选择private等级 初始化项目 1.本地克 ...
- Git 工作流程
Git 作为一个源码管理系统,不可避免涉及到多人协作. 协作必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去.”工作流程”在英语里,叫做”workflow”或者”flow”,原意 ...
随机推荐
- iOS 开发之环形倒计时进度条(虚线/实线)
代码很简单,一看便知.这里为顺时针,若想要逆时针,clockwise改为0,还需更改起始角度和终点角度. 源码地址:https://github.com/LfyDragon/CountDown 直接上 ...
- centos7 下安装 nginx-1.12.2
官网地址:http://nginx.org/2017.html 转载:https://blog.csdn.net/harris135/article/details/78576263 1.环境: ce ...
- 记一次Linux下数据统计
需求: 服务端有应用访问日志,需要统计某一个API,访问top N的通道. 统计思路: 1.筛选/过滤待统计API: 2.分割,获取待统计具体字段: 3.计数: 4.按照计数结果降序排序: 5.截取t ...
- Oracle EBS OPM 查询现有量
--查询现有量 --created by jenrry DECLARE p_inventory_item_id NUMBER := 231652; --NOT NULL p_organization_ ...
- SQL Server中数据库文件的存放方式,文件和文件组 (转载)
简介 在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SERVER通过管理逻辑上的文件组的方式来管理文件.理解文件和文 ...
- python设计模式之门面模式
一.结构型设计模式 门面模式与单例模式,工厂模式不同,它是一种结构型模式. 结构型模式描述如何将对象和类组合成更大的结构 结构型模式是一种能够简化设计工作的模式,它能找出更简单的方法来认识或表示实体之 ...
- Hadoop HBase概念学习系列之HBase里的客户端和HBase集群建立连接(详细)(十四)
需要遵循以下步骤: 1.客户端和Zookeeper集群建立连接.在这之前客户端需要获得一些信息(可以从HBase配置文件中读取或是直接指定).客户端从Zookeeper集群中读取-ROOT-表的位置信 ...
- Alpha课堂展示(麻瓜制造者)
目录 成员简介 演示动态图 预期用户量 演示动态图 目标用户视频 分工协作 项目管理 质量控制 团队角色与具体贡献 用户反馈 成员简介 刘双玉 http://www.cnblogs.com/liu42 ...
- 【2017下集美大学软工1412班_助教博客】个人作业2——APP案例分析
作业要求 个人作业2:APP案例分析 评分结果 按从高到低排列 学号后三位 第二次作业 Total 008 APP案例分析 23 044 第2次作业 19.5 011 App案例分析--XBMC 19 ...
- 极限编程核心价值:简单(Simplicity)
写在前面 在编写 ASP.NET Core 项目时,深感项目设计的无力感,在软件设计方面我还有很长的路要走.我一直以来都把代码当作一种艺术的存在,认为自己是个"艺术家",其实就是个 ...