wshy2010 发表于 2012-3-1 16:50:03

keeloq芯片HCS300无法实现编程和校验,不知道问题出在哪里?望知道的朋友相告

在官网下了几份hcs300的资料,里面均有对hcs300编程波形和校验波形的说明。现贴图如下:
http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723323RJRMNW.jpg
(原文件名:未命名1111.jpg)

http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723324JAAMKJ.jpg
(原文件名:未命名2222.jpg)
1.以上是官方2001年英文版hcs300datasheet里的
http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723325XIQ1G8.jpg
(原文件名:未命名3333.jpg)

http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723326HPBYP9.jpg
(原文件名:未命名4444.jpg)
2.以上是官方2004年英文版hcs系列芯片编程规范里的
http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723327C4QW41.jpg
(原文件名:未命名5555.jpg)

http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723328IXM2ZX.jpg
(原文件名:未命名6666.jpg)
3.以上是官方2006年中文版hcs300datasheet里的
其中第一份和第三份是相同的,第二份有些地方是不同的,这明显可以看出。下面是按照第2份写的c程序:延时子函数delay_us()、delay_ms(),及写单片机EEPROM子函数EEPROM_write()没包括。
#include<iom8v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define S0INPUT_HCS300() DDRD=DDRD&(~(1<<PD7))
#define S1INPUT_HCS300() DDRD=DDRD&(~(1<<PD6))
#define S2INPUT_HCS300() DDRD=DDRD&(~(1<<PD5))
#define S3INPUT_HCS300() DDRD=DDRD&(~(1<<PD4))
#define PWMINPUT_HCS300() DDRB=DDRB&(~(1<<PB0))
#define PWMPINB_HCS300() (PINB&(1<<PB0))==(1<<PB0)
#define S0OUTPUT_HCS300() DDRD=DDRD|(1<<PD7)
#define S1OUTPUT_HCS300() DDRD=DDRD|(1<<PD6)
#define S2OUTPUT_HCS300() DDRD=DDRD|(1<<PD5)
#define S3OUTPUT_HCS300() DDRD=DDRD|(1<<PD4)
#define PWMOUTPUT_HCS300() DDRB=DDRB|(1<<PB0)
#define S0HIGH_HCS300() PORTD=PORTD|(1<<PD7)
#define S1HIGH_HCS300() PORTD=PORTD|(1<<PD6)
#define S2HIGH_HCS300() PORTD=PORTD|(1<<PD5)
#define S3HIGH_HCS300() PORTD=PORTD|(1<<PD4)
#define PWMHIGH_HCS300() PORTB=PORTB|(1<<PB0)
#define S0LOW_HCS300() PORTD=PORTD&(~(1<<PD7))
#define S1LOW_HCS300() PORTD=PORTD&(~(1<<PD6))
#define S2LOW_HCS300() PORTD=PORTD&(~(1<<PD5))
#define S3LOW_HCS300() PORTD=PORTD&(~(1<<PD4))
#define PWMLOW_HCS300() PORTB=PORTB&(~(1<<PB0))
//*********************************************
//函数名称:void write_hcs300(void)
//功能描述:hcs300全部存储器写入、读出
//输入参数:无
//输出参数:无
//编码日期:
//*********************************************
void write_hcs300(void)
{uchar i,j,k;
uint uiwrite_hcs;
uint uiwrite_hcs300[]={0xCDEF,0x89AB,0x4567,0x0123,0x0001,0x0000,0x0A8C,0x47DF,0x0000,0x0000,0x0000,0x02C5};
uint uiread_hcs300[]={0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};
asm("cli");
S0LOW_HCS300();
S1LOW_HCS300();
S3LOW_HCS300();
S0OUTPUT_HCS300();
S1OUTPUT_HCS300();
S3OUTPUT_HCS300();
delay_ms(100);//外加延时
S2LOW_HCS300();
S2OUTPUT_HCS300();
PWMLOW_HCS300();
PWMOUTPUT_HCS300();
delay_ms(100);//外加延时
S2HIGH_HCS300();
delay_ms(4);//TPS
PWMHIGH_HCS300();
delay_ms(7);//TPH1
PWMLOW_HCS300();
delay_us(100);//TPH2
S2LOW_HCS300();
delay_ms(8);//TPBW
for(k=0;k<12;k++)//写入12个字
   {
    for(j=0;j<12;j++)//每个字重复12次
       {
          uiwrite_hcs=uiwrite_hcs300;
      for(i=0;i<16;i++)//每个字16位
       {
          if((uiwrite_hcs&0x0001)==0x0001)
             {
              PWMHIGH_HCS300();
             }
          else
             {
              PWMLOW_HCS300();
             }
          S2HIGH_HCS300();
          delay_us(100);//TCLKH
          S2LOW_HCS300();
          delay_us(100);//TCLKL
          uiwrite_hcs=uiwrite_hcs>>1;
       }
          PWMLOW_HCS300();
      delay_us(200);//TAS
          if((j==11)&&(k==11))
           {
          ;
           }
          else
           {
          S2HIGH_HCS300();
          delay_ms(100);//TWC
          PWMHIGH_HCS300();
          delay_us(5);//外加延时
          S2LOW_HCS300();
          PWMLOW_HCS300();
           }
       }
   }//写入12个字结束
delay_ms(100);//TWC
S0INPUT_HCS300();
S1INPUT_HCS300();
S3INPUT_HCS300();
PWMINPUT_HCS300();
for(j=0;j<12;j++)
   {
    for(i=0;i<16;i++)
       {
      S2HIGH_HCS300();
          delay_us(20);//外加延时
          S2LOW_HCS300();
          if(PWMPINB_HCS300())
           {
          uiread_hcs300=uiread_hcs300|0x8000;
           }
          else
           {
           ;
           }
             if(i<15)
           {
          uiread_hcs300=uiread_hcs300>>1;
           }
       }
   }//读取12个字结束
PWMLOW_HCS300();
EEPROM_write(0x0010,high_byte(uiread_hcs300));//读存储器0写入EEPROM
EEPROM_write(0x0011,low_byte(uiread_hcs300));
EEPROM_write(0x0012,high_byte(uiread_hcs300));//读存储器1写入EEPROM
EEPROM_write(0x0013,low_byte(uiread_hcs300));
EEPROM_write(0x0014,high_byte(uiread_hcs300));//读存储器2写入EEPROM
EEPROM_write(0x0015,low_byte(uiread_hcs300));
EEPROM_write(0x0016,high_byte(uiread_hcs300));//读存储器3写入EEPROM
EEPROM_write(0x0017,low_byte(uiread_hcs300));
EEPROM_write(0x0018,high_byte(uiread_hcs300));//读存储器4写入EEPROM
EEPROM_write(0x0019,low_byte(uiread_hcs300));
EEPROM_write(0x001A,high_byte(uiread_hcs300));//读存储器5写入EEPROM
EEPROM_write(0x001B,low_byte(uiread_hcs300));
EEPROM_write(0x001C,high_byte(uiread_hcs300));//读存储器6写入EEPROM
EEPROM_write(0x001D,low_byte(uiread_hcs300));
EEPROM_write(0x001E,high_byte(uiread_hcs300));//读存储器7写入EEPROM
EEPROM_write(0x001F,low_byte(uiread_hcs300));
EEPROM_write(0x0020,high_byte(uiread_hcs300));//读存储器8写入EEPROM
EEPROM_write(0x0021,low_byte(uiread_hcs300));
EEPROM_write(0x0022,high_byte(uiread_hcs300));//读存储器9写入EEPROM
EEPROM_write(0x0023,low_byte(uiread_hcs300));
EEPROM_write(0x0024,high_byte(uiread_hcs300));//读存储器10写入EEPROM
EEPROM_write(0x0025,low_byte(uiread_hcs300));
EEPROM_write(0x0026,high_byte(uiread_hcs300));//读存储器11写入EEPROM
EEPROM_write(0x0027,low_byte(uiread_hcs300));
asm("sei");
}
//*********************************************
//函数名称:主函数
//*********************************************
void main(void)
{
write_hcs300();
while(1)
   {
   ;
   }
}
运行后EEPROM里的结果是:0001 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000。只是uiwrite_hcs300[]右移15次后的结果。因此可以判断在校验hcs300寄存器的时候PWM端根本就没有数据输出,一直为低电平。其中第1份里描述的也试过了,结果一样。在校验的过程中TDV为数据输出有效时间,最大值30us,很不解,看图不是显示在这段时间里是PWM输出数据变化的时间么?
请了解的朋友说下,万分感谢!

wshy2010 发表于 2012-3-1 18:15:45

怎么这么冷清啊,自己顶下

d-link2 发表于 2012-3-1 18:23:09

MARK

shijingyao3408 发表于 2013-11-4 10:52:30

for(j=0;j<12;j++)//每个字重复12次
         {
          uiwrite_hcs=uiwrite_hcs300;
      for(i=0;i<16;i++)//每个字16位
       {
            if((uiwrite_hcs&0x0001)==0x000
这里有问题~~HCS中文资料翻译有问题不是每个字写12遍是连续写12遍重复12次这样的操作的意思 12*16(位)=192位
页: [1]
查看完整版本: keeloq芯片HCS300无法实现编程和校验,不知道问题出在哪里?望知道的朋友相告