归零码解析

归零码

1 高低码的发送和解析

2 1Byte数据 16位 前8位 正常高低, 后8位取反,

3 数据是先发高位还是先发低位

先发高位

4 数据格式---起始4ms(高)

起始+FE 01+4MS(低)+起始+FE 01+4MS(低)+起始+FE 01

代码

#if ET_IR_SEND_CMD

#define SEND_DIR_OUT() {GPIOBDE |= BIT(3); GPIOBDIR &= ~BIT(3);}

#define SEND_H() GPIOBSET = BIT(3)

#define SEND_L() GPIOBCLR = BIT(3)

#define SEND_1() {SEND_L();delay_us(400);SEND_H();delay_us(1000);}

#define SEND_0() {SEND_L();delay_us(1000);SEND_H();delay_us(400);}

#define SEND_START() {SEND_H();delay_us(4000);}

#define SEND_INTERNAL() {SEND_L();delay_us(4000);}

void timer3_init_ex(void);

void ir_send_cmd_init(void)

{

GPIOBFEN &= ~BIT(3); //PA0作为GPIO使用

SEND_DIR_OUT();

SEND_L();

timer3_init_ex();

}

#if 0

void ir_send_byte(u8 num)

{

u8 i;

u8 data=num;

for (i=0; i<8; i++)

{

if (data & BIT(7)) {

SEND_0();

} else {

SEND_1();

}

data <<= 1;

}

data=num;

for (i=0; i<8; i++)

{

if (data & BIT(7)) {

SEND_1();

} else {

SEND_0();

}

data <<= 1;

}

}

void ir_send_start()

{

SEND_H();

delay_ms(4);

}

void ir_send_end()

{

SEND_L();

}

void ir_send_cmd(u8 cmdType)

{

u8 i,n;

u8 data[4]={0xAA,0x01,cmdType,0xBB};

SEND_DIR_OUT();

for(n=0;n<4;n++)

{

for(i=0;i<3;i++)

{

printf("tickstart:%d,%x--\n",tick_get(),data[n]);

//WDT_CLR();

SEND_START();

ir_send_byte(data[n]);

SEND_INTERNAL();

printf("tickend:%d--\n",tick_get());

}

}

SEND_L();

}

#endif

//a data send 3 cnt-- 0xAA 0x01 data 0xBB

//u8 sendAllData[12]={0xAA,0xAA,0xAA,0x01,0x01,0x01,0x02,0x02,0x02,0xBB,0xBB,0xBB};

u8 sendAllData[15]={0xAA,0xAA,0xAA,0x01,0x01,0x01,0x02,0x02,0x02,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB};

//a data send 3 cnt 0xAA 0x02 dataH dataL 0xBB

//u8 sendAllDataMic[16]={0xAA,0xAA,0xAA,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0xBB,0xBB,0xBB};

u16 curSendData=0;

u8 sendWhichData=0;

u8 sendStartFlag=0;

u8 count=0;

u8 sendStep=0;

enum{

send_start_signal,

send_bit15,

send_bit14,

send_bit13,

send_bit12,

send_bit11,

send_bit10,

send_bit9,

send_bit8,

send_bit7,

send_bit6,

send_bit5,

send_bit4,

send_bit3,

send_bit2,

send_bit1,

send_bit0,

send_end_signal,

}SEND_SETP;

void sendDataStart(u8 dat)

