搜索
bottom↓
回复: 0

ds28e01 copy返回值0x00求助

[复制链接]

出0入0汤圆

发表于 2014-10-13 09:38:51 | 显示全部楼层 |阅读模式
我使用ds28e01 CopyScratch的时候返回值总是0,实在弄不过去了,看手册好像是MAC验不过去,但是算法是官方给出的,我也不懂算法,没改过啊,为什么验不过去,下边是我的源码。我使用的事stm32的单片机。延时我是用示波器测过,delay_us可以实现1us为单位的延时。但是我还有个问题,你会看见我的代码while(1){if(  (WriteScratch(TargetAddress, buf))!= FALSE ) break;} 会出现while(1),原因是我发现我的操作并不是百分百的成功,有一定几率失败,虽然概率比较低,但是我看单总线的协议每次操作都是以复位为开始,所以我认为一次错误不影响下次操作,所以加了死循环,一直到成功为止,不知道这个有影响没?
void write_bit(char bitval)
{
        WR0_WIRE;
        delay_us(2);
        if(bitval==1)
                 WR1_WIRE;
        delay_us(80);// hold value for remainder of timeslot
        WR1_WIRE;
        delay_us(2);        // must add this delay because the cup frequence is 203MHZ.
}
void write_byte(char val)
{
        unsigned char i;
        unsigned char temp;
        set_output();
        for (i = 0; i < 8; i++) // writes byte, one bit at a time
                {
                        temp = val>>i; // shifts val right ‘i’ spaces
                        temp &= 0x01; // copy that bit to temp
                        write_bit(temp); // write bit in temp into
                }
        delay_us(10);
}

