SPI0/SPI1通用总线

1、Air780Exx系列模组共支持2路通用SPI总线,其中PIN83/84/85/86为默认的SPI0,PIN28/29/57/58为可以复用的SPI1(PIN28/29默认功能为UART2,PIN57/58默认功能是UART3);

2、由上图也可以看出Air780EHV和Air780EGP/EGG/EGH只支持1路SPI0,原因是:
- Air780EHV因为内置了Audio Codec芯片ES8311,内部占用了PIN57/58的I2C0总线,PIN57/58外部不可再用,所以Air780EHV也无法将PIN57/58复用为SPI1_CLK/SPI1_MISO,进而Air780EHV也就无法支持SPI1通道了;
- Air780EGP/EGG/EGH因为内置了GNSS定位芯片,内部占用了PIN28/29的UART2串口,PIN28/29外部不可再用,所以Air780EGP/EGG/EGH也无法将PIN28/29复用为SPI1_CS/SPI1_MOSI,进而Air780EGP/EGG/EGH也就无法支持SPI1通道了;
3、理论上,SPI总线可以通过不同的片选CS外挂多个不同的外设,但对不同片选下的外设要求是通信速率必须相同,不能低速率和高速率的外设挂载在同一个SPI总线下;
4、除了SPI总线外,LuatOS也支持GPIO模拟SPI,但只适用于速率超低(低于100Kbps)的外设,在设计投板前,您需要使用合宙的开发板做好充分的测试评估后再进行实际的原理图和PCB设计;
5、在使用SPI功能之前,都需要先使用LuatIO工具生成pins配置json文件,也就是对IO的初始化功能配置;
关于LuatIO功能的介绍,详见:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;

6、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、注意事项;
-
无论Air780系列模组还是Air8000系列模组,合宙LuatOS仅适配过CH390H;
-
以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总线挂载的外设越多,相应外设的响应速度也就会越低;
- 当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卡应用
-
硬件原理图;
-
模组部分;

- SPI T-Flash部分;

2、注意事项;
-
Air780Exx系列模组当前仅支持SPI接口的T-Flash(Micro-SD),不支持SDIO;
-
不同的T-Flash需要的驱动电流可能不同,实际调试时可根据需要调整SPI信号上拉电阻的阻值大小;
-
以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总线挂载的外设越多,相应外设的响应速度也就会越低;
- 当T-Flash的供电电源不支持通过GPIO控制使能管脚EN控制开启或关断时,SPI0_CS1注意上拉到T-Flash供电电源上,以防止SPI0_CS1在低功耗状态下软件未初始化时为低进而产生耗电;

- 插拔插座非常容易产生静电,建议加上TVS进行,以免被ESD打坏;
样品购买链接:SIM和GPIO用,DFN1006-2封装,AR3321P1LV,应能微-淘宝网
开机前,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、硬件原理图;
- 模组部分;

