指南-Luat二次开发教程-功能开发教程-LCD-SPI

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

硬件连接

​ 硬件参考设计如下图所示。

注意:

  1. C1要靠近LCD放置
  2. CLK 和 DATA建议预留RC以降低对天线干扰的风险,RC靠近模块放置。
  3. 背光控制务必用PWM(GPIO5)控制,通过调整PWM占空比来调整背光亮度。
  4. 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。具体描述参考下文。

  1. 使用标准SPI接口外挂flash,需要自己实现flash驱动,和自己移植文件系统。

  2. 使用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,这个电压是写死的,无法设置,如果目标芯片工作电压不在此范围内需要用电平转换芯片。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值