ST25DV上的I2C当前密码

时间:2018-06-27 11:01:12

标签: arduino nfc i2c

我正在使用NFC xip(ST25DV04K),并且正在尝试打开I2C安全会话。主设备是ATTiny85,它将数据写入NFC IC。

我尝试使用这里使用的函数:https://github.com/stm32duino/X-NUCLEO-NFC04A1/blob/master/src/ST25DV/st25dv.c以及编写一个逐字节写入密码(密码+验证码0x09 +密码)的函数,但是,当我检查I2C_SSO_Dyn字节时,它仍然显示它是封闭的。我找不到更多示例,并且数据表没有提供更多信息。

该芯片是全新的,因此它的密码应该是默认密码(我已经检查了对系统内存的射频访问权限,并且可以使用默认密码正常工作。)

我认为问题可能是由于计时问题引起的,所以我在发送每个字节后增加了延迟,但是仍然无法打开安全会话。

由于我可以访问芯片的非保护区域,因此写入功能正常运行。

任何帮助或想法都将不胜感激。

#include <TinyWireM.h>  // I2C Master lib for ATTinys which use USI

typedef struct                  //Define Password struct
{
  uint32_t MsbPasswd;
  uint32_t LsbPasswd;
} ST25DV_PASSWD;

void setup() {
  TinyWireM.begin();

  ST25DV_PASSWD i2cPasswd;      //PASSWORD
  i2cPasswd.MsbPasswd = 0x0000;
  i2cPasswd.LsbPasswd = 0x0000;

  //Present password 
  ST25DV_i2c_PresentI2CPassword(i2cPasswd);

}
//*******************************************************************************
//                    I2C PRESENT PASSWORD
//*******************************************************************************
void ST25DV_i2c_PresentI2CPassword( const ST25DV_PASSWD PassWord ) {
  uint8_t ai2c_message[17] = {0};
  uint8_t i;

  /* Build I2C Message with Password + Validation code 0x09 + Password */
  ai2c_message[8] = 0x09;
  for( i = 0; i < 4; i++ )
  {
    ai2c_message[i] = ( PassWord.MsbPasswd >> ( (3 - i) * 8) ) & 0xFF;
    ai2c_message[i + 4] = ( PassWord.LsbPasswd >> ( (3 - i) * 8) ) & 0xFF;
    ai2c_message[i + 9] = ai2c_message[i];
    ai2c_message[i + 13] = ai2c_message[i + 4];
  };

  /* Present password to ST25DV */
  delay(10);
  i2c_eeprom_write_bytes( 0x57, 0x0900, ai2c_message, 17 );
}
//*******************************************************************************
//                    NFC FUNCTIONS
//*******************************************************************************
void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    int rdata = data;
    TinyWireM.beginTransmission(deviceaddress);
    TinyWireM.send((int)(eeaddress >> 8)); // MSB
    TinyWireM.send((int)(eeaddress & 0xFF)); // LSB
    TinyWireM.send(rdata);
    TinyWireM.endTransmission();
}

void i2c_eeprom_write_bytes( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
    byte c;
    for ( c = 0; c < length; c++){
        TinyWireM.beginTransmission(deviceaddress);
        TinyWireM.send((int)(eeaddresspage >> 8)); // MSB
        TinyWireM.send((int)(eeaddresspage & 0xFF)); // LSB
        TinyWireM.send(data[c]);
        TinyWireM.endTransmission();
        delay(10);
        eeaddresspage++;
    }
}

0 个答案:

没有答案