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=366us
Clock_125K(NxRC * LF_RC_TIME,LF_Send_CHx);// 关闭时间12*30.5us=366us
}
//AS3933曼彻斯特编码 编码 0:0到1跳变 编码0持续时间366us
else
{
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 CarrierBurst(u8 LF_Send_CHx,u16 Bit_Tim) */
/*************************** 125KHz载波信号时间 **********************************/
/* LF_Send_CHx 选择调制发送通道 */
/* Bit_Tim 编码的时间 */
/********************************************************************************************/
void CarrierBurst(u8 LF_Send_CHx,u16 Bit_Tim)
{
unsigned int i;
if(ONOFF_SCAN) //scan模式
Out_125K(3200,LF_Send_CHx); //开启载波 3000us
else //ON/OFF模式
Out_125K(2200,LF_Send_CHx); //开启载波 2200us
Clock_125K(Bit_Tim,LF_Send_CHx); //停止125K信号
if(LFSENDMODE) //模式: 载波+前导+模式+正文
{
for(i = 0;i < 6;i ++) //至少3组10
{
Out_125K(Bit_Tim,LF_Send_CHx); //开启125K信号 为1
Clock_125K(Bit_Tim,LF_Send_CHx); //停止125K信号 为0
}
}
}
125K载波频率,CarrierBurst至少发布3组10,即 101010.
前导+模式:
/********************************************************************************************/
/* 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
正文:
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=366us
Clock_125K(NxRC * LF_RC_TIME,LF_Send_CHx);// 关闭时间12*30.5us=366us
}
//AS3933曼彻斯特编码 编码 0:0到1跳变 编码0持续时间366us
else
{
Clock_125K(NxRC * LF_RC_TIME,LF_Send_CHx);
Out_125K(NxRC * LF_RC_TIME,LF_Send_CHx);
}
}
}
125K 输出调制:
void Out_125K(u16 tim, u8 LF_Send_CHx) //输出125K的波形
{
switch(LF_Send_CHx)
{
case LF_SEND_CH1: CH1_GPIO_OPEN; //开始输出125K
Delay_US(tim); //开启的持续时间
break;
case LF_SEND_CH2: CH2_GPIO_OPEN; //开始输出125K
Delay_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