归零码
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