为了配合2401主从模式,调整2401驱动配合微网协议,2401只使用本地地址、远程地址、全广播地址0x00和主节点广播地址0xFF。
编译通过,网关C测试通过,暂时兼容旧节点
This commit is contained in:
parent
43b0bd7848
commit
15991c1bec
|
@ -210,19 +210,17 @@ NRF24L01::NRF24L01()
|
||||||
_spi = NULL;
|
_spi = NULL;
|
||||||
|
|
||||||
// 初始化地址
|
// 初始化地址
|
||||||
memset(Address, 0, ArrayLength(Address));
|
memset(Remote, 0, ArrayLength(Remote));
|
||||||
memcpy(Address1, (byte*)Sys.ID, ArrayLength(Address1));
|
memcpy(Local, (byte*)Sys.ID, ArrayLength(Local));
|
||||||
for(int i=0; i<ArrayLength(Addr2_5); i++) Addr2_5[i] = Address1[0] + i + 1;
|
|
||||||
Channel = 0; // 默认通道0
|
Channel = 0; // 默认通道0
|
||||||
AddrBits = 0x01; // 默认使能地址0
|
|
||||||
|
|
||||||
PayloadWidth= 32;
|
PayloadWidth= 32;
|
||||||
AutoAnswer = true;
|
AutoAnswer = true;
|
||||||
Speed = 250;
|
Speed = 250;
|
||||||
RadioPower = 0xFF;
|
RadioPower = 0xFF;
|
||||||
|
Master = false;
|
||||||
|
|
||||||
Error = 0;
|
Error = 0;
|
||||||
AddrLength = 0;
|
|
||||||
|
|
||||||
_tidOpen = 0;
|
_tidOpen = 0;
|
||||||
_tidRecv = 0;
|
_tidRecv = 0;
|
||||||
|
@ -368,25 +366,10 @@ bool NRF24L01::Config()
|
||||||
if(st.Beken) debug_printf("上海Beken芯片\r\n");
|
if(st.Beken) debug_printf("上海Beken芯片\r\n");
|
||||||
|
|
||||||
debug_printf(" 本地地址: ");
|
debug_printf(" 本地地址: ");
|
||||||
ByteArray(Address, 5).Show(true);
|
ByteArray(Local, 5).Show(true);
|
||||||
|
debug_printf(" 远程地址: ");
|
||||||
|
ByteArray(Remote, 5).Show(true);
|
||||||
|
|
||||||
// 根据AddrBits决定相应通道是否打开
|
|
||||||
byte bits = AddrBits >> 1;
|
|
||||||
if(bits & 0x01)
|
|
||||||
{
|
|
||||||
debug_printf(" Addres1: ");
|
|
||||||
ByteArray(Address1, 5).Show(true);
|
|
||||||
}
|
|
||||||
for(int i=0; i<4; i++)
|
|
||||||
{
|
|
||||||
bits >>= 1;
|
|
||||||
if(bits & 0x01)
|
|
||||||
{
|
|
||||||
debug_printf(" Addres%d: ", i + 2);
|
|
||||||
ByteArray(Addr2_5 + i, 1).Show(true);
|
|
||||||
ByteArray(Address1 + 1, 4).Show(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static const short powers[] = {-12, -6, -4, 0, 1, 3, 4, 7};
|
static const short powers[] = {-12, -6, -4, 0, 1, 3, 4, 7};
|
||||||
auto rp = RadioPower;
|
auto rp = RadioPower;
|
||||||
if(rp >= ArrayLength(powers)) rp = ArrayLength(powers) - 1;
|
if(rp >= ArrayLength(powers)) rp = ArrayLength(powers) - 1;
|
||||||
|
@ -573,12 +556,18 @@ bool NRF24L01::SetMode(bool isReceive)
|
||||||
config.PRIM_RX = 1;
|
config.PRIM_RX = 1;
|
||||||
// 接收标识位 RX_DR
|
// 接收标识位 RX_DR
|
||||||
WriteReg(STATUS, 0x40);
|
WriteReg(STATUS, 0x40);
|
||||||
|
|
||||||
|
// 接收模式,0通道使用本地地址
|
||||||
|
WriteBuf(RX_ADDR_P0, Array(Local, 5));
|
||||||
}
|
}
|
||||||
else // 发送模式
|
else // 发送模式
|
||||||
{
|
{
|
||||||
config.PRIM_RX = 0;
|
config.PRIM_RX = 0;
|
||||||
// 发送标识位 TX_DS/MAX_RT
|
// 发送标识位 TX_DS/MAX_RT
|
||||||
WriteReg(STATUS, 0x30);
|
WriteReg(STATUS, 0x30);
|
||||||
|
|
||||||
|
// 发送模式,0通道使用远程地址
|
||||||
|
WriteBuf(RX_ADDR_P0, Array(Remote, 5));
|
||||||
}
|
}
|
||||||
WriteReg(CONFIG, config.ToByte());
|
WriteReg(CONFIG, config.ToByte());
|
||||||
|
|
||||||
|
@ -627,33 +616,25 @@ void NRF24L01::SetAddress()
|
||||||
{
|
{
|
||||||
TS("R24::SetAddress");
|
TS("R24::SetAddress");
|
||||||
|
|
||||||
uint addrLen = ArrayLength(Address);
|
// 设置地址宽度
|
||||||
Array bs(Address, ArrayLength(Address));
|
WriteReg(SETUP_AW, 5 - 2);
|
||||||
|
|
||||||
WriteBuf(TX_ADDR, bs);
|
// 发送地址为远程地址,0通道为本地地址,1通道为广播地址
|
||||||
WriteBuf(RX_ADDR_P0, bs); // 写接收端0地址
|
WriteBuf(TX_ADDR, Array(Remote, 5));
|
||||||
WriteReg(SETUP_AW, addrLen - 2); // 设置地址宽度
|
WriteBuf(RX_ADDR_P0, Array(Local, 5));
|
||||||
|
WriteBuf(RX_ADDR_P1, ByteArray((byte)0, 5));
|
||||||
|
|
||||||
ByteArray addr(Address1, addrLen, true);
|
// 主节点再监听一个全0xFF的地址
|
||||||
byte bits = AddrBits >> 1;
|
byte bits = 0x03;
|
||||||
if(bits & 0x01)
|
if(Master)
|
||||||
{
|
{
|
||||||
WriteBuf(RX_ADDR_P1, addr); // 写接收端1地址
|
bits = 0x07;
|
||||||
}
|
WriteBuf(RX_ADDR_P1, ByteArray((byte)0xFF, 5));
|
||||||
// 写其它4个接收端的地址
|
|
||||||
for(int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
bits >>= 1;
|
|
||||||
if(bits & 0x01)
|
|
||||||
{
|
|
||||||
addr[0] = Addr2_5[i];
|
|
||||||
WriteBuf(RX_ADDR_P2 + i, addr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使能6个接收端的自动应答和接收
|
// 使能接收端的自动应答和接收通道
|
||||||
WriteReg(EN_AA, AutoAnswer ? AddrBits : 0); // 使能通道0的自动应答
|
WriteReg(EN_AA, AutoAnswer ? 0x01 : 0);
|
||||||
WriteReg(EN_RXADDR, AddrBits); // 使能通道0的接收地址
|
WriteReg(EN_RXADDR, bits);
|
||||||
|
|
||||||
// 开启隐藏寄存器
|
// 开启隐藏寄存器
|
||||||
WriteReg(ACTIVATE, 0x73);
|
WriteReg(ACTIVATE, 0x73);
|
||||||
|
@ -661,13 +642,11 @@ void NRF24L01::SetAddress()
|
||||||
RF_FEATURE ft;
|
RF_FEATURE ft;
|
||||||
ft.Init(ReadReg(FEATURE));
|
ft.Init(ReadReg(FEATURE));
|
||||||
|
|
||||||
// 设置6个接收端的数据宽度
|
// 设置接收端的数据宽度
|
||||||
if(PayloadWidth > 0)
|
if(PayloadWidth > 0)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < addrLen; i++)
|
WriteReg(RX_PW_P0, PayloadWidth);
|
||||||
{
|
WriteReg(RX_PW_P1, PayloadWidth);
|
||||||
WriteReg(RX_PW_P0 + i, PayloadWidth); // 选择通道0的有效数据宽度
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -918,24 +897,22 @@ bool NRF24L01::OnWrite(const Array& bs)
|
||||||
// 引发数据到达事件
|
// 引发数据到达事件
|
||||||
uint NRF24L01::OnReceive(Array& bs, void* param)
|
uint NRF24L01::OnReceive(Array& bs, void* param)
|
||||||
{
|
{
|
||||||
//if(Led) Led->Write(1000);
|
if(!Master) return ITransport::OnReceive(bs, param);
|
||||||
|
|
||||||
if(!AddrLength) return ITransport::OnReceive(bs, param);
|
|
||||||
|
|
||||||
// 取出地址
|
// 取出地址
|
||||||
byte* addr = bs.GetBuffer();
|
byte* addr = bs.GetBuffer();
|
||||||
Array bs2(addr + AddrLength, bs.Length() - AddrLength);
|
Array bs2(addr + 5, bs.Length() - 5);
|
||||||
return ITransport::OnReceive(bs2, addr);
|
return ITransport::OnReceive(bs2, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NRF24L01::OnWriteEx(const Array& bs, void* opt)
|
bool NRF24L01::OnWriteEx(const Array& bs, void* opt)
|
||||||
{
|
{
|
||||||
if(!AddrLength || !opt) return OnWrite(bs);
|
if(!Master || !opt) return OnWrite(bs);
|
||||||
|
|
||||||
// 加入地址
|
// 加入地址
|
||||||
ByteArray bs2;
|
ByteArray bs2;
|
||||||
bs2.Copy(opt, AddrLength);
|
bs2.Copy(opt, 5);
|
||||||
bs2.Copy(bs, AddrLength);
|
bs2.Copy(bs, 5);
|
||||||
|
|
||||||
return OnWrite(bs2);
|
return OnWrite(bs2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,18 +12,16 @@ class NRF24L01 : public ITransport, public Power
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
byte Channel; // 通讯频道。物理频率号,在2400MHZ基础上加
|
byte Channel; // 通讯频道。物理频率号,在2400MHZ基础上加
|
||||||
byte Address[5]; // 通道0地址
|
byte Local[5]; // 本地地址
|
||||||
byte Address1[5]; // 通道1地址
|
byte Remote[5]; // 远程地址
|
||||||
byte Addr2_5[4]; // 通道2_5地址低字节,高4字节跟通道1一致
|
|
||||||
byte AddrBits; // 使能通道标识位。默认0x01使能地址0
|
|
||||||
|
|
||||||
byte PayloadWidth; // 负载数据宽度,默认32字节。0表示使用动态负载
|
byte PayloadWidth; // 负载数据宽度,默认32字节。0表示使用动态负载
|
||||||
bool AutoAnswer; // 自动应答,默认启用
|
bool AutoAnswer; // 自动应答,默认启用
|
||||||
ushort Speed; // 射频数据率,单位kbps,默认250kbps,可选1000kbps/2000kbps,速度越低传输越远
|
ushort Speed; // 射频数据率,单位kbps,默认250kbps,可选1000kbps/2000kbps,速度越低传输越远
|
||||||
byte RadioPower; // 发射功率。共8档,最高0x07代表7dBm最大功率
|
byte RadioPower; // 发射功率。共8档,最高0x07代表7dBm最大功率
|
||||||
|
bool Master; // 是否主节点。
|
||||||
|
|
||||||
ushort Error; // 错误次数,超过最大错误次数则自动重置
|
ushort Error; // 错误次数,超过最大错误次数则自动重置
|
||||||
byte AddrLength; // 地址长度。默认0,主站建议设为5
|
|
||||||
|
|
||||||
NRF24L01();
|
NRF24L01();
|
||||||
virtual ~NRF24L01();
|
virtual ~NRF24L01();
|
||||||
|
|
Loading…
Reference in New Issue