跳转至

SPI0/SPI1通用总线

1、Air700ECP/Air700ECH模组共支持2路通用SPI总线,其中PIN35/36/61/62为默认的SPI0,PIN2/3/25/54为可以复用的SPI1(PIN2/3默认功能为UART2,PIN25/54默认功能是UART3);

2、理论上,SPI总线可以通过不同的片选CS外挂多个不同的外设,但对不同片选下的外设要求是通信速率必须相同,不能低速率和高速率的外设挂载在同一个SPI总线下;

3、除了SPI总线外,LuatOS也支持GPIO模拟SPI,但只适用于速率超低(低于100Kbps)的外设,在设计投板前,您需要使用合宙的开发板做好充分的测试评估后再进行实际的原理图和PCB设计;

4、在使用SPI功能之前,都需要先使用LuatIO工具生成pins配置json文件,也就是对IO的初始化功能配置;

关于LuatIO功能的介绍,详见:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心

5、SPI总线可以支持多种外设,比如以太网控制芯片CH390H、SPI Nor Flash、SPI NAND Flash、SPI TF卡(MicroSD卡)等,以及合宙基于SPI总线自研推出的AirLink通信协议,这些内容将在下面的小章节里逐一介绍;

1,SPI以太网应用

1、硬件原理图;

需要特别强调的是:ETH_INT信号,大家在硬件设计中容易忽视掉这一个信号;

a. ETH_INT,在CH390H接收到数据后,第一时间通知到模组,进而进行后续的处理;

否则,模组只能通过轮询的方式侦测CH390H的接收数据,在效率上不如ETH_INT高;

可以使用支持中断功能的任意GPIO做为ETH_INT;

b. 不加irq(ETH_INT)就是轮询模式,轮询间隔为5ms;

加irq就是中断模式,超时1秒,也就是说,在连续1秒内如果没有中断产生,也会主动查询一次CH390H的状态;

c. 软件上ETH_INT的配置,在exnetif扩展库API文档中有详细的描述,搜索irq即可;

d. CH390H有两种模式,开启模式和关闭模式;

开启模式:CH390H硬件上电+CH390H软件驱动启动;

关闭模式:CH390H硬件下电+CH390H软件驱动停止;

在开启模式下,局域网内有大量的广播包,这些都是要处理的,所以会导致系统无法进入低功耗;

在关闭模式下,允许系统进入低功耗;

e. 在软件上,通过调用exnetif.set_priority_order接口控制开启;如果硬件设计时,CH390H的供电使能无法由软件控制,则意味着CH390H会一直处于上电状态,则系统无法进入低功耗;所以,如果项目需要低功耗,一定要由GPIO去控制CH390H的供电使能;

通过调用exnetif.close接口控制关闭;

详细用法参考exnetif扩展库API文档

2、注意事项;

  • 合宙LuatOS仅适配过CH390H;

  • SPI0可以做如下挂载组合;

a. 第一种:CS0挂载CH390H,CS1挂载SPI TF卡;

b. 第二种:CS0挂载CH390H,CS1挂载SPI Nor Flash;

c. 第三种:CS0挂载CH390H,CS1挂载SPI NAND Flash;

d. 第四种:CS0挂载一路CH390H,CS1挂载另一路CH390H,CS2挂载SPI TF卡;

e. 第五种:CS0挂载一路CH390H,CS1挂载另一路CH390H,CS2挂载SPI Nor Flash;

f. 第六种:CS0挂载一路CH390H,CS1挂载另一路CH390H,CS2挂载SPI NAND Flash;

说明!SPI总线挂载的外设越多,相应外设的响应速度也就会越低;

  • 当CH390的供电电源不支持通过GPIO控制使能管脚EN控制开启或关断时,SPI0_CS0注意上拉到CH390H供电电源上,以防止SPI0_CS0在低功耗状态下软件未初始化时为低进而产生耗电;

  • 使用LuatOS核心库SPI时,注意使用 spi.deviceSetup()、spi_device:transfer()、spi_device:send()、spi_device:recv()等spi_device相关的API函数;

