SPI
本教程来至 FlexLua 官网 ShineBlink 开发板教程,即使不懂单片机开发也可很容易用FlexLua零门槛开发各种 IoT 硬件。
前言
Core 提供 1 个 SPI 接口,分别对应管脚 CLK,MOSI,MISO,CS。引脚接口在 Core 上的分布如下图:
一、SPI初始化
在使用 SPI 进行收发数据之前需要在 Lua 代码中执行一次 LIBSpiMasterConfig() 初始化函数,LIBSpiMasterConfig() 函数介绍如下:
函数名称:LIB_SpiMasterConfig(p1,p2,p3)
函数描述:配置Core的SPI接口以master模式开始工作,SPI使用Core的CLK,MOSI,MISO,CS引脚
注意:该函数只能调用一次
示例代码:
--使能SPI以master模式工作在模式0,时钟为4Mhz的频率,MSB_First:每次先发送字节里的最高位
LIB_SpiMasterConfig("4M","Mode0","MSB_First")
二、SPI发送和接收数据
SPI收发数据函数为LIB_SpiMstTransmit(),相关介绍如下:
函数名称:LIB_SpiMstTransmit(p1, ...)
函数描述:SPI主机开始发送和接收数据,需要注意的是每次收发的数据个数不能超过128个字节。
注意:不同传输模式(p1参数)下,函数 LIB_SpiMstTransmit() 的输入参数和返回值不一样,下面的例子会介绍不同模式下函数的调用方法
TxAndRx 类型传输的示例代码:
TxData = {1,2,3}
RxLen = 3
--全双模式,SPI主机发送3个数据同时接收3个数据
RxData = LIB_SpiMstTransmit("TxAndRx",TxData,RxLen)
print(string.format("Spi master had recv %d bytes data,Data[1]=%d,Data[2]=%d,Data[3]=%d", #RxData,RxData[1],RxData[2],RxData[3]))
TxThenRx 类型传输的示例代码:
TxData = {1,2,3}
RxLen = 3
--半双模式,SPI主机发送3个数据完成后,再紧接着接收3个数据
RxData = LIB_SpiMstTransmit("TxThenRx",TxData,RxLen)
print(string.format("Spi master had recv %d bytes data,Data[1]=%d,Data[2]=%d,Data[3]=%d", #RxData,RxData[1],RxData[2],RxData[3]))
Tx 类型传输的示例代码:
TxData = {1,2,3}
--半双模式,SPI主机仅发送3个数据
LIB_SpiMstTransmit("Tx",TxData)
Rx 类型传输的示例代码:
RxLen = 3
--半双模式,SPI主机仅接收3个数据
RxData = LIB_SpiMstTransmit("Rx",RxLen)
print(string.format("Spi master had recv %d bytes data,Data[1]=%d,Data[2]=%d,Data[3]=%d", #RxData,RxData[1],RxData[2],RxData[3]))
三、实例:SPI NorFlash 芯片厂商ID读操作
采用W25QXX系列SPI接口NorFlash芯片模块作为演示实例:
下面我们通过读取W25QXX芯片的厂商ID以及其他信息,来展示Core的SPI接口使用方法
LIB_SpiMasterConfig("1M","Mode0","MSB_First")
--配置USB以虚拟串口模式工作
LIB_UsbConfig("CDC")
--开始大循环
while(GC(1) == true)
do
TxData = {0x9F}
RxLen = 3
--半双模式,SPI主机发送1个数据(0x9F指令)完成后,再紧接着自动接收3个数据
RxData = LIB_SpiMstTransmit("TxThenRx",TxData,RxLen)
print(string.format("ManufacturerID = 0x%02X,MemoryTypeID = 0x%02X,CapacityID = 0x%02X", RxData[1],RxData[2],RxData[3]))
LIB_DelayMs(1000)
end
代码运行结果如下图(可以看到厂商ID为0xEF,芯片类型ID为0x40,芯片容量类型为0x16):
附录:
W25QXX芯片数据手册中读取厂商代码的操作描述如下(更多信息请在华邦官网自行查阅W25QXX数据手册):