我正在使用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++;
}
}