int CopyScratch(short TargetAddr, INT8U *MACbuf)
{
  unsigned char ch, i;
  if ( (ow_reset())!=0 ) return FALSE;
  write_byte(0xCC);                //Skip ROM command
  write_byte(0x55);     // write scratch command
  write_byte(TargetAddr%256 );     // write target address LSB
  write_byte(0x00 );     // write target address MSB
  write_byte(0x5f );     // write E/S byte
  // waiting 3 ms for SHA-1 algorithm in DS28E01-100
  delay_us(3000);
  // send MAC to the DS28E01-100
  for(i=0;i<20;i++) write_byte(MACbuf[i]);
  //delay 12ms for copying scratchpad to EEPROM in DS28E01-100
  delay_us(6000);
  delay_us(6000);
  // return TRUE if it is toggling
  ch=read_byte();
  return ((ch == 0xAA) || (ch == 0x55));
}
写操作,最后一部需要调用CopyScratch。
int  Write8Byte(short TargetAddress, INT8U *buf, INT8U *PageData)
{
  unsigned char   BasicSecret[8];

//process the data writing
  while(1){if(  (WriteScratch(TargetAddress, buf))!= FALSE ) break;}
  while(1){if(  (ReadScratch(TargetAddress, buf))!= FALSE ) break;}
//calulating the MAC for CopyScratchpad
//fill the SHA-1 input buffer
  ComputeBasicSecret(BasicSecret);
  if( TargetAddress<0x80 )
  {
           memcpy(SHAVM_Message, BasicSecret, 4);
           memcpy(&SHAVM_Message[4], PageData, 28);
           memcpy(&SHAVM_Message[32], buf, 8);
        SHAVM_Message[40]=(TargetAddress>>5)&0x03;
          memcpy(&SHAVM_Message[41], OW_RomID, 7);
            memcpy(&SHAVM_Message[48], &BasicSecret[4], 4);
        memset(&SHAVM_Message[52],0xff, 3);
           SHAVM_Message[55] = 0x80;
           memset(&SHAVM_Message[56], 0x00, 6);
           SHAVM_Message[62] = 0x01;
           SHAVM_Message[63] = 0xB8;
  }
  if( TargetAddress>=0x88 )
  {
           memcpy(SHAVM_Message, BasicSecret, 4);
        memcpy(&SHAVM_Message[4], BasicSecret, 8);
           memcpy(&SHAVM_Message[12], PageData, 20);
           memcpy(&SHAVM_Message[32], buf, 8);
        SHAVM_Message[40]=0x04;
          memcpy(&SHAVM_Message[41], OW_RomID, 7);
            memcpy(&SHAVM_Message[48], &BasicSecret[4], 4);
        memset(&SHAVM_Message[52],0xff, 3);
           SHAVM_Message[55] = 0x80;
           memset(&SHAVM_Message[56], 0x00, 6);
           SHAVM_Message[62] = 0x01;
           SHAVM_Message[63] = 0xB8;
  }
  SHAVM_Compute();     //MAC generated in SHAVM_MAC[]
  while(1){if( (CopyScratch(TargetAddress, SHAVM_MAC))!=FALSE )  return TRUE;}

}
void ComputeBasicSecret(unsigned char *DeviceBasicSecret)
{
   if( BasicSecretOption )
   {
//calculate unique 64-bit secret in the DS28E01-100
          memset(&SHAVM_Message[4], 0x00, 32);
           memcpy(SHAVM_Message, DeviceSecret, 4);
           memset(&SHAVM_Message[36], 0xff, 4);
        SHAVM_Message[40]=OW_RomID[0]&0x3f;
          memcpy(&SHAVM_Message[41], &OW_RomID[1], 7);
            memcpy(&SHAVM_Message[48], &DeviceSecret[4], 4);
        memset(&SHAVM_Message[52],0xff, 3);
           SHAVM_Message[55] = 0x80;
           memset(&SHAVM_Message[56], 0x00, 6);
           SHAVM_Message[62] = 0x01;
           SHAVM_Message[63] = 0xB8;

        SHAVM_Compute();     //unique basic secret now in SHAVM_MAC[]
        memcpy(DeviceBasicSecret, SHAVM_MAC, 8);   //now unique 64-bit basic secret in DeviceBasicSecret
     }
     else
     {
       memcpy(DeviceBasicSecret, DeviceSecret, 8);     //load basic 64-bit secret into DeviceBasicSecret
     }

}
void SHAVM_Compute()
{
   SHAVM_KTN[0]=(long)0x5a827999;
   SHAVM_KTN[1]=(long)0x6ed9eba1;
   SHAVM_KTN[2]=(long)0x8f1bbcdc;
   SHAVM_KTN[3]=(long)0xca62c1d6;   
   for(SHAVM_cnt=0; SHAVM_cnt<16; SHAVM_cnt++)
   {
      SHAVM_MTword[SHAVM_cnt]
         = (((long)SHAVM_Message[SHAVM_cnt*4]&0x00FF) << 24L)
         | (((long)SHAVM_Message[SHAVM_cnt*4+1]&0x00FF) << 16L)
         | (((long)SHAVM_Message[SHAVM_cnt*4+2]&0x00FF) << 8L)
         |  ((long)SHAVM_Message[SHAVM_cnt*4+3]&0x00FF);
   }

   for(; SHAVM_cnt<80; SHAVM_cnt++)
   {
      SHAVM_Temp
         = SHAVM_MTword[SHAVM_cnt-3]  ^ SHAVM_MTword[SHAVM_cnt-8]
         ^ SHAVM_MTword[SHAVM_cnt-14] ^ SHAVM_MTword[SHAVM_cnt-16];
      SHAVM_MTword[SHAVM_cnt]
         = ((SHAVM_Temp << 1) & 0xFFFFFFFE)
         | ((SHAVM_Temp >> 31) & 0x00000001);
   }

   SHAVM_Hash[0] = 0x67452301;
   SHAVM_Hash[1] = 0xEFCDAB89;
   SHAVM_Hash[2] = 0x98BADCFE;
   SHAVM_Hash[3] = 0x10325476;
   SHAVM_Hash[4] = 0xC3D2E1F0;

   for(SHAVM_cnt=0; SHAVM_cnt<80; SHAVM_cnt++)
   {
      SHAVM_Temp
         = ((SHAVM_Hash[0] << 5) & 0xFFFFFFE0)
         | ((SHAVM_Hash[0] >> 27) & 0x0000001F);
      if(SHAVM_cnt<20)
         SHAVM_Temp += ((SHAVM_Hash[1]&SHAVM_Hash[2])|((~SHAVM_Hash[1])&SHAVM_Hash[3]));
      else if(SHAVM_cnt<40)
         SHAVM_Temp += (SHAVM_Hash[1]^SHAVM_Hash[2]^SHAVM_Hash[3]);
      else if(SHAVM_cnt<60)
         SHAVM_Temp += ((SHAVM_Hash[1]&SHAVM_Hash[2])
                       |(SHAVM_Hash[1]&SHAVM_Hash[3])
                       |(SHAVM_Hash[2]&SHAVM_Hash[3]));
      else
         SHAVM_Temp += (SHAVM_Hash[1]^SHAVM_Hash[2]^SHAVM_Hash[3]);
      SHAVM_Temp += SHAVM_Hash[4] + SHAVM_KTN[SHAVM_cnt/20]
                  + SHAVM_MTword[SHAVM_cnt];
      SHAVM_Hash[4] = SHAVM_Hash[3];
      SHAVM_Hash[3] = SHAVM_Hash[2];
      SHAVM_Hash[2]
         = ((SHAVM_Hash[1] << 30) & 0xC0000000)
         | ((SHAVM_Hash[1] >> 2) & 0x3FFFFFFF);
      SHAVM_Hash[1] = SHAVM_Hash[0];
      SHAVM_Hash[0] = SHAVM_Temp;
   }

   //iButtons use LSB first, so we have to turn
   //the result around a little bit.  Instead of
   //result A-B-C-D-E, our result is E-D-C-B-A,
   //where each letter represents four bytes of
   //the result.
   for(SHAVM_cnt=0; SHAVM_cnt<5; SHAVM_cnt++)
   {
      SHAVM_Temp = SHAVM_Hash[4-SHAVM_cnt];
      SHAVM_MAC[((SHAVM_cnt)*4)+0] = (unsigned char)SHAVM_Temp;
      SHAVM_Temp >>= 8;
      SHAVM_MAC[((SHAVM_cnt)*4)+1] = (unsigned char)SHAVM_Temp;
      SHAVM_Temp >>= 8;
      SHAVM_MAC[((SHAVM_cnt)*4)+2] = (unsigned char)SHAVM_Temp;
      SHAVM_Temp >>= 8;
      SHAVM_MAC[((SHAVM_cnt)*4)+3] = (unsigned char)SHAVM_Temp;
   }
   
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 14:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表