打开自动应答时,01两个通道都需要打开AA

This commit is contained in:
nnhy 2015-12-18 09:51:40 +00:00
parent c4e1573c14
commit 793203ef6f
4 changed files with 27 additions and 47 deletions

View File

@ -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);

View File

@ -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最大功率

View File

@ -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;

View File

@ -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;