|
void RDS_BLOCK_Auto_Update(void)
{
uchar chr_addr;
//bit sign;
//uchar k;
static bit bTextAB = 0;
//static uint utc_offset;
//static uint mjd;
if(PICode != aRDS_Block[0])
{
PICode = aRDS_Block[0];
//RDS_clear();//写清除函数
}
GroupType = (aRDS_Block[1] >> 11) & 0x1f;
PTY = (aRDS_Block[1] >> 5) & 0x1f;//mode
PTY_disp_F=1;
switch (GroupType)
{
case 0: // Group 0A
case 1: // Group 0B
bTP = aRDS_Block[1] & 0x0400; // bit 10 TP//traffic programe
bTA = aRDS_Block[1] & 0x0010; // bit 4 TA//traffic 公告 TP。TA都为1有交通信息
bMS = aRDS_Block[1] & 0x0008; // bit 3 ms music speech 0为speech,1为music
chr_addr = aRDS_Block[1] & 0x03;
if (chr_addr == 0) pscnt = 0;
else pscnt ++;
if (chr_addr == pscnt)
{
chr_addr*=2;
aPS[chr_addr] = aRDS_Block[3]>>8; //四组字符信号,电台名
aPS[chr_addr+1] = aRDS_Block[3]&0xff;
}
else bRDSOk = 0;
if (pscnt == 3)
{
bRDSOk = 1;
PS_disp_F=1;
}
break;
case 4: // Group 2A Text character number
// if TextAB changed, should update
if (bTextAB != (aRDS_Block[1] & 0x10)) // Text AB : bit 5 in block 1 版本一变马上清0
{
bTextAB = (aRDS_Block[1] & 0x10);
textcnt = 0;
}
chr_addr = aRDS_Block[1] & 0x0f;
if (chr_addr == 0)
textcnt = 0;
else textcnt ++;
if (chr_addr == textcnt)
{
chr_addr*=4;
aRDS_Text[chr_addr] = aRDS_Block[2]>>8;
aRDS_Text[chr_addr+1] = aRDS_Block[2]&0xff;
aRDS_Text[chr_addr+2] = aRDS_Block[3]>>8;
aRDS_Text[chr_addr+3] = aRDS_Block[3]&0xff;
// if "0x0d" found, the text finish.
if (aRDS_Text[chr_addr]==0x0d)
{
if(chr_addr!=0)text_length=chr_addr-1;
bTextOk = 1; textcnt = 0;
if(!TEXT_disp_F)TEXT_disp_F=1;
}
else if(aRDS_Text[chr_addr+1]==0x0d)
{
text_length=chr_addr;
bTextOk = 1; textcnt = 0;
if(!TEXT_disp_F)TEXT_disp_F=1;
}
else if(aRDS_Text[chr_addr+2]==0x0d)
{
text_length=chr_addr+1;
bTextOk = 1; textcnt = 0;
if(!TEXT_disp_F)TEXT_disp_F=1;
}
else if(aRDS_Text[chr_addr+3]==0x0d)
{
text_length=chr_addr+2;
bTextOk = 1; textcnt = 0;
if(!TEXT_disp_F)TEXT_disp_F=1;
}
}
else
{
bTextOk = 0;
}
if (textcnt >= 16) {bTextOk = 1; textcnt = 0;}
break;
case 5: // Group 2B
chr_addr = aRDS_Block[1] & 0x0f;
if (chr_addr == 0) textcnt = 0;
else textcnt ++;
if (chr_addr == textcnt)
{
chr_addr*=2;
aRDS_Text[chr_addr] = aRDS_Block[3]>>8;
aRDS_Text[chr_addr+1] = aRDS_Block[3]&0xff;
// if "0x0d" found, the text finish.
if (aRDS_Text[chr_addr]==0x0d)
{
if(chr_addr!=0)text_length=chr_addr-1;
bTextOk = 1; textcnt = 0;
if(!TEXT_disp_F)TEXT_disp_F=1;
}
else if(aRDS_Text[chr_addr+1]==0x0d)
{
text_length=chr_addr;
bTextOk = 1; textcnt = 0;
if(!TEXT_disp_F)TEXT_disp_F=1;
}
}
else
{
bTextOk = 0;
}
if (textcnt >= 16) {bTextOk = 1; textcnt = 0;}
break;
/*case 8://group 4A
break;*/
default:break;
}
}
// --------------------------------------------------------------
// RDS_CRCCheck
// --------------------------------------------------------------
void RDS_CRCCheck(void)
{
bit bCFlag;
uchar TempH, TempL;
TempH = rdsdata[0] / 0x100;
TempL = rdsdata[0] % 256;
//C9
ACC = TempH & 0x7c;
bCFlag = P;
ACC = TempL & 0x3e;
bCFlag ^= P;
if(bCFlag)crc = 0x200;
//C8
ACC = TempH & 0x3e;
bCFlag = P;
ACC = TempL & 0x1f;
bCFlag ^= P;
if(bCFlag) crc |= 0x100;
//C7
ACC = TempH & 0x63;
bCFlag = P;
ACC = TempL & 0x31;
bCFlag ^= P;
if(bCFlag) crc |= 0x80;
//C6
ACC = TempH&0xcd;
bCFlag = P;
ACC = TempL & 0xa6;
bCFlag ^= P;
if(bCFlag)crc |= 0x40;
//C5
ACC = TempH & 0xe6;
bCFlag = P;
ACC = TempL & 0xd3;
bCFlag ^= P;
if(bCFlag)crc |= 0x20;
//C4
ACC = TempH & 0x8f;
bCFlag = P;
ACC = TempL & 0x57;
bCFlag ^= P;
if(bCFlag) crc |= 0x10;
//C3
ACC = TempH & 0x3b;
bCFlag = P;
ACC = TempL & 0x95;
bCFlag ^= P;
if(bCFlag)crc |= 0x08;
//C2
ACC = TempH & 0xe1;
bCFlag = P;
ACC = TempL & 0xf4;
bCFlag ^= P;
if(bCFlag)crc |= 0x04;
//C1
ACC = TempH & 0xf0;
bCFlag = P;
ACC = TempL & 0xfa;
bCFlag ^= P;
if(bCFlag) crc |= 0x02;
//C0
ACC = TempH & 0xf8;
bCFlag = P;
ACC = TempL & 0x7d;
bCFlag ^= P;
if(bCFlag) crc |= 0x01;
}
// -------------------------------------------------- //
#define OFFSET_A 0x00fc // 0x00fc
#define OFFSET_B 0x0198 // 0x0198
#define OFFSET_C 0x0168 // 0x0168
#define OFFSET_C2 0x0350 // 0x0350
#define OFFSET_D 0x01b4 // 0x01b4
// --------------------------------------------------------------
// Interrupt Handle Routines
// --------------------------------------------------------------
// ISREX0:EXTERNAL INTERRUPT 0 SERVICE ROUTINE
void INT11() interrupt 2 using 2
{
static uchar seq = 0;
static bit bSynch = 0;
static uchar bitcnt;
//PIN_TEST = 1;
rdsdata[0] <<= 1;
if (rdsdata[1] & 0x0200) rdsdata[0] |= 0x0001;//存信息16位
rdsdata[1] <<= 1;
if (RDS_DATA) rdsdata[1]|= 0x0001; //存12较验
rdsdata[1] &= 0x03ff;
bitcnt ++;
if (!bSynch)//先找到头码
{
crc = 0;
RDS_CRCCheck(); // Input = rdsdata[0], output = crc;
crc ^= rdsdata[1];
if (crc == OFFSET_A)
{
seq = 1; bSynch = 1; bitcnt = 0; aRDS_Block[0] = rdsdata[0];
}
}
else if (bitcnt == 26)
{
bitcnt = 0;
crc = 0;
RDS_CRCCheck(); // Input = rdsdata[0], output = crc;
crc ^= rdsdata[1];
// -------------------------- Syn Checking ----------------------- //
if ((crc == OFFSET_A) && (seq == 0))
{
seq = 1; aRDS_Block[0] = rdsdata[0];
}
else if ((crc == OFFSET_B) && (seq == 1))
{
seq = 2; aRDS_Block[1] = rdsdata[0];
}
else if ((crc == OFFSET_C) && (seq == 2))
{
seq = 3; aRDS_Block[2] = rdsdata[0];
}
else if ((crc == OFFSET_C2) && (seq == 2))
{
seq = 3; aRDS_Block[2] = rdsdata[0];
}
else if ((crc == OFFSET_D) && (seq == 3))
{
seq = 0; aRDS_Block[3] = rdsdata[0];
RDS_BLOCK_Auto_Update();
}
else // Lost sychronization
{
bSynch = 0; bRDSOk = 0; bTextOk = 0;
}
}
//PIN_TEST = 0;
}
这个程序虽不完整,但也差不多了,可以用来调试了,我也是在网上下载的,原理我也知道了,写得挺清楚的,可是我就是调不成功,不知道是硬件问题还是怎么回事,我在收音厂用RDS信号发生器调试,频率也对应了,那些信号都是没有规律的变来变去,进了OFFSETA下面26位的校验字变来变去,没有一次一等于OFFSETB,极郁闷,哪个好心人帮我提点提点,非常感谢!!我在深圳天安数码城工作,近的话,一定当面感谢。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|