|
我使用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周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|