{

printf("sendDataStart:%d,%d \n",sendStartFlag,sys_cb.isMusicMode);

if(sendStartFlag==1)

{

return;

}

#if 1 //20230823

sendAllData[0]=dat;

sendAllData[1]=dat;

sendAllData[2]=dat;

#if 0

if(dat==ASR_CMD_MUSIC_MODE|| dat==ASR_CMD_DJ_MODE)

{

extern u8 get_et_lib_rhythm();

u8 tmpRhy = get_et_lib_rhythm();

sendAllData[3]=tmpRhy;

sendAllData[4]=tmpRhy;

sendAllData[5]=tmpRhy;

}

else

#endif

{

sendAllData[3]=0;

sendAllData[4]=0;

sendAllData[5]=0;

}

printf("send data:%x,%x",sendAllData[0],sendAllData[3]);

#else

sendAllData[0]=0xAA;

sendAllData[1]=0xAA;

sendAllData[2]=0xAA;

sendAllData[3]=0x01;

sendAllData[4]=0x01;

sendAllData[5]=0x01;

sendAllData[6]=dat;

sendAllData[7]=dat;

sendAllData[8]=dat;

sendAllData[9]=0xBB;

sendAllData[10]=0xBB;

sendAllData[11]=0xBB;

#endif

sendWhichData=0;

curSendData=~sendAllData[sendWhichData]<<8 | sendAllData[sendWhichData];

sendStartFlag=1;

count=0;

sendStep=0;

if(sys_cb.isMusicMode==ASR_CMD_MUSIC_MODE||sys_cb.isMusicMode==ASR_CMD_DJ_MODE)

sys_cb.sendtmpRhyData=1;

}

#if 1

AT(.com_rodata.bat)

const char strkk[] = "sendmicdata:%x-----\n";

AT(.com_text.timer)

void sendDataMicStart(u8 dat)

{

if(sendStartFlag==1 || sys_cb.sendtmpRhyData==0)

{

return;

}

//printf( strkk,dat);

u8 tt=0;

if(dat>15)

dat=dat%15;

if(sys_cb.isMusicMode==ASR_CMD_MUSIC_MODE)

{

tt=0xA0+dat;

}

else if(sys_cb.isMusicMode==ASR_CMD_DJ_MODE)

{

tt=0xB0+dat;

}

sendAllData[0]=tt;

sendAllData[1]=0;

sendAllData[2]=0;

sendAllData[3]=0;

sendAllData[4]=0;

sendAllData[5]=0;

sendWhichData=0;

curSendData=~sendAllData[sendWhichData]<<8 | sendAllData[sendWhichData];

//curSendData = sendAllData[0]<<8;

sendStartFlag=1;

count=0;

sendStep=0;

printf(strkk,sendAllData[0]);

}

#endif

//receive

#define READ_STASTUS() (GPIOB & BIT(4))

u16 readCurData=0;;

u8 recCmdData[12];

u8 recCmdDataCnt=0;

static u8 readStep=0;

static u8 lastReadStatus=0;

static u8 upCnt=0;

static u8 downCnt=0;

u8 playWhichSound=0;

AT(.com_rodata.bat)

const char strtt[] = "data:%x,%x-----\n";

AT(.com_rodata.bat)

const char strnum[] = "readnum:%x,%x-----\n";

AT(.com_rodata.bat)

const char strreset[] = "reset-----\n";

AT(.com_rodata.bat)

const char strreadH[] = "read:1\n";

AT(.com_rodata.bat)

const char strreadL[] = "read:0\n";

void read_init(void)

{

GPIOBFEN &= ~BIT(4); //PB4作为GPIO使用

GPIOBDE |= BIT(4); //PB4设置为数字IO

GPIOBDIR |= BIT(4); //PB4方向设置为输入

GPIOBPU |= BIT(4);

}

AT(.com_text.isr)

void receive_reset(void)

{

//printf(strreset);

lastReadStatus=0;

upCnt=0;

downCnt=0;

readStep=0;

readCurData=0;

}

AT(.com_text.isr)

void receive_handle(void)

