查看: 1029|回复: 0

[资料发布] AN-1303 SPI接口模组在使用过程中如何节省IO

[复制链接]

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
发表于 2022-2-18 16:31:09 | 显示全部楼层 |阅读模式
  背景

  对于以SX1268和LLCC68芯片为平台的二代LORA模块,在实际使用中有的客户由于MCU资源限制,需要使用更少的IO来完成对模块的控制使用。

  内容

  1、在MCU资源充足的情况下,不需要考虑节省IO的情况时的参考设计如下。
  对模块IO的功能的说明:
  (1)NSS,SCK,MOSI和MISO是SPI通信口,LLCC68不支持3线SPI,所以这4个IO是一定要接到MCU上的是省不掉的。

  (2)NREST用来复位模块,有的使用者想这把NREST接一个稳定的上电复位电路,从而实现NREST不用接MCU的IO。这样在上电时是可以实现模块复位的,但是在使用过程中如果想复位那就只能将模块断电后再上电。因为SX268和LLCC68是没有SPI复位命令的,所以在NREST不接MCU的情况下,要实现自由复位就要给模块电源口上加个控制开关,经由MCU的一个IO控制该开关。所以MCU要么用一个IO直接接到NREST上,要么NRSET接个上电复位电路,然后MCU用一个IO控制一个开关来控制模块的供电,这两种方式都需要一个MCU的IO,所以这个控制模硬件复位MCU的一个IO是省不掉的。

  (3)DIO1,DIO2和DIO3:LLCC68总共有10个可能的中断源每个都可以启用或者禁用,如下图
  并且每个中断源都可以映射到DIO1、DIO2或DIO3上。就是说DIO1、DIO2或DIO3三个IO的功能是可以完全相互替换的。如果使用者的MCU的带中断功能的IO资源充足,请把3个都接上,如果使用者的MCU的带中断功能的IO资源紧张只能接一个,那就接DIO0,或者3个DIO随便选一个接上即可。如果3个DIO都想不接的话,就只能通过SPI配合MCU的定时器轮询LORA芯片内部的标志寄存器来获取中断信息,但是这样使用会损失实时性,使用者能够接受这种实时性的损失的前提下,3个DIO方可以都不接。DIO映射和中断标志开启的命令和代码如下:
  (4)BUSY:模块的BUSY引脚为模块的当前SPI操作状态是否为空闲提示作用的信号的输出引脚。可把它叫做“占线指示器”,芯片手册里把它叫做“Busy indicator”(忙碌指示器)。不管它叫做什么,其实他的作用就是提示使用者的MCU当前是否可以通过SPI对模块进行操作,使用也很简单就是这个BUSY如果是低电平就说明可以对模块进行SPI操作,如果时高电平就说明模块正忙,先不要给模块下达新的任务去干。看下图这部分代码,你就可以完全理解,模块代码的每个操做命令后都有这个检测BUSY收否变高电平后又变低电平的操作。
  这个BUSY存在的意义在于可以让使用者更加安全稳定的操作模块,避免出现让模块做的上一个事情还没有做完,就又去让模块做下一个事情。这个BUSY只要条件允许就一定要接到MCU的IO上,操作便捷,安全又稳定,实时性也好。但是如果使用者的MCU就是没有多余的IO来接这个BUSY怎么办呢?那就只能损失的实时性。因为LLCC68在做执行一个命令去做一个事情的过程中,通过SPI读取一些标志的话是不会打断LLCC68正在做的事情的。那就可以利用这点来省掉MCU用来连接模块这个BUSY引脚的IO,但是说要说清楚的就是这样会损失实时性,如果使用者可以接受的,这个BUSY可以省掉。除了丧失一定的实时性以外,软件的开销也会增大。因为软件会增加很多的反复读取各种标志的操作,来判断是否可以给模块发下一个控制指令。

  (5)SW_CTL1 和SW_CTL2:模块的这两个IO并不神秘,他们是控制模块内部的双通道高频开关的。控制逻辑在模块手册里有写到。
  使用者的MCU如果IO资源够的话这两个IO最好还是不要省。如果一定要省掉的话,可以优先考虑MCU不接SW_CTL2,这时WS_CTL2要接到DIO2上,同时还要配合一定的软件设置。可以按照下边应用电路,能够节省 MCU 的一个接SW_CTL2的IO。

  同时需要调用函数SetDIO2AsRfSwitchCtrl 配置DIO2为发射开关控制功能,控制内部开关的 SW_CTL2 控制引脚, 通过该配置可以使DIO2在发射状态时自动输出高电平, 接收及休眠状态时自动输出低电平; 另外的控制引脚SW_CTL1使用MCU的IO进行控制,需要注意的是当休眠状态时,为了降低功耗, SW_CTL1控制引脚应该输出低, 使模块内部的高频开关不工作。如果客户SW_CTL1 和SW_CTL2都不想接到MCU上,那么需要把DIO2接到SW_CTL2上,再把DIO2通过一个反向电路后接到SW_CTL1上,但是这样做会增加模块睡眠时的功耗(大约会增加2-20uA左右,根据客户的反向电路不同而不同)。但是一定要注意这样做的话当使用者想让模块在RX状态和TX状态时功耗的差异不大,但是如果使用者想让模块进入SLEEP模式的话,反向器上的功耗和模块内部高频开关无法完全关闭所消耗的功耗,和常规应用下模块SLEEP状态下不到1uA的功耗相比,有可能要增加很多。所以这种增加反向器省掉一个IO的做法强烈的不推荐,特别是电池供电的设备不做推荐。但是如果市电供电的设备而且不介意SLEEP状态下可能增加的近20uA的情况下,MCU的IO又非常匮乏的情况下才可以考虑尝试这种增加反向器来省掉接SW_CTL1和SW_CTL2的两个MCU的IO的方法。

  2、模块各个IO的在模块各种工作状态下的状态

  使用者可能还会比较关心模块的各个Pin在各个工作状态下的IO的电器状态,可以参考下图。该图用于客户参考,以便于客户配置在模块不同状态的的MCU的各个IO的状态来节省功耗。

  请使用者特别要关注下SLEEP状态下模块各个IO的状态。
  结论
  (1)最好模块所有的Pin都接上保留如下:
  NSS,SCK,MOSI,MISO,NREST,SW_CTL1,BUSY, DIO1,SW_CTL2,DIO2,DIO3(功能齐全,什么也不耽误)
  (2)想稍微节约点MCU的IO的话可以保留如下:
  NSS,SCK,MOSI,MISO,NREST,SW_CTL1,BUSY, DIO1,SW_CTL2(软件不会复杂,实时性无影响)
  (3)想更节约点MCU的IO的话可以保留如下:
  NSS,SCK,MOSI,MISO,NREST,SW_CTL1,BUSY, DIO1(软件稍微复杂一点点,多配个DIO2功能,实时性无影响)
  (4)还想更节约点MCU的IO的话可以保留如下:
  NSS,SCK,MOSI,MISO,NREST,SW_CTL1,BUSY(软件复杂一些,多配个DIO2功能,实时性会有影响)
  (5)还想更节约点MCU的IO的话可以保留如下:
  NSS,SCK,MOSI,MISO,NREST,BUSY(软件更复杂,多配个DIO2功能,硬件上要做个反向电路控制SW_CTL1,实时性会有更多影响,SLEEP时功耗有较大影响)
  (6)还想更节约点MCU的IO的话可以保留如下:
  NSS,SCK,MOSI,MISO,NREST(软件更复杂,多配个DIO2功能,硬件上要做个反向电路控制SW_CTL1,实时性会有更多影响,SLEEP时功耗有较大影响)
  (7)还想更节约点MCU的IO的话可以保留如下:
  恭喜你,你已经达到了巅峰,想法很美好,现实很残忍,你已经没法再节约了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表