SPI
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议。 Air724UG模块中提供一个通用SPI,一路LCD专用SPI接口,用于驱动SPI LCD屏幕。
简介
本文简单的讲述了luat进行二次开发,使用SPI与7735LCD通讯,使用SPI与外部flash进行通讯。具体过程请看这篇
API说明
API接口 | 功能描述 |
---|---|
spi.setup() | 配置SPI参数如上升沿/下降沿检测,时钟频率等 |
spi.send_recv() | SPI 读写数据 |
spi.close() | 关闭SPI |
spi.send() | SPI写数据 |
spi.recv() | SPI读数据 |
详细的API介绍请参见SPI
实现流程
-
使模块保持唤醒
在SPI通讯时防止丢失数据调用pm.wake接口使模块保持唤醒状态。
-
初始化SPI配置
调用spi.setup()接口配置相关参数。其中ID传入spi.SPI_1即可,后续参数为配置相位和初值。 -
创建一个协程
循环测试收发数据。
示例
相关示例程序在软件安装路径下\resource\8910_script\script_LuaTask_V2.3.7\demo\spi文件夹下,LCD SPI可用\resource\8910_script\script_LuaTask_V2.3.7\demo\camera下的脚本进行测试。
LCD SPI
硬件连接
硬件参考设计如下图所示。
注意:
- C1要靠近LCD放置
- CLK 和 DATA建议预留RC以降低对天线干扰的风险,RC靠近模块放置。
- 背光控制务必用PWM(GPIO5)控制,通过调整PWM占空比来调整背光亮度。
- R1电阻根据屏幕背光的导通电流来做调整。
首先准备一个7735的屏幕(7735型号有带后缀的也可以的)
网购的屏幕一般都有8个接口,自行焊上8PIN排针.
而724的开发板显示有7个口,
将屏幕的GND 对齐 开发板的GND 接上, 最后显示屏的BLK
会悬空(如果不调节亮度,悬空默认最亮,其他亮度 这个口接PWM)
在使用724开发套件时如下图所示插入即可
这里要放个图片别忘了
软件实现
使用7735LCD及开发板简单实现显示可参考以下脚本。
require"pm"
require"color_lcd_spi_st7735" --调用7735 LCD驱动 可在camera demo下找到
pm.wake("disp") --调用唤醒接口,防止模块进入休眠状态影响SPI通讯
disp.clear()
disp.puttext(common.utf8ToGb2312("扫描成功"),0,5)
disp.update()
外挂SPI FLASH
SPI FLASH可以分为标准SPI接口和QSPI。具体描述参考下文。
-
使用标准SPI接口外挂flash,需要自己实现flash驱动,和自己移植文件系统。
-
使用QSPI接口外挂flash,不需要自己实现flash驱动,也不需要移植文件系统 。通过mount接口挂载文件系统后,可以直接通过文件系统接口访问外部flash。QSPI有2种管脚定义, 电压不同,选择flash型号需要考虑供电电压其中通过LCD复用的QSPI (电压域VLCD, 默认关闭,电压范围1.6125V~3.2V)。通过GPIO复用的QSPI (V_GLOBAL_1V8) (724UG不支持)。
软件实现
详细使用请参spiFlash.zip
--传入所用到的固定地址
local READ_ID = 0x90
local WRITE_ENABLE = 0x06
local READ_STATUS = 0x05
local FLASH_READ = 0x03
local ERASE_SECTOR_4K = 0x20
local BLOCK_ERASE_64K = 0xD8
local ERASE_CHIP = 0x60
local PAGE_PROGRAM = 0x02
local gpio_set = pio.pin.setval
--创建一个对象
local mt = { __index = {} }
local function address24bit(addr)
return pack.pack('>I', addr):sub(2, 4)
end
--初始化函数
function setup(id, timeout)
if not spi.setup(id, 0, 0, 8, 13000000, 1) then
log.error('BH25Q32.setup', 'spi setup failed')
end
local o = {
id = id,
timeout = timeout or 60000, -- ms
pagesize = 256,
}
setmetatable(o, mt)
return o
end
--获取厂商ID和设备ID
function mt.__index:readFlashID()
log.info("send",pack.pack('bAA', READ_ID, address24bit(0), '\255\255'):toHex())
local r = spi.send_recv(self.id, pack.pack('bAA', READ_ID, address24bit(0), '\255\255'))
if r then
return string.byte(r, 5, 6)
else
return false
end
end
常见问题
-
能使用其他屏幕么?
可以驱动需要自己实现,能跑起来就中。 -
flash只返回设备id读不出数据
换个flash可能寿命达到上限了 -
标准 spi 可以驱动的目标芯片电压是多少?
1.8V,这个电压是写死的,无法设置,如果目标芯片工作电压不在此范围内需要用电平转换芯片。