{

//---------------------------

static u8 resetCnt=0;

if(!READ_STASTUS())

{

resetCnt++;

if(resetCnt>40)//200us*40=8ms reset

{

resetCnt=0;

if(readStep!=send_start_signal)

{

receive_reset();

recCmdDataCnt=0;

}

}

}

else{

resetCnt=0;

}

//--------------------------

switch(readStep)

{

case send_start_signal:

if(lastReadStatus==0)

{

if(READ_STASTUS())

{

lastReadStatus=1;

upCnt++;

}

else{

upCnt=0;

}

}

else if(READ_STASTUS())

{

upCnt++;

lastReadStatus=1;

if(upCnt>15) //200us*15=3ms

{

readStep++;

upCnt=0;

downCnt=0;

readCurData=0;

lastReadStatus=0;

}

}

else if(!READ_STASTUS())// 高电平时间没超过3ms 复位

{

receive_reset();

}

break;

case send_bit15:

case send_bit14:

case send_bit13:

case send_bit12:

case send_bit11:

case send_bit10:

case send_bit9:

case send_bit8:

case send_bit7:

case send_bit6:

case send_bit5:

case send_bit4:

case send_bit3:

case send_bit2:

case send_bit1:

case send_bit0:

if(lastReadStatus==0)

{

if(!READ_STASTUS())

{

downCnt++;

lastReadStatus=1; //读到有效的低电平 开始计数

}

else{

upCnt++;

}

if(downCnt > 20 || upCnt>30) //高低电平时间太长复位

{

receive_reset();

}

}

else {

if(!READ_STASTUS())

{

downCnt++;

}

else{

if(downCnt > 3) //低 大于 600us 0

{

//printf(strreadL);

readCurData &= 0xFFFE;

}

else{ //低<600 1

//printf(strreadH);

readCurData |= 0x0001;

}

readStep++;

if(readStep<send_end_signal)

{

readCurData <<= 1;

}

//printf(strtt,readCurData,readCurData);

lastReadStatus=0;

downCnt=0;

upCnt=0;

}

}

break;

case send_end_signal: //4ms low

if(lastReadStatus==0)

{

if(!READ_STASTUS()) //出现低电平 开始计数

{

downCnt++;

lastReadStatus=1;

}

else {

upCnt++;

}

if(upCnt>30)

{

receive_reset();

}

}

else{

if(!READ_STASTUS())

{

downCnt++;

}

else {

upCnt++;

}

//printf(strtt,downCnt,upCnt);

if(downCnt>14) // 大于3ms

{

u8 LL=readCurData & 0xFF;

u8 HH=(~readCurData>>8)& 0xFF;

printf(strnum,HH,LL);

if(HH == LL) //接收有效

{

//printf(strtt,downCnt,upCnt);

if(LL==0xAA ) //&& recCmdDataCnt==0)

{

recCmdDataCnt=0;

recCmdData[recCmdDataCnt++]=LL;

}

else{

recCmdData[recCmdDataCnt++]=LL;

}

//printf(strtt,recCmdDataCnt);

#if 1

if(recCmdDataCnt==3)

{

recCmdDataCnt=0;//接收命令处理

if(recCmdData[0]==0xC0)

{

playWhichSound=UART_CMD_OPEN_CMD_YUNXIAOMO;

msg_enqueue(EVT_ET_PLAY_SOUND);

}

else if(recCmdData[0]==0xC1)

{

playWhichSound=UART_CMD_CLOSE_CMD_YUNXIAOMO;

msg_enqueue(EVT_ET_PLAY_SOUND);

}

else{

playWhichSound=recCmdData[0];

msg_enqueue(EVT_ET_PLAY_SOUND);

}

}

#else

if(recCmdDataCnt==12)

{

if(recCmdData[0]==0xAA && recCmdData[3]==0x01 && recCmdData[9]==0xBB)

{

recCmdDataCnt=0;//接收命令处理

printf(strtt,recCmdData[0],recCmdData[6]);

}

}

#endif

}

receive_reset();

}

if(upCnt>5) //结束出现高 1ms异常 复位

{

receive_reset();

}

}

break;

}

}

extern d_amp_func ampFunc;

AT(.com_rodata.bat)

const char strsetH[] = "pa7 set:1\n";

AT(.com_rodata.bat)

const char strsetL[] = "pa7 set:0\n";

