|
|
@@ -34,6 +34,7 @@
|
|
|
-- |
|
|
|
-- GND
|
|
|
--用法实例:演示用同一个SPI接口驱动VS1838和W25QXX
|
|
|
+--用法实例:
|
|
|
local necir = require("necir")
|
|
|
|
|
|
--定义用户回调函数
|
|
|
@@ -43,12 +44,13 @@ end
|
|
|
|
|
|
sys.taskInit(function()
|
|
|
local CS = gpio.setup(pin.PA07,0) --VS1838(NMOS控制其GND)与W25QXX共用的片选引脚
|
|
|
+ necir.init(spi.SPI_0,pin.PB03,my_ir_cb)
|
|
|
|
|
|
while 1 do
|
|
|
--===============================
|
|
|
log.info('------necir start------')
|
|
|
CS(1) --使能VS1838
|
|
|
- necir.init(spi.SPI_0,pin.PB03,my_ir_cb)
|
|
|
+ necir.start() --开启necir数据接收过程
|
|
|
sys.wait(10000)
|
|
|
log.info('necir request to close')
|
|
|
necir.close() --请求关闭necir
|
|
|
@@ -94,8 +96,8 @@ local recvBuff --SPI接收数据缓冲区
|
|
|
local recvNECFrame={} --依次存储:地址码,地址码取反,数据码,数据码取反
|
|
|
|
|
|
local recvCallback --NEC报文接收成功后的用户回调函数
|
|
|
-local isRecvTaskRun --接收任务是否需要继续运行的标志
|
|
|
-local isClosed --necir是否已经完全关闭
|
|
|
+local isNeedTaskFlag --接收任务是否需要运行的标志
|
|
|
+local isClosedFlag --necir是否已经完全关闭的标志
|
|
|
--[[
|
|
|
==============实现原理================================================
|
|
|
NEC协议中无论是引导信号,逻辑0还是逻辑1,都由若干个562.5us的周期组成。
|
|
|
@@ -203,7 +205,7 @@ local function parseRecvData()
|
|
|
--对收到的红外数据进行校验并调用 用户回调函数
|
|
|
--有的遥控的2个地址字节不是相互取反的关系,因此这里不对地址码校验
|
|
|
if ((recvNECFrame[3]+recvNECFrame[4]) == 255) then
|
|
|
- --log.info('DataValid,go CallBack')
|
|
|
+ --log.info('necir','DataValid,go CallBack')
|
|
|
if recvCallback then recvCallback(recvNECFrame) end
|
|
|
end
|
|
|
--log.info('necir',recvNECFrame[1],recvNECFrame[2],recvNECFrame[3],recvNECFrame[4])
|
|
|
@@ -213,7 +215,7 @@ end
|
|
|
--检测引导产生的上升沿的的中断函数
|
|
|
local function irq_func()
|
|
|
gpio.close(NECIR_IRQ_PIN) --关闭GPIO功能,防止中断反复触发
|
|
|
- spi.setup(NECIR_SPI_ID,nil,0,0,8,NECIR_SPI_BAUDRATE,spi.MSB,spi.master,1)--重新打开SPI接口
|
|
|
+ spi.setup(NECIR_SPI_ID,nil,0,0,8,NECIR_SPI_BAUDRATE,spi.MSB,spi.master,spi.full)--重新打开SPI接口
|
|
|
|
|
|
recvBuff = spi.recv(NECIR_SPI_ID, NECIR_SPI_RECV_BUFF_LEN) --通过SPI接收红外接收头输出的解调数据
|
|
|
sys.publish('NECIR_SPI_DONE') --发布消息,让任务对收到的SPI数据分析处理
|
|
|
@@ -222,25 +224,30 @@ end
|
|
|
|
|
|
local function recvTaskFunc()
|
|
|
|
|
|
- while isRecvTaskRun do
|
|
|
- spi.close(NECIR_SPI_ID) --关闭SPI接口在,这样才能把MISO空出来做中断检测
|
|
|
- gpio.setup(NECIR_IRQ_PIN,irq_func,gpio.PULLUP ,gpio.RISING)--打开GPIO中断检测功能
|
|
|
+ while true do
|
|
|
+ sys.waitUntil('NECIR_START',5000)
|
|
|
|
|
|
- local result, _ = sys.waitUntil('NECIR_SPI_DONE',1000)
|
|
|
- if result then --SPI完成采集,开始解析数据
|
|
|
- parseRecvData()
|
|
|
+ while isNeedTaskFlag do
|
|
|
+ spi.close(NECIR_SPI_ID) --关闭SPI接口在,这样才能把MISO空出来做中断检测
|
|
|
+ gpio.setup(NECIR_IRQ_PIN,irq_func,gpio.PULLUP ,gpio.RISING)--打开GPIO中断检测功能
|
|
|
+
|
|
|
+ local result, _ = sys.waitUntil('NECIR_SPI_DONE',1000)
|
|
|
+ if result then --SPI完成采集,开始解析数据
|
|
|
+ parseRecvData()
|
|
|
+ end
|
|
|
end
|
|
|
- end
|
|
|
-
|
|
|
- --任务结束时做清理工作
|
|
|
- gpio.close(NECIR_IRQ_PIN) --关闭GPIO功能
|
|
|
- spi.close(NECIR_SPI_ID) --关闭SPI接口
|
|
|
- isClosed = true
|
|
|
- --log.info('necir recv task close')
|
|
|
+ --关闭接收过程时做清理工作
|
|
|
+ if not isClosedFlag then
|
|
|
+ gpio.close(NECIR_IRQ_PIN) --关闭GPIO功能
|
|
|
+ spi.close(NECIR_SPI_ID) --关闭SPI接口
|
|
|
+ isClosedFlag = true
|
|
|
+ --log.info('necir','recv task closed')
|
|
|
+ end
|
|
|
+ end --task main loop
|
|
|
end
|
|
|
|
|
|
--[[
|
|
|
-necir初始化,开启数据接收任务
|
|
|
+necir初始化
|
|
|
@api necir.init(spi_id,irq_pin,recv_cb)
|
|
|
@number spi_id,使用的SPI接口的ID
|
|
|
@number irq_pin,使用的中断引脚,在单IO模式下这个引脚必须是SPI的MISO引脚
|
|
|
@@ -257,12 +264,24 @@ function necir.init(spi_id,irq_pin,recv_cb)
|
|
|
NECIR_IRQ_PIN = irq_pin
|
|
|
recvCallback = recv_cb
|
|
|
|
|
|
+ isNeedTaskFlag = false --接收任务是否需要运行的标志
|
|
|
+ isClosedFlag = true --necir是否已经完全关闭的标志
|
|
|
--启动红外数据接收任务
|
|
|
- isRecvTaskRun = true
|
|
|
- isClosed = false
|
|
|
sys.taskInit(recvTaskFunc)
|
|
|
end
|
|
|
|
|
|
+--[[
|
|
|
+开启necir数据接收过程
|
|
|
+@api necir.start()
|
|
|
+@usage
|
|
|
+necir.start()
|
|
|
+]]
|
|
|
+function necir.start()
|
|
|
+ isNeedTaskFlag = true
|
|
|
+ isClosedFlag = false
|
|
|
+ sys.publish('NECIR_START')
|
|
|
+end
|
|
|
+
|
|
|
--[[
|
|
|
请求关闭necir数据接收过程。此函数执行后并不能保证立刻关闭,具体是否已经关闭需要使用necir.isClosed()来查询。
|
|
|
@api necir.close()
|
|
|
@@ -270,18 +289,18 @@ end
|
|
|
necir.close()
|
|
|
]]
|
|
|
function necir.close()
|
|
|
- isRecvTaskRun = false
|
|
|
+ isNeedTaskFlag = false
|
|
|
end
|
|
|
|
|
|
--[[
|
|
|
-判断necir是否已经完全关闭,关闭后所使用的SPI接口将释放,可以复用为其他功能。如需再次开启,则需要再次调用necir.init(spi_id,irq_pin,recv_cb)
|
|
|
-@api necir.close()
|
|
|
+判断necir是否已经完全关闭,关闭后所使用的SPI接口将释放,可以复用为其他功能。如需再次开启,则需要再次调用necir.start()
|
|
|
+@api necir.isClosed()
|
|
|
@return bool 关闭成功返回true
|
|
|
@usage
|
|
|
-necir.close()
|
|
|
+necir.isClosed()
|
|
|
]]
|
|
|
function necir.isClosed()
|
|
|
- return isClosed
|
|
|
+ return isClosedFlag
|
|
|
end
|
|
|
|
|
|
return necir
|