|
你這個(gè)通訊方式和NEC紅外協(xié)議很類似,既然是單線單工,你的引導(dǎo)碼和數(shù)據(jù)應(yīng)該是讀的同一個(gè)引腳,那么time1,time2是同一個(gè)引腳的電平持續(xù)時(shí)間,對(duì)嗎?要找到問(wèn)題,我的思路是這樣的,僅供參考:
1 根據(jù)你的晶振精度,以及系統(tǒng)中有無(wú)其它優(yōu)先級(jí)更高的中斷影響通訊時(shí)序,合理設(shè)計(jì)0、1bit的時(shí)序特征,提高容錯(cuò)性,比方說(shuō)3~10us低電平后接10~20us高電平代表0; 10~18us低電平厚街3~10us高電平代碼1;
2 由于時(shí)序要求比較高,發(fā)送端的延時(shí)最好用定時(shí)器來(lái)做
3 示波器測(cè)量輸出端時(shí)序,比方說(shuō)你發(fā)送數(shù)據(jù)0x55,確認(rèn)發(fā)送端的輸出時(shí)序和你的協(xié)議設(shè)計(jì)相符
4 接收端用定時(shí)器的輸入捕獲功能來(lái)測(cè)量電平時(shí)間
中斷服務(wù)程序
void Capture_ISR (void)
{
// 讀取timer寄存器時(shí)間time
if (!receive_flag)
{
receive(time);
}
}
void receive(uint16_t Capture_Time )
{
if(IR_State == 0)
{
IR_LDC_Ready = 0; // Clear LeaDer Code Ready
IR_State=1;
}
// Leader or Repeater code
else if(IR_State == 1)
{
// Leader code
if((Capture_Time >= IR_LDC_MIN) && (Capture_Time <= IR_LDC_MAX))
{
IR_LDC_Ready = 1; // Set LeaDer Code Ready
IR_State++;
}
else
{
IR_State = 1;
IR_LDC_Ready = 0; // Clear LeaDer Code Ready
}
}
// Data
else if((IR_State >= 2 && IR_State < 10) && (IR_LDC_Ready == 1))
{
IR_State++;
NewByte1 = NewByte1 >> 1;
if((Capture_Time >= IR_BIT_0_MIN) && (Capture_Time <= IR_BIT_0_MAX))
NewByte1 &= 0x7f;
else if((Capture_Time >= IR_BIT_1_MIN) && (Capture_Time <= IR_BIT_1_MAX))
NewByte1 |= 0x80;
else
IR_State = 0;
}
else if((IR_State >= 10 && IR_State < 18) && (IR_LDC_Ready == 1))
{
IR_State++;
NewByte2 = NewByte2 >> 1;
if((Capture_Time >= IR_BIT_0_MIN) && (Capture_Time <= IR_BIT_0_MAX))
NewByte2 &= 0x7f;
else if((Capture_Time >= IR_BIT_1_MIN) && (Capture_Time <= IR_BIT_1_MAX))
NewByte2 |= 0x80;
else
IR_State = 0;
}
else if((IR_State >= 18 && IR_State < 26) && (IR_LDC_Ready == 1))
{
IR_State++;
NewByte3= NewByte3>> 1;
if((Capture_Time >= IR_BIT_0_MIN) && (Capture_Time <= IR_BIT_0_MAX))
NewByte3&= 0x7f;
else if((Capture_Time >= IR_BIT_1_MIN) && (Capture_Time <= IR_BIT_1_MAX))
NewByte3|= 0x80;
else
IR_State = 0;
}
else if((IR_State >= 26 && IR_State < 34) && (IR_LDC_Ready == 1))
{
IR_State++;
NewByte4= NewByte4>> 1;
if((Capture_Time >= IR_BIT_0_MIN) && (Capture_Time <= IR_BIT_0_MAX))
NewByte4&= 0x7f;
else if((Capture_Time >= IR_BIT_1_MIN) && (Capture_Time <= IR_BIT_1_MAX))
NewByte4|= 0x80;
else
IR_State = 0;
}
else if((IR_State >= 34 && IR_State < 42) && (IR_LDC_Ready == 1))
{
IR_State++;
NewByte5= NewByte5>> 1;
if((Capture_Time >= IR_BIT_0_MIN) && (Capture_Time <= IR_BIT_0_MAX))
NewByte5&= 0x7f;
else if((Capture_Time >= IR_BIT_1_MIN) && (Capture_Time <= IR_BIT_1_MAX))
NewByte5|= 0x80;
else
IR_State = 0;
}
if(IR_State == 42)
{
IR_LDC_Ready = 0; // Clear LeaDer Code Ready
received_flag= 1;
IR_State = 0;
}
}
|
評(píng)分
-
查看全部評(píng)分
|