/*AT(.com_text.isr)

void amp_init_handle(void)

{

//if(ampFunc.et_amp_init_step==High_always)

// return;

//printf(strsetH);

switch(ampFunc.et_amp_init_step)

{

case Low_10ms:

if(ampFunc.et_amp_cnt++ > 50)

{

printf(strsetH);

ampFunc.et_amp_init_step=High_20ms;

ampFunc.et_amp_cnt=0;

#if ET_LOG_PA7

#else

GPIOASET = BIT(7);

#endif

}

break;

case High_20ms:

if(ampFunc.et_amp_cnt++ > 100)

{

printf(strsetL);

ampFunc.et_amp_init_step=Low_70uS;

ampFunc.et_amp_cnt=0;

#if ET_LOG_PA7

#else

GPIOACLR = BIT(7);

#endif

}

break;

case Low_70uS:

if(ampFunc.et_amp_cnt++ > 1)

{

printf(strsetH);

ampFunc.et_amp_init_step=High_always;

ampFunc.et_amp_cnt=0;

#if ET_LOG_PA7

#else

GPIOASET = BIT(7);

#endif

}

}

}*/

AT(.com_text.isr)

void timer3_ex_isr(void)

{

u8 sendByteNum=3;//12;

u8 sendMicDataFlag=0;

//if(sys_cb.isMusicMode==ASR_CMD_MUSIC_MODE || sys_cb.isMusicMode==ASR_CMD_DJ_MODE) //20230904

{

if(sendAllData[2]==0) //只有1个数据,发送mic频谱, 其他发送music 和dj命令

{

sendByteNum=2;

sendMicDataFlag=1;

}

}

if (TMR3CON & BIT(16)) {

TMR3CPND = BIT(16); //Clear Pending

receive_handle();

//amp_init_handle();

if(sendStartFlag==0)

return;

if(sendAllData[3]==0x01)

{

//sendByteNum=12;

sendByteNum=3;

}

#if 0

else if(sendAllData[3]==0x02)

{

sendByteNum=15;

}

#endif

if(count==0)

{

if(sendStep==send_start_signal)

SEND_H(); //开始4ms高

else if(sendStep==send_end_signal)

SEND_L(); //结束4ms低

else

SEND_L();//数据位起始都是低

}

else if(sendStep==send_start_signal)

{

if(count == 19)

{

sendStep++;

count=0;

return;

}

}

else if(sendStep==send_end_signal)

{

if(count == 19)

{

sendStep=0;

count=0;

sendWhichData++;

if(sendWhichData<sendByteNum)// send number

{

curSendData=~sendAllData[sendWhichData]<<8 | sendAllData[sendWhichData];

}

else

{

sendWhichData=0;//send over

sendStartFlag=0;// send over

}

return;

}

}

else if(sendStep>=send_bit15 && sendStep<=send_bit0)

{

if(curSendData & BIT(15))

{

if(count==2) // 发1时 400us时置高

SEND_H();

}

else

{

if(count==5) // 发 0 时 1ms时置高

SEND_H();

}

if(count==6) // 1.2+0.2=1.4ms结束 1 bit

{

curSendData <<= 1;

sendStep++;

count=0;

/*if(sendMicDataFlag)//20230904

{

if(sendStep==9)

{

sendStep=send_end_signal;

}

}*/

return;

}

}

count++;

}

}

typedef void (*isr_t)(void);

isr_t register_isr(int vector, isr_t isr);

void timer3_init_ex(void)

{

register_isr(IRQ_TMR3_VECTOR, timer3_ex_isr);

PICPR &= ~BIT(IRQ_TMR3_VECTOR);

PICEN |= BIT(IRQ_TMR3_VECTOR);

CLKGAT1 |= BIT(8);

TMR3CNT = 0;

TMR3PR = 354 / 2 - 1; //200us //1ms, select xosc24_div 1M clk

TMR3CON = BIT(7) | BIT(2) | BIT(0); //Timer works in Counter Mode

read_init();

}

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值