andiwxz 发表于 2014-10-13 09:38:51

ds28e01 copy返回值0x00求助

我使用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);
//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。
intWrite8Byte(short TargetAddress, INT8U *buf, INT8U *PageData)
{
unsigned char   BasicSecret;

//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, PageData, 28);
           memcpy(&SHAVM_Message, buf, 8);
      SHAVM_Message=(TargetAddress>>5)&0x03;
        memcpy(&SHAVM_Message, OW_RomID, 7);
            memcpy(&SHAVM_Message, &BasicSecret, 4);
      memset(&SHAVM_Message,0xff, 3);
           SHAVM_Message = 0x80;
           memset(&SHAVM_Message, 0x00, 6);
           SHAVM_Message = 0x01;
           SHAVM_Message = 0xB8;
}
if( TargetAddress>=0x88 )
{
           memcpy(SHAVM_Message, BasicSecret, 4);
      memcpy(&SHAVM_Message, BasicSecret, 8);
           memcpy(&SHAVM_Message, PageData, 20);
           memcpy(&SHAVM_Message, buf, 8);
      SHAVM_Message=0x04;
        memcpy(&SHAVM_Message, OW_RomID, 7);
            memcpy(&SHAVM_Message, &BasicSecret, 4);
      memset(&SHAVM_Message,0xff, 3);
           SHAVM_Message = 0x80;
           memset(&SHAVM_Message, 0x00, 6);
           SHAVM_Message = 0x01;
           SHAVM_Message = 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, 0x00, 32);
           memcpy(SHAVM_Message, DeviceSecret, 4);
           memset(&SHAVM_Message, 0xff, 4);
      SHAVM_Message=OW_RomID&0x3f;
        memcpy(&SHAVM_Message, &OW_RomID, 7);
            memcpy(&SHAVM_Message, &DeviceSecret, 4);
      memset(&SHAVM_Message,0xff, 3);
           SHAVM_Message = 0x80;
           memset(&SHAVM_Message, 0x00, 6);
           SHAVM_Message = 0x01;
           SHAVM_Message = 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=(long)0x5a827999;
   SHAVM_KTN=(long)0x6ed9eba1;
   SHAVM_KTN=(long)0x8f1bbcdc;
   SHAVM_KTN=(long)0xca62c1d6;   
   for(SHAVM_cnt=0; SHAVM_cnt<16; SHAVM_cnt++)
   {
      SHAVM_MTword
         = (((long)SHAVM_Message&0x00FF) << 24L)
         | (((long)SHAVM_Message&0x00FF) << 16L)
         | (((long)SHAVM_Message&0x00FF) << 8L)
         |((long)SHAVM_Message&0x00FF);
   }

   for(; SHAVM_cnt<80; SHAVM_cnt++)
   {
      SHAVM_Temp
         = SHAVM_MTword^ SHAVM_MTword
         ^ SHAVM_MTword ^ SHAVM_MTword;
      SHAVM_MTword
         = ((SHAVM_Temp << 1) & 0xFFFFFFFE)
         | ((SHAVM_Temp >> 31) & 0x00000001);
   }

   SHAVM_Hash = 0x67452301;
   SHAVM_Hash = 0xEFCDAB89;
   SHAVM_Hash = 0x98BADCFE;
   SHAVM_Hash = 0x10325476;
   SHAVM_Hash = 0xC3D2E1F0;

   for(SHAVM_cnt=0; SHAVM_cnt<80; SHAVM_cnt++)
   {
      SHAVM_Temp
         = ((SHAVM_Hash << 5) & 0xFFFFFFE0)
         | ((SHAVM_Hash >> 27) & 0x0000001F);
      if(SHAVM_cnt<20)
         SHAVM_Temp += ((SHAVM_Hash&SHAVM_Hash)|((~SHAVM_Hash)&SHAVM_Hash));
      else if(SHAVM_cnt<40)
         SHAVM_Temp += (SHAVM_Hash^SHAVM_Hash^SHAVM_Hash);
      else if(SHAVM_cnt<60)
         SHAVM_Temp += ((SHAVM_Hash&SHAVM_Hash)
                     |(SHAVM_Hash&SHAVM_Hash)
                     |(SHAVM_Hash&SHAVM_Hash));
      else
         SHAVM_Temp += (SHAVM_Hash^SHAVM_Hash^SHAVM_Hash);
      SHAVM_Temp += SHAVM_Hash + SHAVM_KTN
                  + SHAVM_MTword;
      SHAVM_Hash = SHAVM_Hash;
      SHAVM_Hash = SHAVM_Hash;
      SHAVM_Hash
         = ((SHAVM_Hash << 30) & 0xC0000000)
         | ((SHAVM_Hash >> 2) & 0x3FFFFFFF);
      SHAVM_Hash = SHAVM_Hash;
      SHAVM_Hash = 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;
      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;
   }
   
}

页: [1]
查看完整版本: ds28e01 copy返回值0x00求助