wor功能配置代码:
void a7139_wor(void) {
//A7139_WritePageA(8,0x0445);//GPIO1 按帧同步 GPIO2 单片机唤醒
A7139_WritePageA(8,0x0005);//GPIO1 按帧同步 只用一个引脚 唤醒单片机。
A7139_WritePageA(1,0x8013); 活动时间8ms 睡眠时间 152ms
RCOSC_Cal(); // rc时钟校准
A7139_WritePageA(2,0x0030); 开启rc时钟 和前导码唤醒
A7139_WriteReg(0xd,0x0800); //选择strobe命令控制 wor功能开启
A7139_WriteReg(0xf, 0x22C0);// 选择fifo模式 wor功能开启
}
1. 配置wor 1 寄存器。 活动周期和睡眠周期根据需要配置。但是活动周期必须要保证能接收到一串数据。活动时间越短功耗越低,睡眠周期越长功耗越低。
A7139_WritePageA(1,0x8013); //活动周期8ms,睡眠周期152ms
2.配置wor 2寄存器。唤醒次数根据实际情况设置,默认为1次。唤醒选择配置为前导码唤醒。开启rc时钟。 唤醒 MCU 模式选择 :通过 WOR 模式,在接收到包后唤醒 MCU
3.配置GPIO寄存器。 把GIO1配制成 帧同步信号,把GIO2 配制成单片机唤醒信号。
4.在管脚控制寄存器(0D h)和模式控制(0F h)里把wor功能打开,并把模块设置成FIFO模式。
注意:
a.接收方的前导码必须大于0 ,小于等于发射方的前导码
b.GIO管脚必须配制成中断,只有中断才能检测信号变化。
c.在有很多射频信号的地方,前导码设置过短芯片会被误触发。(检测前导码8B 仅供参考)
d.活动时间设置必须要保证能检测到完整的前导码。前导码越长,活动时间越长。
e.唤醒单片机后需要延时一段时间才能读出数据(100ms 仅供参考)
中断:
void EXTI0_IRQHandler(void){
EXTI_ClearITPendingBit(EXTI_Line0); //
delay_ms(100);
A7139_ReadFIFO(datatemp,18); 进入中断函数后读取fifo里面的数据
if(datatemp313[17]==0x5a)
{
datatemp[0]=0x00;
}
}
//void EXTI1_IRQHandler(void) {
// EXTI_ClearITPendingBit(EXTI_Line1);
//}
void RCOSC_Cal(void) // RC时钟 校准
{
uint16_t tmp;
A7139_WritePageA(WOR2_PAGEA, A7139Config_PageA[WOR2_PAGEA] | 0x0010); //enable RC OSC
while(1)
{
A7139_WritePageA(WCAL_PAGEA, A7139Config_PageA[WCAL_PAGEA] | 0x0001); //set ENCAL=1 to start RC OSC CAL
do{
tmp = A7139_ReadPageA(WCAL_PAGEA);
}while(tmp & 0x0001);
tmp = (A7139_ReadPageA(WCAL_PAGEA) & 0x03FF); //read NUMLH[8:0]
tmp >>= 1;
if((tmp > 183) && (tmp < 205)) //NUMLH[8:0]=194+-10 (PF8M=6.4M)
// if((tmp > 232) && (tmp < 254)) //NUMLH[8:0]=243+-10 (PF8M=8M)
{
A7139_WritePageA(WCAL_PAGEA,0x0000); //结束后清零
break;
}
}
}