3、与以太网相关的LuatOS核心库、扩展库和相关文档;

  • SPI核心库

https://docs.openluat.com/osapi/core/spi/

  • netdrv核心库

https://docs.openluat.com/osapi/core/netdrv/

  • exnetif扩展库

https://docs.openluat.com/osapi/ext/exnetif/

  • 相关指导文档

https://docs.openluat.com/air780epm/luatos/app/socket/

2,SPI TF卡应用

  1. 硬件原理图;

2、注意事项;

  • 当前仅支持SPI接口的T-Flash(Micro-SD),不支持SDIO;

  • 不同的T-Flash需要的驱动电流可能不同,实际调试时可根据需要调整SPI信号上拉电阻的阻值大小;

  • SPI0可以做如下挂载组合;

a. 第一种:CS0挂载CH390H,CS1挂载SPI TF卡;

b. 第二种:CS0挂载CH390H,CS1挂载SPI Nor Flash;

c. 第三种:CS0挂载CH390H,CS1挂载SPI NAND Flash;

d. 第四种:CS0挂载一路CH390H,CS1挂载另一路CH390H,CS2挂载SPI TF卡;

e. 第五种:CS0挂载一路CH390H,CS1挂载另一路CH390H,CS2挂载SPI Nor Flash;

f. 第六种:CS0挂载一路CH390H,CS1挂载另一路CH390H,CS2挂载SPI NAND Flash;

说明!SPI总线挂载的外设越多,相应外设的响应速度也就会越低;

  • 当T-Flash的供电电源不支持通过GPIO控制使能管脚EN控制开启或关断时,SPI0_CS1注意上拉到T-Flash供电电源上,以防止SPI0_CS1在低功耗状态下软件未初始化时为低进而产生耗电;

  • 插拔插座非常容易产生静电,建议加上TVS进行,以免被ESD打坏;

样品购买链接:SIM和GPIO用,DFN1006-2封装,AR3321P1LV,应能微-淘宝网

AR3321P1LV.pdf

XESD100N-3V3 Rev. 0.1.pdf

CSLS03FBZ.pdf

PESDR3321P1.pdf

开机前,PWRKEY是开机键;开机后,PWRKEY就是一个中断输入,执行什么动作取决于软件的设置;

  • 使用LuatOS核心库SPI时,注意使用 spi.deviceSetup()、spi_device:transfer()、spi_device:send()、spi_device:recv()等spi_device相关的API函数;

3、与SPI T-Flash相关的LuatOS核心库、扩展库和相关文档;

  • SPI核心库

https://docs.openluat.com/osapi/core/spi/

  • fatfs核心库

https://docs.openluat.com/osapi/core/fatfs/

  • io核心库

https://docs.openluat.com/osapi/core/io/

  • fs核心库

https://docs.openluat.com/osapi/core/fs/

  • 相关指导文档

https://docs.openluat.com/air780epm/luatos/app/driver/sd/

3,SPI Nor Flash应用

1、硬件原理图;

2、注意事项;

  • 以Air780EHV举例来说,SPI0可以做如下挂载组合;

a. 第一种:CS0挂载CH390H,CS1挂载SPI TF卡;

b. 第二种:CS0挂载CH390H,CS1挂载SPI Nor Flash;

c. 第三种:CS0挂载CH390H,CS1挂载SPI NAND Flash;

d. 第四种:CS0挂载一路CH390H,CS1挂载另一路CH390H,CS2挂载SPI TF卡;

e.第五种:CS0挂载一路CH390H,CS1挂载另一路CH390H,CS2挂载SPI Nor Flash;

f. 第六种:CS0挂载一路CH390H,CS1挂载另一路CH390H,CS2挂载SPI NAND Flash;

