--[[ @module si24r1 @summary si24r1 驱动 @version 1.0 @date 2022.06.17 @author Dozingfiretruck @usage --注意:因使用了sys.wait()所有api需要在协程中使用 -- 用法实例 local si24r1 = require "si24r1" sys.taskInit(function() spi_si24r1 = spi.setup(0,nil,0,0,8,10*1000*1000,spi.MSB,1,1) si24r1.init(0,pin.PB04,pin.PB01,pin.PB00) if si24r1.chip_check() then si24r1.set() end --发送示例 -- si24r1.set_mode( si24r1.MODE_TX ); --发送模式 -- while 1 do -- sys.wait(1000) -- local a = si24r1.txpacket("si24r1test") -- print("a",a) -- end --接收示例 si24r1.set_mode( si24r1.MODE_RX ); --接收模式 while 1 do local i,data = si24r1.rxpacket( ); --接收字节 print("rxbuf",i,data) end end) ]] local si24r1 = {} local sys = require "sys" local si24r1_device local si24r1_spi local si24r1_ce local si24r1_cs local si24r1_irq local si24r1_cspin,si24r1_cepin,si24r1_irqpin local LM75_ADDRESS_ADR = 0x48 ---器件所用地址 local REPEAT_CNT = 15 --重复次数 local INIT_ADDR = string.char(0x34,0x43,0x10,0x10,0x01) si24r1.MODE_TX = 0 si24r1.MODE_RX = 1 local NRF_READ_REG = 0x00 --读配置寄存器,低5位为寄存器地址 local NRF_WRITE_REG = 0x20 --写配置寄存器,低5位为寄存器地址 local RD_RX_PLOAD = 0x61 --读RX有效数据,1~32字节 local WR_TX_PLOAD = 0xA0 --写TX有效数据,1~32字节 local FLUSH_TX = 0xE1 --清除TX FIFO寄存器,发射模式下使用 local FLUSH_RX = 0xE2 --清除RX FIFO寄存器,接收模式下使用 local REUSE_TX_PL = 0xE3 --重新使用上一包数据,CE为高,数据包被不断发送 local R_RX_PL_WID = 0x60 local NOP = 0xFF --空操作,可以用来读状态寄存器 local W_ACK_PLOAD = 0xA8 local WR_TX_PLOAD_NACK = 0xB0 local CONFIG = 0x00 --配置寄存器地址,bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能; --bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能 local EN_AA = 0x01 --使能自动应答功能 bit0~5 对应通道0~5 local EN_RXADDR = 0x02 --接收地址允许 bit0~5 对应通道0~5 local SETUP_AW = 0x03 --设置地址宽度(所有数据通道) bit0~1: 00,3字节 01,4字节, 02,5字节 local SETUP_RETR = 0x04 --建立自动重发;bit0~3:自动重发计数器;bit4~7:自动重发延时 250*x+86us local RF_CH = 0x05 --RF通道,bit0~6工作通道频率 local RF_SETUP = 0x06 --RF寄存器,bit3:传输速率( 0:1M 1:2M);bit1~2:发射功率;bit0:噪声放大器增益 local STATUS = 0x07 --状态寄存器;bit0:TX FIFO满标志;bit1~3:接收数据通道号(最大:6);bit4:达到最多次重发次数 --bit5:数据发送完成中断;bit6:接收数据中断 local MAX_TX = 0x10 --达到最大发送次数中断 local TX_OK = 0x20 --TX发送完成中断 local RX_OK = 0x40 --接收到数据中断 local OBSERVE_TX = 0x08 --发送检测寄存器,bit7~4:数据包丢失计数器;bit3~0:重发计数器 local CD = 0x09 --载波检测寄存器,bit0:载波检测 local RX_ADDR_P0 = 0x0A --数据通道0接收地址,最大长度5个字节,低字节在前 local RX_ADDR_P1 = 0x0B --数据通道1接收地址,最大长度5个字节,低字节在前 local RX_ADDR_P2 = 0x0C --数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等 local RX_ADDR_P3 = 0x0D --数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等 local RX_ADDR_P4 = 0x0E --数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等 local RX_ADDR_P5 = 0x0F --数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等 local TX_ADDR = 0x10 --发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与地址相等 local RX_PW_P0 = 0x11 --接收数据通道0有效数据宽度(1~32字节),设置为0则非法 local RX_PW_P1 = 0x12 --接收数据通道1有效数据宽度(1~32字节),设置为0则非法 local RX_PW_P2 = 0x13 --接收数据通道2有效数据宽度(1~32字节),设置为0则非法 local RX_PW_P3 = 0x14 --接收数据通道3有效数据宽度(1~32字节),设置为0则非法 local RX_PW_P4 = 0x15 --接收数据通道4有效数据宽度(1~32字节),设置为0则非法 local RX_PW_P5 = 0x16 --接收数据通道5有效数据宽度(1~32字节),设置为0则非法 local NRF_FIFO_STATUS = 0x17 --FIFO状态寄存器;bit0:RX FIFO寄存器空标志;bit1:RX FIFO满标志;bit2~3保留 --bit4:TX FIFO 空标志;bit5:TX FIFO满标志;bit6:1,循环发送上一数据包.0,不循环 local DYNPD = 0x1C local FEATRUE = 0x1D local MASK_RX_DR = 6 local MASK_TX_DS = 5 local MASK_MAX_RT = 4 local EN_CRC = 3 local CRCO = 2 local PWR_UP = 1 local PRIM_RX = 0 local ENAA_P5 = 5 local ENAA_P4 = 4 local ENAA_P3 = 3 local ENAA_P2 = 2 local ENAA_P1 = 1 local ENAA_P0 = 0 local ERX_P5 = 5 local ERX_P4 = 4 local ERX_P3 = 3 local ERX_P2 = 2 local ERX_P1 = 1 local ERX_P0 = 0 local AW_RERSERVED = 0x0 local AW_3BYTES = 0x1 local AW_4BYTES = 0x2 local AW_5BYTES = 0x3 local ARD_250US = (0x00<<4) local ARD_500US = (0x01<<4) local ARD_750US = (0x02<<4) local ARD_1000US = (0x03<<4) local ARD_2000US = (0x07<<4) local ARD_4000US = (0x0F<<4) local ARC_DISABLE = 0x00 local ARC_15 = 0x0F local CONT_WAVE = 7 local RF_DR_LOW = 5 local PLL_LOCK = 4 local RF_DR_HIGH = 3 -- bit2-bit1: local PWR_18DB = (0x00<<1) local PWR_12DB = (0x01<<1) local PWR_6DB = (0x02<<1) local PWR_0DB = (0x03<<1) local RX_DR = 6 local TX_DS = 5 local MAX_RT = 4 -- for bit3-bit1, local TX_FULL_0 = 0 local RPD = 0 local TX_REUSE = 6 local TX_FULL_1 = 5 local TX_EMPTY = 4 -- bit3-bit2, reserved, only '00' local RX_FULL = 1 local RX_EMPTY = 0 local DPL_P5 = 5 local DPL_P4 = 4 local DPL_P3 = 3 local DPL_P2 = 2 local DPL_P1 = 1 local DPL_P0 = 0 local EN_DPL = 2 local EN_ACK_PAY = 1 local EN_DYN_ACK = 0 local IRQ_ALL = ( (1<