近场感应 125K 曼彻斯特编码调制发送
AS3393 125K 曼彻斯特编码调制 发送:


Tclk为AS3933的时钟32.768KHz, LF_RC_TIME=1s/32.768KHz = 30.517us
Tcarr为125KHz, Tcarr_TIME= 1s/125k= 8us
AS3933的曼彻斯特编码发送: 1为下降沿跳变, 0为上升沿跳变.
调制发送程序: 载波信号+前导+模式+正文
/********************************************************************************************/
/* void LF_SendData(u8 R6_Dat,u8 R5_Dat,u8 Patt16_32,u16 Send_Dat,u8 Advabce_TIM,u8 NxRC) */
/* R6_Dat ----- Pattern1 对应AS3393 R6寄存器的值 第1个唤醒前导码*/
/* R5_Dat ----- Pattern2 对应AS3393 R5寄存器的值 第2个唤醒前导码 */
/* Patt16_32 Pattern的编码位数 */
/* Send_Dat_Len 发送的数据的长度*/
/* LF_Send_CHx 选择哪一个通道调制发送 */
/* NxRC 编码的速率 4 --- 32 */
/********************************************************************************************/void LF_SendData(u8 R6_Dat,u8 R5_Dat,u8 Patt16_32,u16 Send_Dat_Len,u8 LF_Send_CHx,u8 NxRC)
{u8 i,j;u8 temp = 0;u8 Data_Buff[9];if((NxRC < 4)||(NxRC > 32)) return; Data_Buff[0] = ACTIVE_ID1; Data_Buff[1] = ACTIVE_ID2; Data_Buff[2] = ACTIVE_ID3; Data_Buff[3] = ACTIVE_ID4; Data_Buff[4] = ACTIVE_ID5; Data_Buff[5] = ACTIVE_ID6;Data_Buff[6] = ACTIVE_ID7; Data_Buff[7] = ACTIVE_ID8; Data_Buff[8] = ACTIVE_ID9; CarrierBurst(LF_Send_CHx,NxRC * LF_RC_TIME); //发送起始 if(LFSENDMODE) //唤醒机制:载波信号+前导+模式+正文{Pattern(R6_Dat,R5_Dat,Patt16_32,LF_Send_CHx,NxRC * LF_RC_TIME); //模式字 (和AS3393寄存器配置一致,修改此值已达到和AS3933的配对使用。)}for(i = 0;i < Send_Dat_Len;i ++) //发送字节长度 , 即激活的ID字节数{ for(j = 0;j < 8;j ++) //发送一个字节{temp = Data_Buff[i] & 0x80;Data_Buff[i]= Data_Buff[i] << 1;//AS3933曼彻斯特编码 编码1: 1到0跳变 编码1持续时间366us if(temp == 0x80) //0x80 = 1000 0000 {Out_125K(NxRC * LF_RC_TIME,LF_Send_CHx); // NxRC=0x0c= 12 LF_RC_TIME=30.5us //32768K// 开通时间12*30.5us=366usClock_125K(NxRC * LF_RC_TIME,LF_Send_CHx);// 关闭时间12*30.5us=366us}//AS3933曼彻斯特编码 编码 0:0到1跳变 编码0持续时间366uselse { Clock_125K(NxRC * LF_RC_TIME,LF_Send_CHx); Out_125K(NxRC * LF_RC_TIME,LF_Send_CHx); }}}CH1_GPIO_CLOCK;CH2_GPIO_CLOCK;
}
.Carrier Burst: 125KHz载波信号时长配置,唤醒AS3393
Carrier Burst为125KHz载波信号,
长度最少16Tclk + 16Tcarr.Tclk为AS3933的时钟32.768KHz,Tcarr为125KHz,
则最小时间为16 * 30.5us + 16 * 8us = 616us.
最大长度要小于155Tclk,155*30.5us=4727.5us.