说明!SPI总线挂载的外设越多,相应外设的响应速度也就会越低;

  • 当Nor Flash的供电电源不支持通过GPIO控制使能管脚EN控制开启或关断时,SPI0_CS2注意上拉到Nor Flash供电电源上,以防止SPI0_CS2在低功耗状态下软件未初始化时为低进而产生耗电;

  • 使用LuatOS核心库SPI时,注意使用 spi.deviceSetup()、spi_device:transfer()、spi_device:send()、spi_device:recv()等spi_device相关的API函数;

  • 关于little_flash和sfud;

  • little_flash支持挂载spi nor flash和spi nand flash,sfud只能挂载spi nor flash;

  • 无论spi nor flash还是spi nand flash,都推荐优先使用little_flash方式挂载;

  • LuatOS已适配过的SPI Nor Flash有W25Q64、W25Q128、W25Q256等,原则上所有支持sfdp协议的SPI Nor Flash都可以支持;

3、与SPI Nor Flash相关的LuatOS核心库、扩展库和相关文档;

  • SPI核心库

https://docs.openluat.com/osapi/core/spi/

  • little_flash核心库

https://docs.openluat.com/osapi/core/little_flash/

  • Sfud核心库

https://docs.openluat.com/osapi/core/sfud/

  • io核心库

https://docs.openluat.com/osapi/core/io/

  • 相关指导文档

https://docs.openluat.com/air780epm/luatos/app/mulu/fs/

https://docs.openluat.com/air780ehv/luatos/app/mulu/fs/

4,SPI NAND Flash应用

1、SPI NAND Flash原理图与SPI Nor Flash相同,可以直接参考;

2、关于little_flash和sfud;

  • little_flash支持挂载spi nor flash和spi nand flash,sfud只能挂载spi nor flash;

  • 无论spi nor flash还是spi nand flash,都推荐优先使用little_flash方式挂载;

3、LuatOS当前已适配过的SPI NAND Flash有W25N01GVZEIG、W25N01KVZEIR、W25N02KVZEIR、W25N04KVZEIR,更多些型号正陆续适配中;

1、AirLink协议诞生于Air8000系列模组中"4G主控芯片和WiFi协处理芯片"之间的通信协议,比UART速率更高,比USB功耗更低,适合对速率要求较高、功耗要求较低、尤其系统中没有支持USB HOST功能芯片的产品中;

2、AirLink详细介绍

https://docs.openluat.com/protocols/airlink/

6,SPI总线常见的坑

SPI作为总线协议,可以在一路SPI上挂载多个外设,每个设备分配一条独立的SPI-CS片选;

通过CS拉低片选机制,灵活打开相应外设;

合宙多个型号模组的开发板上,就通过这种方式,至少同时挂载了SD卡槽和CH390H;

CH390H的坑

当CH390H未供电时,其MISO MOSI CLK三个信号为在CH390H芯片内部为下拉状态,这时会将三个信号的电平拉低到非正常逻辑电平状态;

这个时候如果打开SPI总线上的其它外设,比如SD卡,会造成SD卡的读取失败,或者几率性失败或成功,原因就是因为SPI信号的逻辑电平混乱所致;

比如,我们设置的IO电平为3.3V,实际此时的电平可能是2V左右,其逻辑高电平处于临界状态,进而造成通信异常;

解决办法是必须将给CH390H的供电打开;

如下为CH390H截图;

SD卡槽

SPI总线接上拉电阻到LDO后会出现异常,比如,Air780系列V1.4开发板,SD卡部分将SPI总线上拉高到SD_3V3,用于增加SPI总线的驱动能力;

当其他同路SPI外设要使用时,SD卡的这路LDO必须要打开,否则会造成SPI通信不正常;

原因是,给每个外设供电的LDO,以LP5907MFX为例,其在关闭时,LDO电源输出管脚会有下拉电阻到地,进而造成SPI电平拉低,比如Air780EHM电平设置为3.3V时,会被拉低到2.2V甚至2V以下,造成SPI通信不正常;

LP5907MFX.pdf

所以,

当硬件设计中将SPI上拉到某一LDO时,一定要将该LDO打开才可以保证SPI正常通信;