打开自动应答时,01两个通道都需要打开AA
This commit is contained in:
parent
c4e1573c14
commit
793203ef6f
|
@ -214,7 +214,7 @@ NRF24L01::NRF24L01()
|
||||||
memcpy(Local, (byte*)Sys.ID, ArrayLength(Local));
|
memcpy(Local, (byte*)Sys.ID, ArrayLength(Local));
|
||||||
Channel = 0; // 默认通道0
|
Channel = 0; // 默认通道0
|
||||||
|
|
||||||
PayloadWidth= 32;
|
DynPayload = true;
|
||||||
AutoAnswer = true;
|
AutoAnswer = true;
|
||||||
Speed = 250;
|
Speed = 250;
|
||||||
RadioPower = 0xFF;
|
RadioPower = 0xFF;
|
||||||
|
@ -384,12 +384,8 @@ bool NRF24L01::Config()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
debug_printf(" 传输速率: ");
|
debug_printf(" 传输速率: %dkbps\r\n", Speed);
|
||||||
if(Speed >= 1000)
|
debug_printf(" 负载大小: %d字节\r\n", DynPayload ? 0 : 32);
|
||||||
debug_printf("%dMbps\r\n", Speed/1000);
|
|
||||||
else
|
|
||||||
debug_printf("%dkbps\r\n", Speed);
|
|
||||||
debug_printf(" 负载大小: %d字节\r\n", PayloadWidth);
|
|
||||||
debug_printf(" 自动应答: %s\r\n", AutoAnswer ? "true" : "false");
|
debug_printf(" 自动应答: %s\r\n", AutoAnswer ? "true" : "false");
|
||||||
if(AutoAnswer)
|
if(AutoAnswer)
|
||||||
debug_printf(" 重试周期: %dus + 86us\r\n", 500);
|
debug_printf(" 重试周期: %dus + 86us\r\n", 500);
|
||||||
|
@ -634,46 +630,31 @@ void NRF24L01::SetAddress()
|
||||||
WriteBuf(RX_ADDR_P0, Array(Local, 5));
|
WriteBuf(RX_ADDR_P0, Array(Local, 5));
|
||||||
|
|
||||||
// 主节点再监听一个全0的地址
|
// 主节点再监听一个全0的地址
|
||||||
byte bits = 0x03;
|
ByteArray bs((byte)0xFF, 5);
|
||||||
if(Master)
|
if(Master) bs.Set(0x00, 0, 5);
|
||||||
{
|
WriteBuf(RX_ADDR_P1, bs);
|
||||||
bits = 0x07;
|
|
||||||
WriteBuf(RX_ADDR_P1, ByteArray((byte)0x00, 5));
|
// 设置接收端的数据宽度
|
||||||
}
|
WriteReg(RX_PW_P0, 32);
|
||||||
else
|
WriteReg(RX_PW_P1, 32);
|
||||||
{
|
|
||||||
WriteBuf(RX_ADDR_P1, ByteArray((byte)0xFF, 5));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使能接收端的自动应答和接收通道
|
// 使能接收端的自动应答和接收通道
|
||||||
WriteReg(EN_AA, AutoAnswer ? 0x01 : 0);
|
WriteReg(EN_AA, AutoAnswer ? 0x03 : 0);
|
||||||
WriteReg(EN_RXADDR, bits);
|
WriteReg(EN_RXADDR, 0x03);
|
||||||
|
|
||||||
// 开启隐藏寄存器
|
// 开启隐藏寄存器
|
||||||
WriteReg(ACTIVATE, 0x73);
|
WriteReg(ACTIVATE, 0x73);
|
||||||
|
|
||||||
RF_FEATURE ft;
|
RF_FEATURE ft;
|
||||||
ft.Init(ReadReg(FEATURE));
|
ft.Init(ReadReg(FEATURE));
|
||||||
|
ft.DPL = DynPayload; // 使能动态负载长度
|
||||||
// 设置接收端的数据宽度
|
ft.DYN_ACK = !AutoAnswer; // 使能命令TX_PAYLOAD_NOACK
|
||||||
if(PayloadWidth > 0)
|
|
||||||
{
|
|
||||||
WriteReg(RX_PW_P0, PayloadWidth);
|
|
||||||
WriteReg(RX_PW_P1, PayloadWidth);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 动态负载
|
|
||||||
WriteReg(DYNPD, 0x3F); // 打开6个通道的动态负载
|
|
||||||
|
|
||||||
ft.DPL = 1; // 使能动态负载长度
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!AutoAnswer)
|
|
||||||
ft.DYN_ACK = 1; // 使能命令TX_PAYLOAD_NOACK
|
|
||||||
//ft.ACK_PAYD = 1; // 使能ACK负载(带负载数据的ACK包)
|
//ft.ACK_PAYD = 1; // 使能ACK负载(带负载数据的ACK包)
|
||||||
|
|
||||||
WriteReg(FEATURE, ft.ToByte());
|
WriteReg(FEATURE, ft.ToByte());
|
||||||
|
|
||||||
|
// 动态负载
|
||||||
|
if(DynPayload) WriteReg(DYNPD, 0x03); // 打开6个通道的动态负载
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowStatusTask(void* param)
|
void ShowStatusTask(void* param)
|
||||||
|
@ -801,10 +782,8 @@ uint NRF24L01::OnRead(Array& bs)
|
||||||
// 清除中断标志
|
// 清除中断标志
|
||||||
//WriteReg(STATUS, Status);
|
//WriteReg(STATUS, Status);
|
||||||
|
|
||||||
if(PayloadWidth > 0)
|
rs = 32;
|
||||||
rs = PayloadWidth;
|
if(DynPayload) rs = ReadReg(RX_PL_WID);
|
||||||
else
|
|
||||||
rs = ReadReg(RX_PL_WID);
|
|
||||||
|
|
||||||
uint len = bs.Capacity();
|
uint len = bs.Capacity();
|
||||||
if(rs > len)
|
if(rs > len)
|
||||||
|
@ -844,9 +823,10 @@ bool NRF24L01::SendTo(const Array& bs, const Array& addr)
|
||||||
byte cmd = AutoAnswer ? WR_TX_PLOAD : TX_NOACK;
|
byte cmd = AutoAnswer ? WR_TX_PLOAD : TX_NOACK;
|
||||||
// 检查要发送数据的长度
|
// 检查要发送数据的长度
|
||||||
uint len = bs.Length();
|
uint len = bs.Length();
|
||||||
if(PayloadWidth && len > PayloadWidth) debug_printf("%d > %d \r\n", len, PayloadWidth);
|
byte pw = 32;
|
||||||
assert_param(PayloadWidth == 0 || len <= PayloadWidth);
|
if(pw && len > pw) debug_printf("%d > %d \r\n", len, pw);
|
||||||
if(PayloadWidth > 0) len = PayloadWidth;
|
assert_param(pw == 0 || len <= pw);
|
||||||
|
if(pw > 0) len = pw;
|
||||||
Array bs2(bs.GetBuffer(), len);
|
Array bs2(bs.GetBuffer(), len);
|
||||||
WriteBuf(cmd, bs2);
|
WriteBuf(cmd, bs2);
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ public:
|
||||||
byte Local[5]; // 本地地址
|
byte Local[5]; // 本地地址
|
||||||
byte Remote[5]; // 远程地址
|
byte Remote[5]; // 远程地址
|
||||||
|
|
||||||
byte PayloadWidth; // 负载数据宽度,默认32字节。0表示使用动态负载
|
bool DynPayload; // 动态负载
|
||||||
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最大功率
|
||||||
|
|
|
@ -71,8 +71,8 @@ ITransport* Create2401(SPI_TypeDef* spi_, Pin ce, Pin irq, Pin power, bool power
|
||||||
nrf->Init(spi, ce, irq, power);
|
nrf->Init(spi, ce, irq, power);
|
||||||
|
|
||||||
auto tc = TinyConfig::Current;
|
auto tc = TinyConfig::Current;
|
||||||
nrf->AutoAnswer = false;
|
nrf->AutoAnswer = true;
|
||||||
nrf->PayloadWidth = 32;
|
nrf->DynPayload = true;
|
||||||
//nrf->Channel = tc->Channel;
|
//nrf->Channel = tc->Channel;
|
||||||
nrf->Channel = 120;
|
nrf->Channel = 120;
|
||||||
nrf->Speed = tc->Speed;
|
nrf->Speed = tc->Speed;
|
||||||
|
|
|
@ -217,7 +217,7 @@ ITransport* Token::Create2401(SPI_TypeDef* spi_, Pin ce, Pin irq, Pin power, boo
|
||||||
|
|
||||||
auto tc = TinyConfig::Current;
|
auto tc = TinyConfig::Current;
|
||||||
nrf.AutoAnswer = true;
|
nrf.AutoAnswer = true;
|
||||||
nrf.PayloadWidth= 32;
|
nrf.DynPayload = true;
|
||||||
//nrf.Channel = tc->Channel;
|
//nrf.Channel = tc->Channel;
|
||||||
nrf.Channel = 120;
|
nrf.Channel = 120;
|
||||||
nrf.Speed = tc->Speed;
|
nrf.Speed = tc->Speed;
|
||||||
|
|
Loading…
Reference in New Issue