三行代码实现单片机SPI读写NorFlash存储芯片

96 篇文章 0 订阅
32 篇文章 0 订阅

SPI

本教程来至 FlexLua 官网 ShineBlink 开发板教程,即使不懂单片机开发也可很容易用FlexLua零门槛开发各种 IoT 硬件。

前言

Core 提供 1 个 SPI 接口,分别对应管脚 CLK,MOSI,MISO,CS。引脚接口在 Core 上的分布如下图:

af7ed8f6943e4828fe45e08c57c5586f.jpeg

一、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芯片模块作为演示实例:

e1f0225a47361f1ce29608c8da93b26f.jpeg

下面我们通过读取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):

cbdb3b08cdeab37b558f7a0353501751.jpeg

附录:

W25QXX芯片数据手册中读取厂商代码的操作描述如下(更多信息请在华邦官网自行查阅W25QXX数据手册):

3ae89d4de6086d507f760c2de13f0a17.jpeg

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值