硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3751|回复: 16
收起左侧

[Lua] 用lua脚本写了第一个驱动 24CXX eeprom

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2019-4-16 01:23:08 | 显示全部楼层 |阅读模式


研究了好几天,终于调通第一个lua脚本驱动
at24cxx.lua (2.13 KB, 下载次数: 43)

--加载驱动
print("\r\n24CXX EEPROM Driver loaded")
beep(1,1)                        --蜂鸣器叫一声
g_dev_w = 0xA0                --设备地址
g_addr_len = 1                --地址长度
g_page_size = 16        --page大小

--初始化函数
function init(_dev_addr, _addr_len, _page_size)
        g_dev_w = _dev_addr
        g_addr_len = _addr_len
        g_page_size = _page_size
        print("init()", g_dev_w, g_addr_len, g_page_size)
        beep(1,1)
end

--退出函数
function de_init()
        g_dev_w = nil
        g_addr_len = nil
        g_page_size = nil
end

--写数据,不能跨页
function pagge_write(_addr, _buf)
        i2c_start()
        if (g_addr_len == 1) then
                i2c_send(g_dev_w + (_addr/256)*2)        --写指令
                i2c_send(_addr % 256)
        else
                i2c_send(g_dev_w + (_addr/65536)*2)        --写指令
                i2c_send(_addr / 256)
                i2c_send(_addr % 256)               
        end
        i2c_send(_buf)
        i2c_stop()
        --等内部写完成
        for i=0,50,1 do
                if (i2c_send(g_dev_w)==1) then
                        break
                end
        end
end

--写数据,支持跨页
function write(_addr, _buf)
        local m
        local n
        local ad
        local pos
        local len
       
        len = string.len(_buf)
        --第1页
        ad = _addr
        n = g_page_size - (_addr % g_page_size)
        if (n > len) then
                n = len
        end
        pagge_write(ad, string.sub(_buf,1,n))
        pos = n + 1
        if (pos > len) then
                return
        end

        --中间页
        ad = _addr + n
        m = (len - pos) / g_page_size
        n = g_page_size
        for i=1,m,1 do
                pagge_write(ad, string.sub(_buf,pos,pos+g_page_size-1))
                ad = ad + g_page_size
                pos = pos + g_page_size
        end
        if (pos > len) then
                return
        end       
       
        --最后页
        n = len - pos        --剩余长度       
        pagge_write(ad, string.sub(_buf,pos,pos+n))
end

--读数据
function read(_addr, _len)
        i2c_start()

        if (g_addr_len == 1) then
                i2c_send(g_dev_w + (_addr/256)*2)        --写指令
                i2c_send(_addr % 256)
        else
                i2c_send(g_dev_w + (_addr/65536)*2)        --写指令
                i2c_send(_addr / 256)
                i2c_send(_addr % 256)               
        end

        i2c_start()
        i2c_send(g_dev_w + 1)        --读指令

        local s = i2c_recive(_len)
        i2c_stop()
        return s
end

--读数据并打印显示(for test)
function disp(_addr, _len)
        s=read(_addr,_len)
        s1=""
        for i=1,string.len(s),1 do
                if (((i - 1) % 16) == 0) then
                        s1=s1.."\r\n"
                end
                s1=s1..string.format("%02X ",string.byte(s,i))
        end
        print(s1)
end

回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-4-16 10:56:09 | 显示全部楼层
学习一下,还没用过lua
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

4

主题

139

回帖

151

积分

初级会员

积分
151
QQ
发表于 2019-4-18 23:16:12 | 显示全部楼层
用脚本语言的话是否考虑micropython,很多现成的库可以使用
回复

使用道具 举报

2

主题

72

回帖

78

积分

初级会员

积分
78
发表于 2019-4-19 14:03:56 | 显示全部楼层
前段时间我也研究一下这个脚本, 我们有个采集设备, 用在不同的具体项目上采集的量不一样, 配的采集模块也不一样,同样,打包传输的数据也不一样。 为了不想每个项目都改一遍单片机源码,我也用了Lua,不过我用Lua只是实现 数据采集 和 数据打包的逻辑, 其他功能还是单片机底层C语言实现的。
现在就是 脚本语言文件写大了,容易出错(我用记事本写的), 不知道楼主使用什么编辑器编辑的,希望能进行基本的语法检查。(我现在只能让单片机的解释器自己检查,有错误把错误输出回来。)
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2019-4-19 17:32:48 | 显示全部楼层
lanse闪电 发表于 2019-4-19 14:03
前段时间我也研究一下这个脚本, 我们有个采集设备, 用在不同的具体项目上采集的量不一样, 配的采集模块 ...

我也是初步接触,也是print方式打印查错。
编辑器用的 : LuaEditor, 至少可以语法着色
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2019-4-19 23:18:33 | 显示全部楼层
lanse闪电 发表于 2019-4-19 14:03
前段时间我也研究一下这个脚本, 我们有个采集设备, 用在不同的具体项目上采集的量不一样, 配的采集模块 ...