- SPI Nor Flash部分;

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,更多些型号正陆续适配中;
5,SPI AirLink应用
1、AirLink协议诞生于Air8000系列模组中"4G主控芯片和WiFi协处理芯片"之间的通信协议,比UART速率更高,比USB功耗更低,适合对速率要求较高、功耗要求较低、尤其系统中没有支持USB HOST功能芯片的产品中;
2、AirLink详细介绍
https://docs.openluat.com/protocols/airlink/
3、当Air780Exx系列做从时,以与Air8101搭配为例;
AirLink over SPI共有8个信号组成,4个SPI信号,4个辅助信号;
| AirLink八个信号 | 功能说明 |
|---|---|
| AirLink_SPI_CLK | 主机提供时钟,以"Air8101+Air780Exx系列模组"组合为例,Air8101为主,由Air8101提供时钟注意!AirLink_SPI_CLK接Air780Exx模组的SPI_CLK; |
| AirLink_SPI_MOSI | 主机输出数据到从机,以"Air8101+Air780Exx系列模组"组合为例,Air8101为主,此信号由Air8101输出数据给Air780Exx系列模组注意!AirLink_SPI_MOSI也接Air780Exx模组的SPI_MOSI,不需要反向接SPI_MISO,切记! |
| AirLink_SPI_MISO | 从机输出数据到主机,以"Air8101+Air780Exx系列模组"组合为例,Air780Exx系列模组为辅,此信号由Air780Exx模组输出数据给Air8101注意!AirLink_SPI_MISO也接Air780Exx模组的SPI_MISO,不需要反向接SPI_MOSI,切记! |
| AirLink_SPI_CS | 主机提供片选信号,拉低有效,以"Air8101+Air780Exx系列模组"组合为例,Air8101为主,此信号由Air8101提供给Air780Exx系列模组注意!AirLink_SPI_CS接Air780Exx模组的SPI_CS; |
| AirLink_RDY | 从机就绪信号, 拉低有效, 若RDY为高电平, 不可进行SPI通信,在"Air8101+Air780Exx系列模组"组合中,由Air780Exx系列模组提供给Air8101 |
| AirLink_IRQ | 从机数据通知主机, 拉低有效, 可选;在"Air8101+Air780Exx系列模组"组合中,由Air780Exx系列模组提供给Air8101;说明!AirLink协议支持轮询和中断模式, 若IRQ不选用则为轮询模式, 轮询周期默认5ms, 可配置 |
| AirLink_WAKEUP | 主机唤醒从机,在"Air8101+Air780Exx系列模组"组合中,由Air8101唤醒Air780Exx系列模组; |
| AirLink_RST | 主机复位从机,在"Air8101+Air780Exx系列模组"组合中,由Air8101复位Air780Exx系列模组; |
在"Air8101+Air780Exx系列模组"组合中,从机Air780Exx模组相应辅助信号的选择,我们推荐如下;
说明!虽然AirLink_RDY、AirLink_IRQ和AirLink_WAKEUP、AirLink_RST可以指定任意GPIO负责,但为了尽可能与我们提供给大家的软件demo一致,除非有其它的复用功能冲突,否则尽可能使用我们推荐的GPIO;
| AirLink八个信号 | Air8101 | Air780EPM/EHM/EHV/EHN/EHU | Air780EGP/EGG/EGH | Air700ECP/ECH |
|---|---|---|---|---|
| AirLink_SPI_CLK | PIN65:SPI1_CLK | PIN86:SPI0_CLK | PIN86:SPI0_CLK | PIN62:SPI0_CLK |
| AirLink_SPI_MOSI | PIN67:SPI1_MOSI | PIN85:SPI0_MOSI | PIN85:SPI0_MOSI | PIN35:SPI0_MOSI |
| AirLink_SPI_MISO | PIN8:SPI1_MISO | PIN84:SPI0_MISO | PIN84:SPI0_MISO | PIN61:SPI0_MISO |
| AirLink_SPI_CS | PIN66:SPI1_CS | PIN83:SPI0_CS | PIN83:SPI0_CS | PIN36:SPI0_CS |
| AirLink_RDY(输入) | PIN69:GPIO39或 PIN10:GPIO7二选一 | PIN19:GPIO22 | PIN19:GPIO22 | PIN71:GPIO22 |
| AirLink_IRQ(输入) | PIN9:GPIO6 | PIN20:GPIO24 | PIN20:GPIO24 | PIN39:GPIO24 |
| AirLink_WAKEUP(输出) | PIN68:GPIO12 | PIN107:GPIO21 | PIN102:GPIO20 | PIN48:GPIO20 或 PIN70:GPIO21二选一 |
| AirLink_RST(输出) | PIN10:GPIO7 | PIN15:RESET | PIN15:RESET | PIN15:RESET |
| 说明 | 请结合Air8101和Air780EPM/EHM/EHV/EHC/EHU/EGP/EGG/EGH和Air700ECP/ECH管脚图进行理解; Air780Exx系列:https://docs.openluat.com/air780epm/luatos/hardware/ Air700Exx系列:https://docs.openluat.com/air700ech/luatos/hardware/ | |||
4、当Air780Exx系列模组做主时,我们建议如下;
| AirLink八个信号 | Air780EPM/EHM/EHV/EHN/EHU | Air780EGP/EGG/EGH | Air700ECP/ECH |
|---|---|---|---|
| AirLink_SPI_CLK | PIN86:SPI0_CLK | PIN86:SPI0_CLK | PIN62:SPI0_CLK |
| AirLink_SPI_MOSI | PIN85:SPI0_MOSI | PIN85:SPI0_MOSI | PIN35:SPI0_MOSI |
| AirLink_SPI_MISO | PIN84:SPI0_MISO | PIN84:SPI0_MISO | PIN61:SPI0_MISO |
| AirLink_SPI_CS | PIN83:SPI0_CS | PIN83:SPI0_CS | PIN36:SPI0_CS |
| AirLink_RDY(输入) | PIN19:GPIO22 | PIN19:GPIO22 | PIN71:GPIO22 |
| AirLink_IRQ(输入) | PIN20:GPIO24 | PIN20:GPIO24 | PIN39:GPIO24 |
| AirLink_WAKEUP(输出) | PIN107:GPIO21 | PIN102:GPIO20 | PIN48:GPIO20 或PIN70:GPIO21二选一 |
| AirLink_RST(输出) | PIN16:GPIO27 | PIN16:GPIO27 | PIN67:GPIO27 |
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通信不正常;

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