载波信号:
/********************************************************************************************/
/* void Pattern(u8 R6_Dat,u8 R5_Dat,u8 Patt16_32,u8 LF_Send_CHx,u16 Bit_Tim) */
/*************************** 发送前导码模式数据 **********************************/
/* R6_Dat ----- Pattern1 对应AS3393 R6寄存器的值 第1个唤醒前导码*/
/* R5_Dat ----- Pattern2 对应AS3393 R5寄存器的值 第2个唤醒前导码 */
/* Patt16_32 Pattern的编码位数 */
/* LF_Send_CHx 选择调制发送通道 */
/* Bit_Tim 编码时间 */
/********************************************************************************************/void Pattern(u8 R6_Dat,u8 R5_Dat,u8 Patt16_32,u8 LF_Send_CHx,u16 Bit_Tim) //发送模式字 0 - 16bit, 1 - 32bit
{u8 i;u16 Patt_Data = 0;Patt_Data = R6_Dat * 256 + R5_Dat;if(Patt16_32 == Patt_32bit){for(i = 0;i < 16;i ++){if(Patt_Data & 0x8000) //取数据高8位{Out_125K(Bit_Tim,LF_Send_CHx);Clock_125K(Bit_Tim,LF_Send_CHx); }else{Clock_125K(Bit_Tim,LF_Send_CHx);Out_125K(Bit_Tim,LF_Send_CHx); }Patt_Data = Patt_Data << 1; } }else{for(i = 0;i < 16;i ++){if(Patt_Data & 0x8000) {Out_125K(Bit_Tim,LF_Send_CHx); }else{Clock_125K(Bit_Tim,LF_Send_CHx); }Patt_Data = Patt_Data << 1; }}
}
Bit_Tim = NxRC * LF_RC_TIME = 366us;
NxRC=0x0c= 12 ;
LF_RC_TIME=30.5us;
Preamble和Pattern总长度有限制.
当Pattern为16位时,总长度不能大于30个曼彻斯特码元,即 Patt_16bit_time≤ 30*8us=240us
当Pattern为32位时,总长度不能大于46个曼彻斯特码元. 即 Patt_32bit_time ≤ 46*8us=368us

正文:
void Out_125K(u16 tim, u8 LF_Send_CHx) //输出125K的波形
{switch(LF_Send_CHx){case LF_SEND_CH1: CH1_GPIO_OPEN; //开始输出125KDelay_US(tim); //开启的持续时间 break;case LF_SEND_CH2: CH2_GPIO_OPEN; //开始输出125KDelay_US(tim); //开启的持续时间break; default:break;}
}void Clock_125K(u16 tim, u8 LF_Send_CHx) //关闭输出125K的波形
{switch(LF_Send_CHx){case LF_SEND_CH1: CH1_GPIO_CLOCK; //停止输出125k Delay_US(tim);break;case LF_SEND_CH2: CH2_GPIO_CLOCK;; //停止输出125k Delay_US(tim);break; default:break;}
}#define Patt_16bit 0
#define Patt_32bit 1
#define LF_SEND_CH1 1 //LF发送通道
#define LF_SEND_CH2 2
#define LF_RC_TIME 30.5 //32768K 周期时间 30.5us#define digitalHi(p,i) {p->BSRR=i;} //输出高电平
#define digitalLo(p,i) {p->BRR=i;} //输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态#define CH1_GPIO_OPEN digitalHi(GPIOA,GPIO_Pin_8);digitalHi(GPIOB,GPIO_Pin_15);
#define CH1_GPIO_CLOCK digitalLo(GPIOA,GPIO_Pin_8);digitalLo(GPIOB,GPIO_Pin_15);#define CH2_GPIO_OPEN digitalHi(GPIOA,GPIO_Pin_2);digitalHi(GPIOA,GPIO_Pin_3);
#define CH2_GPIO_CLOCK digitalLo(GPIOA,GPIO_Pin_2);digitalLo(GPIOA,GPIO_Pin_3);
参考: https://blog.csdn.net/jdh99/article/details/8677187
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