我去,我们也在搞这东西
回复

使用道具 举报

2

主题

72

回帖

78

积分

初级会员

积分
78
发表于 2019-4-19 23:22:50 | 显示全部楼层
armfly 发表于 2019-4-19 17:32
我也是初步接触,也是print方式打印查错。
编辑器用的 : LuaEditor, 至少可以语法着色

我安装了LuaEditor,但是看 软件的关于 里面,好像是个人写的软件,再就是一运行就申请管理员权限, 总觉得用着有点不踏实, 一直想找个 绿色的编辑器,能实现语法高亮和语法检查就行, 一直没找到。 我在找找吧。
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-4-19 23:31:24 | 显示全部楼层
lanse闪电 发表于 2019-4-19 23:22
我安装了LuaEditor,但是看 软件的关于 里面,好像是个人写的软件,再就是一运行就申请管理员权限, 总觉 ...

只需要LUA编辑吗,使用VSCODE,Notepad++均支持
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

2

主题

72

回帖

78

积分

初级会员

积分
78
发表于 2019-4-19 23:31:36 | 显示全部楼层
本帖最后由 lanse闪电 于 2019-4-19 23:32 编辑
loiis 发表于 2019-4-19 23:18
我去,我们也在搞这东西

哈哈, 其实我用Lua算是偷懒行为,前边做工程的, 天天找改程序,一个设备做完, 随着安装,程序的版本越来越多, 维护起来非常麻烦,改了一个BUG,一堆的版本要验证,老板还觉得都是很简单的事。  现在好了, 谁在让我改程序,我直接扔过去一本Lua入门+例程+USB串口线+下载软件 算了。
回复

使用道具 举报

2

主题

72

回帖

78

积分

初级会员

积分
78
发表于 2019-4-19 23:34:57 | 显示全部楼层
byccc 发表于 2019-4-19 23:31
只需要LUA编辑吗,使用VSCODE,Notepad++均支持

谢谢,我下载下来试试。
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-4-19 23:35:23 | 显示全部楼层
lanse闪电 发表于 2019-4-19 23:34
谢谢,我下载下来试试。

QQ截图20190419233438.jpg
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

2

主题

72

回帖

78

积分

初级会员

积分
78
发表于 2019-4-19 23:55:18 | 显示全部楼层

谢谢, 您推荐的2个编辑器我都下载安装了, 都很好用。我在对比一下,选一个。
回复

使用道具 举报

2

主题

72

回帖

78

积分

初级会员

积分
78
发表于 2019-4-20 11:13:47 | 显示全部楼层

经过试用之后,最后还是选择了 vscode,除了程序结构显示更清晰之外,我发现还可以进行语法检查, 在调试里面 搜索安装 Lua Debug的扩展包就可以了。  如果语法有问题,点调试后是无法进入调试状态的,会提示语法错误(比如缺少end等), 如果能进入调试模式基本上语法就没问题了。  当然继续调试还是有问题的,因为脚本里面调用了 自定义的C语言的API函数。 不过我只需要语法检查就行了,因此这样就够用了。
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2019-4-22 00:47:30 | 显示全部楼层
lanse闪电 发表于 2019-4-19 23:31
哈哈, 其实我用Lua算是偷懒行为,前边做工程的, 天天找改程序,一个设备做完, 随着安装,程序的版本越 ...

我们也想这样弄,要支持新设备就拷一个脚本文件到主机里。不过到现在还没开始做这个事情
回复

使用道具 举报

2

主题

72

回帖

78

积分

初级会员

积分
78
发表于 2019-4-22 10:14:47 | 显示全部楼层
loiis 发表于 2019-4-22 00:47
我们也想这样弄,要支持新设备就拷一个脚本文件到主机里。不过到现在还没开始做这个事情

运行起来很简单, 去Lua官网下载源码, 直接就能编译通过(我用的IAR), 我用的是多任务实时系统, 我把Lua作为一个任务运行, 按照网上的方法,需要malloc等内存函数,我用了自定义的(我的系统外置了2M的RAM,其中512K给Lua用),几句话就能运行起来。 剩下的就是研究如何热更新脚本了, 和错误处理等程序了
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2019-4-23 00:43:47 | 显示全部楼层
lanse闪电 发表于 2019-4-22 10:14
运行起来很简单, 去Lua官网下载源码, 直接就能编译通过(我用的IAR), 我用的是多任务实时系统, 我把 ...

嗯,我也准备搞起来了,哈哈
回复

使用道具 举报

3

主题

50

回帖

64

积分

初级会员

积分
64
发表于 2020-3-3 22:06:19 | 显示全部楼层
lanse闪电 发表于 2019-4-19 23:31
哈哈, 其实我用Lua算是偷懒行为,前边做工程的, 天天找改程序,一个设备做完, 随着安装,程序的版本越 ...

也扔我一份这个资料吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 14:59 , Processed in 0.317497 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表