From 111e8a6fe4f9932440cf35be08a5faa39b296912 Mon Sep 17 00:00:00 2001 From: Conor Patrick Date: Wed, 1 Aug 2018 19:36:45 -0400 Subject: [PATCH] initial development for NXP NFC I2C IC --- efm32/.cproject | 2 +- efm32/EFM32.hwconf | 7 ++- efm32/inc/app.h | 8 ++- efm32/src/InitDevice.c | 5 +- efm32/src/device.c | 1 + efm32/src/nfc.c | 132 +++++++++++++++++++++++++++++++++++------ 6 files changed, 133 insertions(+), 22 deletions(-) diff --git a/efm32/.cproject b/efm32/.cproject index 3c083fe..2605971 100644 --- a/efm32/.cproject +++ b/efm32/.cproject @@ -226,7 +226,7 @@ - + diff --git a/efm32/EFM32.hwconf b/efm32/EFM32.hwconf index 054e13b..45fe54c 100644 --- a/efm32/EFM32.hwconf +++ b/efm32/EFM32.hwconf @@ -3,7 +3,7 @@ - + @@ -61,6 +61,11 @@ + + + + + diff --git a/efm32/inc/app.h b/efm32/inc/app.h index 2f2a2c5..bec52e0 100644 --- a/efm32/inc/app.h +++ b/efm32/inc/app.h @@ -14,13 +14,17 @@ #define USING_DEV_BOARD -#define BRIDGE_TO_WALLET +//#define BRIDGE_TO_WALLET //#define DISABLE_CTAPHID_PING //#define DISABLE_CTAPHID_WINK -#define DISABLE_CTAPHID_CBOR +//#define DISABLE_CTAPHID_CBOR void printing_init(); +#define TEST +#define TEST_POWER + + #endif /* SRC_APP_H_ */ diff --git a/efm32/src/InitDevice.c b/efm32/src/InitDevice.c index 5dbfacf..5b21401 100644 --- a/efm32/src/InitDevice.c +++ b/efm32/src/InitDevice.c @@ -104,7 +104,7 @@ extern void CMU_enter_DefaultMode_from_RESET(void) { CMU_HFXOInit(&hfxoInit); /* Setting system HFRCO frequency */ - CMU_HFRCOFreqSet (cmuHFRCOFreq_13M0Hz); + CMU_HFRCOFreqSet (cmuHFRCOFreq_38M0Hz); /* Using HFRCO as high frequency clock, HFCLK */ CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFRCO); @@ -660,6 +660,9 @@ extern void PORTIO_enter_DefaultMode_from_RESET(void) { /* Pin PD10 is configured to Push-pull */ GPIO_PinModeSet(gpioPortD, 10, gpioModePushPull, 1); + + /* Pin PD15 is configured to Push-pull */ + GPIO_PinModeSet(gpioPortD, 15, gpioModePushPull, 1); // [Port D Configuration]$ // $[Port E Configuration] diff --git a/efm32/src/device.c b/efm32/src/device.c index ed8b551..f6485a3 100644 --- a/efm32/src/device.c +++ b/efm32/src/device.c @@ -424,6 +424,7 @@ void device_init(void) { buf[i] = adc_rng(); } + } #ifdef IS_BOOTLOADER typedef enum diff --git a/efm32/src/nfc.c b/efm32/src/nfc.c index 9564bb0..117fff8 100644 --- a/efm32/src/nfc.c +++ b/efm32/src/nfc.c @@ -18,6 +18,7 @@ #include "nfc.h" #include "app.h" +#define NT3H2111_ADDR 0xAA I2C_TransferReturn_TypeDef I2CSPM_Transfer(I2C_TypeDef *i2c, I2C_TransferSeq_TypeDef *seq) { @@ -35,7 +36,7 @@ I2C_TransferReturn_TypeDef I2CSPM_Transfer(I2C_TypeDef *i2c, I2C_TransferSeq_Typ // data must be 16 bytes void read_block(uint8_t block, uint8_t * data) { - uint8_t addr = 0xAA; + uint8_t addr = NT3H2111_ADDR; I2C_TransferSeq_TypeDef seq; I2C_TransferReturn_TypeDef ret; uint8_t i2c_read_data[16]; @@ -59,9 +60,37 @@ void read_block(uint8_t block, uint8_t * data) } memmove(data, i2c_read_data, 16); } + +// data must be 16 bytes +void write_block(uint8_t block, uint8_t * data) +{ + uint8_t addr = NT3H2111_ADDR; + I2C_TransferSeq_TypeDef seq; + I2C_TransferReturn_TypeDef ret; + uint8_t i2c_write_data[1 + 16]; + + seq.addr = addr; + seq.flags = I2C_FLAG_WRITE; + /* Select command to issue */ + i2c_write_data[0] = block; + memmove(i2c_write_data + 1, data, 16); + seq.buf[0].data = i2c_write_data; + seq.buf[0].len = 17; + /* Select location/length of data to be read */ + seq.buf[1].data = NULL; + seq.buf[1].len = 0; + + ret = I2CSPM_Transfer(I2C0, &seq); + + if (ret != i2cTransferDone) { + printf("I2C fail %04x\r\n",ret); + exit(1); + } +} + void write_reg_flash(uint8_t reg_addr, uint8_t mask,uint8_t data) { - uint8_t addr = 0xAA; + uint8_t addr = NT3H2111_ADDR; I2C_TransferSeq_TypeDef seq; I2C_TransferReturn_TypeDef ret; uint8_t i2c_write_data[4]; @@ -87,7 +116,7 @@ void write_reg_flash(uint8_t reg_addr, uint8_t mask,uint8_t data) } void write_reg(uint8_t reg_addr, uint8_t mask,uint8_t data) { - uint8_t addr = 0xAA; + uint8_t addr = NT3H2111_ADDR; I2C_TransferSeq_TypeDef seq; I2C_TransferReturn_TypeDef ret; uint8_t i2c_write_data[4]; @@ -119,7 +148,7 @@ uint8_t read_reg(uint8_t reg_addr) uint8_t write_data[2]; uint8_t read_data[1]; - seq.addr = 0xAA; + seq.addr = NT3H2111_ADDR; seq.flags = I2C_FLAG_WRITE_READ; write_data[0] = 0xFE; write_data[1] = reg_addr; @@ -149,30 +178,99 @@ void read_reg_block(uint8_t * data) data++; } } +#define NS_REG_ADDR 6 +typedef enum{ + RF_FIELD_PRESENT = 0x01, + EEPROM_WR_BUSY = 0x02, + EEPROM_WR_ERR = 0x04, + SRAM_RF_READY = 0x08, + SRAM_I2C_READY = 0x10, + RF_LOCKED = 0x20, + I2C_LOCKED = 0x40, + NDEF_DATA_READ = 0x80, +} NS_REG_BIT; +#define RF_FIELD_PRESENT 0x01 +#define EEPROM_WR_BUSY 0x02 +#define SRAM_RF_READY 0x02 + +typedef struct { + uint8_t header; + uint8_t tlen; + uint8_t plen; + uint8_t ilen; + uint8_t rtype; +} NDEF; void nfc_test() { uint8_t data[16]; + uint8_t ns_reg; + uint8_t last_ns_reg; + // magic-number, + uint8_t cc[] = {0xE1,0x10,0x08, 0x00}; + + uint8_t ndef[32] = "\x03\x11\xD1\x01\x0D\x55\x01adafruit.com"; + printf("-NFC test-\n"); - read_block(0x00, data); - printf("block 00: "); dump_hex(data,16); + return; +// +//// +// read_block(0x00, data); +// read_block(0x00, data); +// printf("block 00: "); dump_hex(data,16); +// +// printf("capability container [init]: "); dump_hex(data+12,4); +// +// data[0] = 0xaa; +// memmove(data+12,cc,4); +// +// write_block(0x00,data); +// delay(10); +// write_block(0x01,ndef); +// delay(10); +// write_block(0x02,ndef+16); +// delay(10); +// printf("wrote block\n"); +// +// read_block(0x00, data); +// +// printf("capability container [done]: "); dump_hex(data+12,4); +// +// read_reg_block(data); +// printf("regs [init]:"); dump_hex(data,8); - read_reg_block(data); - printf("block 3A [init]:"); dump_hex(data,8); - - write_reg(0, 0xff, 0x43); - write_reg_flash(0, 0xff, 0x43); - write_reg(2, 0xff, 0x01); - - read_reg_block(data); - printf("block 3A [done]:"); dump_hex(data,8); +// write_reg(0, 0xff, 0x42); +// write_reg(2, 0xff, 0x01); +// +// read_reg_block(data); +// printf("block 3A [done]:"); dump_hex(data,8); // // read_block(0x3A, data); // printf("block 3A [done]:"); dump_hex(data,16); - while(1) - ; +// while(1) +// { +// delay(250); +// read_reg_block(data); +// printf("regs:"); dump_hex(data,8); +// +// ns_reg = read_reg(NS_REG_ADDR); +// if (ns_reg & SRAM_I2C_READY) +// { +// printf("Data in sram\r\n"); +// } +// +//// if ((ns_reg & RF_FIELD_PRESENT) && !(last_ns_reg & RF_FIELD_PRESENT)) +//// { +//// printf("RF present\r\n"); +//// } +//// if (!(ns_reg & RF_FIELD_PRESENT) && (last_ns_reg & RF_FIELD_PRESENT)) +//// { +//// printf("RF gone\r\n"); +//// } +// last_ns_reg = ns_reg; +// } }