6 @author Dozingfiretruck
8 --注意:因使用了sys.wait()所有api需要在协程中使用
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
20 -- si24r1.set_mode( si24r1.MODE_TX ); --发送模式
23 -- local a = si24r1.txpacket("si24r1test")
28 si24r1.set_mode( si24r1.MODE_RX ); --接收模式
30 local i,data = si24r1.rxpacket( ); --接收字节
38 local sys
= require
"sys"
46 local si24r1_cspin
,si24r1_cepin
,si24r1_irqpin
48 local LM75_ADDRESS_ADR
= 0x48
51 local REPEAT_CNT
= 15 --重复次数
52 local INIT_ADDR
= string.char(0x34,0x43,0x10,0x10,0x01)
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,不循环
105 local MASK_MAX_RT
= 4
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
144 local PWR_18DB
= (0x00<<1)
145 local PWR_12DB
= (0x01<<1)
146 local PWR_6DB
= (0x02<<1)
147 local PWR_0DB
= (0x03<<1)
160 -- bit3-bit2, reserved, only '00'
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
)
181 spi
.send(si24r1_spi
,string.char(NRF_WRITE_REG|address
).. value
)
183 spi
.send(si24r1_spi
,string.char(NRF_WRITE_REG|address
))
188 local function read_reg(address
,len
)
190 spi
.send(si24r1_spi
, string.char(NRF_READ_REG|address
))
191 local val
= spi
.recv(si24r1_spi
,len
or 1)
198 @api si24r1.chip_check()
199 @return bool 成功返回true
201 if si24r1.chip_check() then
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
211 log.info("si24r1","Can't find si24r1 device")
215 local function read_status_register()
216 return read_reg(NRF_READ_REG
+ STATUS
);
219 local function clear_iqr_flag(IRQ_Source
)
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
) --写地址
238 @api si24r1.set_mode( Mode )
239 @number Mode si24r1.MODE_TX si24r1.MODE_RX
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
) );
256 @api si24r1.txpacket(buff)
258 @return number 0x20:发送成功 0x10:达到最大发送次数中断 0xff:发送失败
260 local a = si24r1.txpacket("si24r1test")
262 function si24r1
.txpacket(buff
)
265 local l_10MsTimes
= 0
267 spi
.send(si24r1_spi
,string.char(FLUSH_TX
))
269 write_reg(WR_TX_PLOAD
, buff
)
272 while( 0 ~= si24r1_irq())do
274 if( 50 == l_10MsTimes
)then
275 si24r1
.init(si24r1_spi
,si24r1_cspin
,si24r1_cepin
,si24r1_irqpin
)
277 si24r1
.set_mode( si24r1
.MODE_TX
)
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
290 if( l_Status
:byte(1) & TX_OK
~=0 )~=0then --接收到数据
298 @api si24r1.rxpacket()
299 @return number len,buff 长度 数据
301 local i,data = si24r1.rxpacket() --接收字节
302 print("rxbuf",i,data)
304 function si24r1
.rxpacket()
307 local l_100MsTimes
= 0
309 spi
.send(si24r1_spi
,string.char(FLUSH_RX
))
311 while( 0 ~= si24r1_irq())do
313 if( 30 == l_100MsTimes
)then --3s没接收过数据,重新初始化模块
314 si24r1
.init(si24r1_spi
,si24r1_cspin
,si24r1_cepin
,si24r1_irqpin
)
316 si24r1
.set_mode( si24r1
.MODE_RX
)
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
338 function si24r1
.set()
340 clear_iqr_flag(IRQ_ALL
)
342 write_reg( DYNPD
, string.char( 1 << 0 ) ) --使能通道1动态数据长度
343 write_reg( FEATRUE
, string.char(0x07) )
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地址
361 @api si24r1.init(spi_id,cs,ce,irq)
362 @number spi_id spi_id
363 @return bool 成功返回true
367 function si24r1
.init(spi_id
,cs
,ce
,irq
)
368 -- si24r1_device = spi_device
374 si24r1_cs
= gpio
.setup(si24r1_cspin
, 0, gpio
.PULLUP
)
376 si24r1_irq
= gpio
.setup(si24r1_irqpin
, nil,gpio
.PULLUP
)
377 si24r1_ce
= gpio
.setup(si24r1_cepin
, 0)