控制命令简介
1.雷达IO默认为输入,等待1秒时间接收命令,1秒后自动转换成输出口,做为正常口的感应输出口用。
2.指令为两个字节,两个字节之间的时间间隔要小于 4ms。
3.发高字节的低位,例如 F5 01H,发送时先发 1111 0101 (F5H) 的低位,
4.距离分10档,分别为F500-F509;对应于1挡-10挡,1挡为最近,10档位最远,芯片收到命令后保存好档位,断电要记忆。
时序图
200us :600us高电 平 :低电 平=1 :3 ,表示 0
600us :200us高电 平 :低电 平=3 :1 ,表示 1
高低电平时序范围:50us:150us~~800us:2.4ms(注: 1 :2< 1 :3< 1 :5 其中的 1 推荐 200us) 说明:1.先发高字节的低位,再发送低字节的低位。例如 F3 01 接收到的数据是这样的:1100 1111 1000 0000 。2.将数据信号拉低 5ms,然后发送数据,每个字节发完后需拉高 2ms再拉低 5ms,然后发送下一个字节。高电平与低电平数据占空比 1 :3 即代表数据位 0 ,高电平于低电平数据位占空比为 3 :1 代表数据位 1。
代码
写入flash部分断电保持并没有上传过来,比较简单。
void delay2ms()
{
int i = 0;
for(i=0;i<437;i++)
{
NOP();
}
}
void delay5ms()
{
int i = 0;
for(i=0;i<1117;i++)
{
NOP();
}
}
void delay1s()
{
int i = 0;
for(i=0;i<200;i++)
{
delay5ms();
}
}
void delay5us()
{
int i = 0;
for(i=0;i<1;i++)
{
NOP();
}
}
void delay50us()
{
int i = 0;
for(i=0;i<10;i++)
{
NOP();
}
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
}
uint8_t Check_Pin()
{
int count=0;
if(RB3 == 1)
{
while(RB3==1)
{
delay50us();
count++;
}
if(count>=3&&count<=6)
{
while(RB3==0)
{
delay50us();
count++;
}
if(count>=13 && count<=18)
{
return 0;
}
}
if(count>=10 && count<=13)
{
while(RB3==0)
{
delay50us();
count++;
}
if(count>=13 && count<=18)
{
return 1;
}
}
count = 0;
}
}
uint16_t Num_Conversion()
{
//tranform array to num
uint16_t num=0,num1=0,num2=0;
for(int i=7;i>=0;i--)
{
num1=num1*2+data[0][i];
}
for(int i=7;i>=0;i--)
{
num2=num2*2+data[1][i];
}
num = (num1<<8)|num2;
return num;
}
void Start_Receive()
{
if(allow_flag == 0)
return;
delay50us();
exit_count++;
if(exit_count == 60000)
{
allow_flag = 0;
exit_count = 0;
TRISB = 0xf7;
PORTB = 0x01;
PORTB = 0x00;
PORTB = 0x01;
}
while(RB3 == 1)
{
delay5us();
if(RB3 == 0)
{
//check head
PORTA = 0x01;
delay5ms();
/*
while(RB3 == 0)
{
delay50us();
head_count++;
}
if(head_count < 80||head_count >120)
{
head_count=0;
break;
}
*/
PORTA = 0x00;
//check first byte
if(RB3==1)
{
data[0][0] = Check_Pin();
//PORTA = data[0][0];
data[0][1] = Check_Pin();
//PORTA = data[0][1];
data[0][2] = Check_Pin();
//PORTA = data[0][2];
data[0][3] = Check_Pin();
//PORTA = data[0][3];
data[0][4] = Check_Pin();
//PORTA = data[0][4];
data[0][5] = Check_Pin();
//PORTA = data[0][5];
data[0][6] = Check_Pin();
//PORTA = data[0][6];
data[0][7] = Check_Pin();
//PORTA = data[0][7];
}
//PORTA = 0x01;
//PORTA = 0x00;
//PORTA = 0x01;
// wait time
delay2ms();
delay5ms();
//PORTA = 0x00;
//check second byte
if(RB3==1)
{
data[1][0] = Check_Pin();
//PORTA = data[1][0];
data[1][1] = Check_Pin();
//PORTA = data[1][1];
data[1][2] = Check_Pin();
//PORTA = data[1][2];
data[1][3] = Check_Pin();
//PORTA = data[1][3];
data[1][4] = Check_Pin();
//PORTA = data[1][4];
data[1][5] = Check_Pin();
//PORTA = data[1][5];
data[1][6] = Check_Pin();
//PORTA = data[1][6];
data[1][7] = Check_Pin();
//PORTA = data[1][7];
}
command = Num_Conversion();
//PORTA = 0x01;
//PORTA = 0x00;
//PORTA = 0x01;
int i =0;
for(i=15;i>=0;i--)
{
PORTA = (command >> i)&0x01;
delay2ms();
}
PORTA = 0x01;
iic_init();
switch(command)
{
case 0xF500:
rad_reg_write_byte(0x10, (threshold0)&0xff);
break;
case 0xF501:
rad_reg_write_byte(0x10, (threshold1)&0xff);
break;
case 0xF502:
rad_reg_write_byte(0x10, (threshold2)&0xff);
break;
case 0xF503:
rad_reg_write_byte(0x10, (threshold3)&0xff);
break;
case 0xF504:
rad_reg_write_byte(0x10, (threshold4)&0xff);
break;
case 0xF505:
rad_reg_write_byte(0x10, (threshold5)&0xff);
break;
case 0xF506:
rad_reg_write_byte(0x10, (threshold6)&0xff);
break;
case 0xF507:
rad_reg_write_byte(0x10, (threshold7)&0xff);
break;
case 0xF508:
rad_reg_write_byte(0x10, (threshold8)&0xff);
break;
case 0xF509:
rad_reg_write_byte(0x10, (threshold9)&0xff);
break;
default:
rad_reg_write_byte(0x10, 0x64);
break;
}
iic_deinit();
TRISB = 0xf7;
allow_flag = 0;
break;
}
};
}