add: libfota需要兼容老的hmeta库, 没有hwver函数
[LuatOS.git] / script / libs / si24r1.lua
blobd345226ef5a86a6decd3ae0fcfc72292236b9c65
1 --[[
2 @module si24r1
3 @summary si24r1 驱动
4 @version 1.0
5 @date 2022.06.17
6 @author Dozingfiretruck
7 @usage
8 --注意:因使用了sys.wait()所有api需要在协程中使用
9 -- 用法实例
10 local si24r1 = require "si24r1"
12 sys.taskInit(function()
13 spi_si24r1 = spi.setup(0,nil,0,0,8,10*1000*1000,spi.MSB,1,1)
14 si24r1.init(0,pin.PB04,pin.PB01,pin.PB00)
15 if si24r1.chip_check() then
16 si24r1.set()
17 end
19 --发送示例
20 -- si24r1.set_mode( si24r1.MODE_TX ); --发送模式
21 -- while 1 do
22 -- sys.wait(1000)
23 -- local a = si24r1.txpacket("si24r1test")
24 -- print("a",a)
25 -- end
27 --接收示例
28 si24r1.set_mode( si24r1.MODE_RX ); --接收模式
29 while 1 do
30 local i,data = si24r1.rxpacket( ); --接收字节
31 print("rxbuf",i,data)
32 end
33 end)
37 local si24r1 = {}
38 local sys = require "sys"
40 local si24r1_device
41 local si24r1_spi
42 local si24r1_ce
43 local si24r1_cs
44 local si24r1_irq
46 local si24r1_cspin,si24r1_cepin,si24r1_irqpin
48 local LM75_ADDRESS_ADR = 0x48
50 ---器件所用地址
51 local REPEAT_CNT = 15 --重复次数
52 local INIT_ADDR = string.char(0x34,0x43,0x10,0x10,0x01)
54 si24r1.MODE_TX = 0
55 si24r1.MODE_RX = 1
57 local NRF_READ_REG = 0x00 --读配置寄存器,低5位为寄存器地址
58 local NRF_WRITE_REG = 0x20 --写配置寄存器,低5位为寄存器地址
59 local RD_RX_PLOAD = 0x61 --读RX有效数据,1~32字节
60 local WR_TX_PLOAD = 0xA0 --写TX有效数据,1~32字节
61 local FLUSH_TX = 0xE1 --清除TX FIFO寄存器,发射模式下使用
62 local FLUSH_RX = 0xE2 --清除RX FIFO寄存器,接收模式下使用
63 local REUSE_TX_PL = 0xE3 --重新使用上一包数据,CE为高,数据包被不断发送
64 local R_RX_PL_WID = 0x60
65 local NOP = 0xFF --空操作,可以用来读状态寄存器
66 local W_ACK_PLOAD = 0xA8
67 local WR_TX_PLOAD_NACK = 0xB0
69 local CONFIG = 0x00 --配置寄存器地址,bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;
70 --bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能
71 local EN_AA = 0x01 --使能自动应答功能 bit0~5 对应通道0~5
72 local EN_RXADDR = 0x02 --接收地址允许 bit0~5 对应通道0~5
73 local SETUP_AW = 0x03 --设置地址宽度(所有数据通道) bit0~1: 00,3字节 01,4字节, 02,5字节
74 local SETUP_RETR = 0x04 --建立自动重发;bit0~3:自动重发计数器;bit4~7:自动重发延时 250*x+86us
75 local RF_CH = 0x05 --RF通道,bit0~6工作通道频率
76 local RF_SETUP = 0x06 --RF寄存器,bit3:传输速率( 0:1M 1:2M);bit1~2:发射功率;bit0:噪声放大器增益
77 local STATUS = 0x07 --状态寄存器;bit0:TX FIFO满标志;bit1~3:接收数据通道号(最大:6);bit4:达到最多次重发次数
78 --bit5:数据发送完成中断;bit6:接收数据中断
79 local MAX_TX = 0x10 --达到最大发送次数中断
80 local TX_OK = 0x20 --TX发送完成中断
81 local RX_OK = 0x40 --接收到数据中断
83 local OBSERVE_TX = 0x08 --发送检测寄存器,bit7~4:数据包丢失计数器;bit3~0:重发计数器
84 local CD = 0x09 --载波检测寄存器,bit0:载波检测
85 local RX_ADDR_P0 = 0x0A --数据通道0接收地址,最大长度5个字节,低字节在前
86 local RX_ADDR_P1 = 0x0B --数据通道1接收地址,最大长度5个字节,低字节在前
87 local RX_ADDR_P2 = 0x0C --数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等
88 local RX_ADDR_P3 = 0x0D --数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等
89 local RX_ADDR_P4 = 0x0E --数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等
90 local RX_ADDR_P5 = 0x0F --数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等
91 local TX_ADDR = 0x10 --发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与地址相等
92 local RX_PW_P0 = 0x11 --接收数据通道0有效数据宽度(1~32字节),设置为0则非法
93 local RX_PW_P1 = 0x12 --接收数据通道1有效数据宽度(1~32字节),设置为0则非法
94 local RX_PW_P2 = 0x13 --接收数据通道2有效数据宽度(1~32字节),设置为0则非法
95 local RX_PW_P3 = 0x14 --接收数据通道3有效数据宽度(1~32字节),设置为0则非法
96 local RX_PW_P4 = 0x15 --接收数据通道4有效数据宽度(1~32字节),设置为0则非法
97 local RX_PW_P5 = 0x16 --接收数据通道5有效数据宽度(1~32字节),设置为0则非法
98 local NRF_FIFO_STATUS = 0x17 --FIFO状态寄存器;bit0:RX FIFO寄存器空标志;bit1:RX FIFO满标志;bit2~3保留
99 --bit4:TX FIFO 空标志;bit5:TX FIFO满标志;bit6:1,循环发送上一数据包.0,不循环
100 local DYNPD = 0x1C
101 local FEATRUE = 0x1D
103 local MASK_RX_DR = 6
104 local MASK_TX_DS = 5
105 local MASK_MAX_RT = 4
106 local EN_CRC = 3
107 local CRCO = 2
108 local PWR_UP = 1
109 local PRIM_RX = 0
111 local ENAA_P5 = 5
112 local ENAA_P4 = 4
113 local ENAA_P3 = 3
114 local ENAA_P2 = 2
115 local ENAA_P1 = 1
116 local ENAA_P0 = 0
118 local ERX_P5 = 5
119 local ERX_P4 = 4
120 local ERX_P3 = 3
121 local ERX_P2 = 2
122 local ERX_P1 = 1
123 local ERX_P0 = 0
125 local AW_RERSERVED = 0x0
126 local AW_3BYTES = 0x1
127 local AW_4BYTES = 0x2
128 local AW_5BYTES = 0x3
130 local ARD_250US = (0x00<<4)
131 local ARD_500US = (0x01<<4)
132 local ARD_750US = (0x02<<4)
133 local ARD_1000US = (0x03<<4)
134 local ARD_2000US = (0x07<<4)
135 local ARD_4000US = (0x0F<<4)
136 local ARC_DISABLE = 0x00
137 local ARC_15 = 0x0F
139 local CONT_WAVE = 7
140 local RF_DR_LOW = 5
141 local PLL_LOCK = 4
142 local RF_DR_HIGH = 3
143 -- bit2-bit1:
144 local PWR_18DB = (0x00<<1)
145 local PWR_12DB = (0x01<<1)
146 local PWR_6DB = (0x02<<1)
147 local PWR_0DB = (0x03<<1)
149 local RX_DR = 6
150 local TX_DS = 5
151 local MAX_RT = 4
152 -- for bit3-bit1,
153 local TX_FULL_0 = 0
155 local RPD = 0
157 local TX_REUSE = 6
158 local TX_FULL_1 = 5
159 local TX_EMPTY = 4
160 -- bit3-bit2, reserved, only '00'
161 local RX_FULL = 1
162 local RX_EMPTY = 0
164 local DPL_P5 = 5
165 local DPL_P4 = 4
166 local DPL_P3 = 3
167 local DPL_P2 = 2
168 local DPL_P1 = 1
169 local DPL_P0 = 0
171 local EN_DPL = 2
172 local EN_ACK_PAY = 1
173 local EN_DYN_ACK = 0
174 local IRQ_ALL = ( (1<<RX_DR) | (1<<TX_DS) | (1<<MAX_RT) )
176 local check_string = string.char(0X11, 0X22, 0X33, 0X44, 0X55)
178 local function write_reg(address, value)
179 si24r1_cs(0)
180 if value then
181 spi.send(si24r1_spi,string.char(NRF_WRITE_REG|address).. value)
182 else
183 spi.send(si24r1_spi,string.char(NRF_WRITE_REG|address))
185 si24r1_cs(1)
188 local function read_reg(address,len)
189 si24r1_cs(0)
190 spi.send(si24r1_spi, string.char(NRF_READ_REG|address))
191 local val = spi.recv(si24r1_spi,len or 1)
192 si24r1_cs(1)
193 return val
196 --[[
197 si24r1 器件检测
198 @api si24r1.chip_check()
199 @return bool 成功返回true
200 @usage
201 if si24r1.chip_check() then
202 si24r1.set()
205 function si24r1.chip_check()
206 write_reg(TX_ADDR, check_string)
207 local recv_string = read_reg(TX_ADDR,5)
208 if recv_string == check_string then
209 return true
211 log.info("si24r1","Can't find si24r1 device")
212 return false
215 local function read_status_register()
216 return read_reg(NRF_READ_REG + STATUS);
219 local function clear_iqr_flag(IRQ_Source)
220 local btmp = 0;
221 IRQ_Source = IRQ_Source & ( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ); --中断标志处理
222 btmp = read_status_register():byte(1); --读状态寄存器
223 write_reg(NRF_WRITE_REG + STATUS)
224 write_reg(IRQ_Source | btmp)
225 return ( read_status_register():byte(1)) --返回状态寄存器状态
228 local function set_txaddr( pAddr )
229 write_reg( TX_ADDR, pAddr) --写地址
232 local function set_rxaddr( PipeNum,pAddr )
233 write_reg( RX_ADDR_P0 + PipeNum, pAddr) --写地址
236 --[[
237 si24r1 设置模式
238 @api si24r1.set_mode( Mode )
239 @number Mode si24r1.MODE_TX si24r1.MODE_RX
240 @usage
241 si24r1.set_mode( si24r1.MODE_TX )
243 function si24r1.set_mode( Mode )
244 local controlreg = 0;
245 controlreg = read_reg( CONFIG ):byte(1);
246 if ( Mode == si24r1.MODE_TX ) then
247 controlreg =controlreg & ~( 1<< PRIM_RX );
248 elseif ( Mode == si24r1.MODE_RX ) then
249 controlreg = controlreg|( 1<< PRIM_RX );
251 write_reg( CONFIG, string.char(controlreg) );
254 --[[
255 si24r1 发送
256 @api si24r1.txpacket(buff)
257 @string buff
258 @return number 0x20:发送成功 0x10:达到最大发送次数中断 0xff:发送失败
259 @usage
260 local a = si24r1.txpacket("si24r1test")
262 function si24r1.txpacket(buff)
263 local l_Status = 0
264 local l_RxLength = 0
265 local l_10MsTimes = 0
267 spi.send(si24r1_spi,string.char(FLUSH_TX))
268 si24r1_ce(0)
269 write_reg(WR_TX_PLOAD, buff)
270 si24r1_ce(1)
272 while( 0 ~= si24r1_irq())do
273 sys.wait(10)
274 if( 50 == l_10MsTimes )then
275 si24r1.init(si24r1_spi,si24r1_cspin,si24r1_cepin,si24r1_irqpin)
276 si24r1.set()
277 si24r1.set_mode( si24r1.MODE_TX )
278 break;
280 l_10MsTimes = l_10MsTimes+1
282 l_Status = read_reg( STATUS ) --读状态寄存器
283 write_reg( STATUS,l_Status ) --清中断标志
285 if( l_Status:byte(1) & MAX_TX )~=0then --接收到数据
286 write_reg( FLUSH_TX,string.char(0xff) ) --清除TX FIFO
287 return MAX_TX
290 if( l_Status:byte(1) & TX_OK ~=0 )~=0then --接收到数据
291 return TX_OK
293 return 0xFF
296 --[[
297 si24r1 接收
298 @api si24r1.rxpacket()
299 @return number len,buff 长度 数据
300 @usage
301 local i,data = si24r1.rxpacket() --接收字节
302 print("rxbuf",i,data)
304 function si24r1.rxpacket()
305 local l_Status = 0
306 local l_RxLength = 0
307 local l_100MsTimes = 0
309 spi.send(si24r1_spi,string.char(FLUSH_RX))
311 while( 0 ~= si24r1_irq())do
312 sys.wait( 100 )
313 if( 30 == l_100MsTimes )then --3s没接收过数据,重新初始化模块
314 si24r1.init(si24r1_spi,si24r1_cspin,si24r1_cepin,si24r1_irqpin)
315 si24r1.set()
316 si24r1.set_mode( si24r1.MODE_RX )
317 break;
319 l_100MsTimes = l_100MsTimes+1
321 l_Status = read_reg( STATUS ) --读状态寄存器
322 write_reg( STATUS,l_Status ) --清中断标志
323 if( l_Status:byte(1) & RX_OK ~=0 )~=0then --接收到数据
324 l_RxLength = read_reg( R_RX_PL_WID ) --读取接收到的数据个数
325 local rxbuf = read_reg( RD_RX_PLOAD,l_RxLength:byte(1) ) --接收到数据
326 write_reg( FLUSH_RX,string.char(0xff) ) --清除RX FIFO
327 return l_RxLength:byte(1),rxbuf
329 return 0; --没有收到数据
332 --[[
333 si24r1 配置参数
334 @api si24r1.set()
335 @usage
336 si24r1.set()
338 function si24r1.set()
339 si24r1_ce(1)
340 clear_iqr_flag(IRQ_ALL)
342 write_reg( DYNPD, string.char( 1 << 0 ) ) --使能通道1动态数据长度
343 write_reg( FEATRUE, string.char(0x07) )
344 write_reg( DYNPD )
345 write_reg( FEATRUE )
347 write_reg( CONFIG,string.char(( 1 << EN_CRC ) | ( 1 << PWR_UP )) )
348 write_reg( EN_AA, string.char( 1 << ENAA_P0 ) ) --通道0自动应答
349 write_reg( EN_RXADDR, string.char( 1 << ERX_P0 ) ) --通道0接收
350 write_reg( SETUP_AW, string.char(AW_5BYTES) ) --地址宽度 5个字节
351 write_reg( SETUP_RETR, string.char(ARD_4000US | ( REPEAT_CNT & 0x0F )) ) --重复等待时间 250us
352 write_reg( RF_CH, string.char(60) ) --初始化通道
353 write_reg( RF_SETUP, string.char(0x26) )
355 set_txaddr( INIT_ADDR) --设置TX地址
356 set_rxaddr( 0, INIT_ADDR) --设置RX地址
359 --[[
360 si24r1 初始化
361 @api si24r1.init(spi_id,cs,ce,irq)
362 @number spi_id spi_id
363 @return bool 成功返回true
364 @usage
365 lm75_data.init(0)
367 function si24r1.init(spi_id,cs,ce,irq)
368 -- si24r1_device = spi_device
369 si24r1_spi = spi_id
370 si24r1_cspin = cs
371 si24r1_cepin = ce
372 si24r1_irqpin = irq
374 si24r1_cs = gpio.setup(si24r1_cspin, 0, gpio.PULLUP)
375 si24r1_cs(1)
376 si24r1_irq= gpio.setup(si24r1_irqpin, nil,gpio.PULLUP)
377 si24r1_ce= gpio.setup(si24r1_cepin, 0)
378 si24r1_ce(0)
381 return si24r1