|
研究了好几天,终于调通第一个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
|
|