金牌会员
- 积分
- 1240
- 金钱
- 1240
- 注册时间
- 2013-1-11
- 在线时间
- 430 小时
|
10金钱
本帖最后由 aozhouduwang 于 2020-9-26 00:52 编辑
@1209943162 @andychen
CAD手册流程如下:
1.PLL被锁定。
2.无线接收机从信道获取数据的LoRa前导码符号。在期间的电流消耗对应指定的Rx模式电流。
3.无线接收机及PLL被关闭,调制解调器数字处理开始执行。
4.调制解调器搜索芯片所获取样本与理想前导码波形之间的关联关系。建立这样的关联关系所需的时间仅略小于一个符号周期。在此期间,电流的消耗大幅减少。
5.完成计算后,调制解调器产生CadDone中断信号。如果关联成功,则会同时产生CadDetected信号。
6.芯片恢复到待机模式。
7.如果发现前导码,清除中断,然后将芯片设置为Rx单一或连续模式,从而开始接收数据。
问题:
1.配置CAD INIT后,就会有CAD Done中断,但那个CadDetected什么时候会来呢?
手册写的完成计算后,有CadDone中断,是完成什么计算呢?关联成功,是不是相当于和发射机那边匹配完成就关联成功?然后进入接收模式收数据。
我的理解,CADInit完成后,开始检测,检测完成后,至CadDone,如果有合适的发送机匹配就CadDetected,如果没有则退出。不知道这样理解是否正确???
2.CAD检测时间内,芯片在(2SF+32)/BW秒钟处于接收模式,其余时间则处于低功耗状态。
- WriteRfReq(SX127X_LR_MODEMCONFIG1, RFLR_MODEMCONFIG1_BW_250_KHZ + RFLR_MODEMCONFIG1_CODINGRATE_4_7 + RFLR_MODEMCONFIG1_IMPLICITHEADER_ON);
- WriteRfReq(SX127X_LR_MODEMCONFIG2, RFLR_MODEMCONFIG2_SF_9 | RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON);
复制代码 如果配置这样,是不是CAD检测时间=(2*SF_9+32)/BW_250_KHZ=(2*144+32/128=2秒呢
3.发送机那边以300ms发送数据(有TXDone中断),接收机这边收不到CadDetected,,有2秒的检测时间,应该可以收到但一直没有CadDetected?
4.发现一个问题,把发送机电源关掉,接收机不停的CADInit(3秒一次,大于第二条算的时间),尽然会进入RF_IO4脚中断。读状态寄存器是CadDone中断,
疑问,CadDone是在RF_IO0,CadDetected是在RF_IO4。感觉混乱了。中断肯定没问题。
部分程序
- if((P2IN & BIT6) == BIT6) //RF_IO0
- {
- mRunFlag.flag.cadTxRxDoneFlag=1;
- }
- if((P2IN & BIT7) == BIT7)
- {
- mRunFlag.flag.cadDetectedFlag=1; //RF_IO4
- }
复制代码- Boolean RfEnterCADMode()
- {
- WriteRfReq(SX127X_LR_DIOMAPPING1, 0x80);
- WriteRfReq(SX127X_LR_DIOMAPPING2, 0x00);
- WriteRfReq( SX127X_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_CADDETECTED_MASK + RFLR_IRQFLAGS_CADDONE_MASK));//允许CADDETECTED和CADDONE中断,而屏蔽其他中断
- WriteRfReq( SX127X_LR_OPMODE, 0x80 | RFLR_OPMODE_CAD);
- }
复制代码- //LoRaInit
- ret = ReadRfReq(SX127X_LR_RegPacketConfig2);
- WriteRfReq(SX127X_LR_RegPacketConfig2, ret&0x7F);
- WriteRfReq(SX127X_LR_RegSyncValue8, 0x40);
- WriteRfReq(SX127X_LR_RegPacketConfig1, 0x00);
- WriteRfReq(SX127X_LR_PACONFIG, 0xFF);//输出20dbm
- WriteRfReq(SX127X_LR_PADAC, RFLR_PADAC_20DBM_ON);//允许运行开启20dbm在PA_BOOSTpin.
- WriteRfReq(SX127X_LR_PARAMP, RFLR_PARAMP_1000_US); //功率斜率控制.1mS
- WriteRfReq(SX127X_LR_OCP, 0x20 | RFLR_OCP_TRIM_240_MA);//触发过流保护电流
- //Lora寄存器模式操作
- WriteRfReq(SX127X_LR_PAYLOADLENGTH, 2);
- WriteRfReq(SX127X_LR_MODEMCONFIG3, RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON | RFLR_MODEMCONFIG3_AGCAUTO_ON); //低速率和内部AGC自动控制
- //暂时显示模式 250KHz 4_7
- WriteRfReq(SX127X_LR_MODEMCONFIG1, RFLR_MODEMCONFIG1_BW_250_KHZ + RFLR_MODEMCONFIG1_CODINGRATE_4_7 + RFLR_MODEMCONFIG1_IMPLICITHEADER_ON);
- WriteRfReq(SX127X_LR_MODEMCONFIG2, RFLR_MODEMCONFIG2_SF_9 | RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON);
- WriteRfReq(SX127X_LR_PREAMBLELSB,6);
- WriteRfReq(SX127X_LR_PAYLOADLENGTH, 0x02);
- WriteRfReq(SX127X_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
- WriteRfReq( SX127X_LR_FRFMSB, Freq_Cal_Tab[i]); //set frequency
- WriteRfReq( SX127X_LR_FRFMID, Freq_Cal_Tab[i + 1]);
- WriteRfReq( SX127X_LR_FRFLSB, Freq_Cal_Tab[i + 2]);
复制代码- void OnCadTxRxDoneEvent(void)
- {
- unsigned char RfIsrState;//RF中断状态字
- __disableInterrupts();
- RfIsrState = ReadRfReq(SX127X_LR_IRQFLAGS);
- __enabledInterrupts();
-
- if(RfIsrState & RFLR_IRQFLAGS_CADDONE)
- {
- __disableInterrupts();
- WriteRfReq(SX127X_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE); //清除此中断标志
- __enabledInterrupts();
复制代码- void OnCadDetectedEvent(void)
- {
- unsigned char RfIsrState;
- __disableInterrupts();
- RfIsrState = ReadRfReq(SX127X_LR_IRQFLAGS);
- __enabledInterrupts();
- if((RfIsrState & RFLR_IRQFLAGS_CADDETECTED))
- {
- __disableInterrupts();
- WriteRfReq(SX127X_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE |\
- RFLR_IRQFLAGS_CADDETECTED); //清除CAD和CADDETECTED
- RfEnterLowPwrMode();
- RfEnterRxMode(2,IMPLICIT);
- __enabledInterrupts();
复制代码
|
最佳答案
查看完整内容[请看2#楼]
老铁,CAD模式调通了吗?我现在也遇到了和你一样的问题,示波器能检测到CADdone,检测不到CADdetected中断,可以加qq嘛,我想向您请教一下qq:404743046
|