diff --git a/efm32/.cproject b/efm32/.cproject index b4fca9f..e854489 100644 --- a/efm32/.cproject +++ b/efm32/.cproject @@ -23,7 +23,7 @@ - + @@ -31,8 +31,8 @@ - + @@ -158,7 +158,7 @@ - + @@ -177,8 +177,8 @@ - + - + diff --git a/efm32/EFM32.hwconf b/efm32/EFM32.hwconf index 0145edc..e0a7bdf 100644 --- a/efm32/EFM32.hwconf +++ b/efm32/EFM32.hwconf @@ -4,15 +4,14 @@ - + + - - @@ -87,8 +86,6 @@ - - @@ -110,6 +107,7 @@ + diff --git a/efm32/src/InitDevice.c b/efm32/src/InitDevice.c index d14012b..4b9d0c4 100644 --- a/efm32/src/InitDevice.c +++ b/efm32/src/InitDevice.c @@ -23,7 +23,6 @@ #include "em_cryotimer.h" #include "em_crypto.h" #include "em_gpio.h" -#include "em_i2c.h" #include "em_usart.h" // [Library includes]$ @@ -39,7 +38,6 @@ extern void enter_DefaultMode_from_RESET(void) { ADC0_enter_DefaultMode_from_RESET(); USART0_enter_DefaultMode_from_RESET(); USART1_enter_DefaultMode_from_RESET(); - I2C0_enter_DefaultMode_from_RESET(); CRYOTIMER_enter_DefaultMode_from_RESET(); PORTIO_enter_DefaultMode_from_RESET(); // [Config Calls]$ @@ -104,15 +102,15 @@ extern void CMU_enter_DefaultMode_from_RESET(void) { CMU_HFXOInit(&hfxoInit); /* Setting system HFRCO frequency */ - CMU_HFRCOFreqSet (cmuHFRCOFreq_38M0Hz); + CMU_HFRCOFreqSet (cmuHFRCOFreq_4M0Hz); /* Using HFRCO as high frequency clock, HFCLK */ CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFRCO); // [High Frequency Clock Setup]$ // $[LE clocks enable] - /* Enable LFRCO oscillator, and wait for it to be stable */ - CMU_OscillatorEnable(cmuOsc_LFRCO, true, true); + /* Enable ULFRCO oscillator, and wait for it to be stable */ + CMU_OscillatorEnable(cmuOsc_ULFRCO, true, true); // [LE clocks enable]$ @@ -135,9 +133,6 @@ extern void CMU_enter_DefaultMode_from_RESET(void) { /* Enable clock for CRYOTIMER */ CMU_ClockEnable(cmuClock_CRYOTIMER, true); - /* Enable clock for I2C0 */ - CMU_ClockEnable(cmuClock_I2C0, true); - /* Enable clock for USART0 */ CMU_ClockEnable(cmuClock_USART0, true); @@ -353,7 +348,7 @@ extern void USART1_enter_DefaultMode_from_RESET(void) { initsync.databits = usartDatabits8; initsync.master = 1; initsync.msbf = 1; - initsync.clockMode = usartClockMode0; + initsync.clockMode = usartClockMode1; #if defined( USART_INPUT_RXPRS ) && defined( USART_TRIGCTRL_AUTOTXTEN ) initsync.prsRxEnable = 0; initsync.prsRxCh = 0; @@ -455,24 +450,9 @@ extern void WDOG0_enter_DefaultMode_from_RESET(void) { extern void I2C0_enter_DefaultMode_from_RESET(void) { // $[I2C0 I/O setup] - /* Set up SCL */ - I2C0->ROUTEPEN = I2C0->ROUTEPEN | I2C_ROUTEPEN_SCLPEN; - I2C0->ROUTELOC0 = (I2C0->ROUTELOC0 & (~_I2C_ROUTELOC0_SCLLOC_MASK)) - | I2C_ROUTELOC0_SCLLOC_LOC3; - /* Set up SDA */ - I2C0->ROUTEPEN = I2C0->ROUTEPEN | I2C_ROUTEPEN_SDAPEN; - I2C0->ROUTELOC0 = (I2C0->ROUTELOC0 & (~_I2C_ROUTELOC0_SDALOC_MASK)) - | I2C_ROUTELOC0_SDALOC_LOC27; // [I2C0 I/O setup]$ // $[I2C0 initialization] - I2C_Init_TypeDef init = I2C_INIT_DEFAULT; - - init.enable = 1; - init.master = 1; - init.freq = I2C_FREQ_STANDARD_MAX; - init.clhr = i2cClockHLRStandard; - I2C_Init(I2C0, &init); // [I2C0 initialization]$ } @@ -577,9 +557,9 @@ extern void CRYOTIMER_enter_DefaultMode_from_RESET(void) { cryoInit.em4Wakeup = 0; /* Clocking settings */ - /* With a frequency of 32768Hz on LFRCO, this will result in a 0.98 ms timeout */ - cryoInit.osc = cryotimerOscLFRCO; - cryoInit.presc = cryotimerPresc_32; + /* With a frequency of 1000Hz on ULFRCO, this will result in a 1.00 ms timeout */ + cryoInit.osc = cryotimerOscULFRCO; + cryoInit.presc = cryotimerPresc_1; cryoInit.period = cryotimerPeriod_1; CRYOTIMER_Init(&cryoInit); // [CRYOTIMER_Init]$ diff --git a/efm32/src/device.c b/efm32/src/device.c index f6485a3..3abc375 100644 --- a/efm32/src/device.c +++ b/efm32/src/device.c @@ -30,6 +30,8 @@ #define RDY_PIN gpioPortC,10 #define RW_PIN gpioPortD,11 #define RESET_PIN gpioPortB,13 +#define LED1_PIN gpioPortF,4 +#define LED2_PIN gpioPortF,5 #define PAGE_SIZE 2048 #define PAGES 128 @@ -129,8 +131,8 @@ void ctaphid_write_block(uint8_t * data) void heartbeat() { - GPIO_PinOutToggle(gpioPortF,4); - GPIO_PinOutToggle(gpioPortF,5); + GPIO_PinOutToggle(LED1_PIN); + GPIO_PinOutToggle(LED2_PIN); nfc_test(); // printf("heartbeat %d %d\r\n", beat++,CRYOTIMER->CNT); } @@ -330,13 +332,11 @@ void bootloader_init(void) GPIO_PinModeSet(RESET_PIN, gpioModePushPull, 1); // status LEDS - GPIO_PinModeSet(gpioPortF, - 4, + GPIO_PinModeSet(LED1_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(gpioPortF, - 5, + GPIO_PinModeSet(LED2_PIN, gpioModePushPull, 1); @@ -349,10 +349,6 @@ void bootloader_init(void) // SPI R/w Indicator GPIO_PinModeSet(RW_PIN, gpioModePushPull, 1); - // USB message rdy ext int - // GPIO_ExtIntConfig(gpioPortC, 9, 9, 1, 0,1); - // NVIC_EnableIRQ(GPIO_ODD_IRQn); - printing_init(); @@ -371,13 +367,11 @@ void device_init(void) enter_DefaultMode_from_RESET(); // status LEDS - GPIO_PinModeSet(gpioPortF, - 4, + GPIO_PinModeSet(LED1_PIN, gpioModePushPull, 0); - GPIO_PinModeSet(gpioPortF, - 5, + GPIO_PinModeSet(LED2_PIN, gpioModePushPull, 1); @@ -393,10 +387,6 @@ void device_init(void) // Reset EFM8 GPIO_PinModeSet(RESET_PIN, gpioModePushPull, 1); - // USB message rdy ext int - // GPIO_ExtIntConfig(gpioPortC, 9, 9, 1, 0,1); - // NVIC_EnableIRQ(GPIO_ODD_IRQn); - printing_init(); diff --git a/efm32/src/nfc.c b/efm32/src/nfc.c index d4c55af..d5e1a9c 100644 --- a/efm32/src/nfc.c +++ b/efm32/src/nfc.c @@ -19,6 +19,7 @@ #include "app.h" #define NFC_DEV_ADDR (0xa0|(0x0<<1)) +#define NFC_DEV_USART USART1 I2C_TransferReturn_TypeDef I2CSPM_Transfer(I2C_TypeDef *i2c, I2C_TransferSeq_TypeDef *seq) { @@ -115,89 +116,147 @@ void write_reg_flash(uint8_t reg_addr, uint8_t mask,uint8_t data) exit(1); } } -void write_reg(uint8_t reg_addr, uint8_t mask,uint8_t data) + +void write_reg(uint8_t reg_addr, uint8_t data) { - uint8_t addr = NFC_DEV_ADDR; - I2C_TransferSeq_TypeDef seq; - I2C_TransferReturn_TypeDef ret; - uint8_t i2c_write_data[4]; - seq.addr = addr; - seq.flags = I2C_FLAG_WRITE; - i2c_write_data[0] = 0xFE; - i2c_write_data[1] = reg_addr; - i2c_write_data[2] = mask; - i2c_write_data[3] = data; + uint8_t mode = 0x00 | (reg_addr & 0x1f); +// delay(10); - seq.buf[0].data = i2c_write_data; - seq.buf[0].len = 4; - seq.buf[1].data = NULL; - seq.buf[1].len = 0; +// delay(10); + GPIO_PinOutClear(NFC_DEV_SS); + delay(1); + USART_SpiTransfer(NFC_DEV_USART, mode); + mode = USART_SpiTransfer(NFC_DEV_USART, data); + GPIO_PinOutSet(NFC_DEV_SS); +} - ret = I2CSPM_Transfer(I2C0, &seq); +void write_command(uint8_t cmd) +{ + + uint8_t mode = cmd; +// delay(10); + +// delay(10); + GPIO_PinOutClear(NFC_DEV_SS); + delay(1); + USART_SpiTransfer(NFC_DEV_USART, mode); + GPIO_PinOutSet(NFC_DEV_SS); + GPIO_PinOutClear(NFC_DEV_SS); + +} + +void write_eeprom(uint8_t block, uint8_t * data) +{ + + uint8_t mode = 0x40; +// delay(10); + +// delay(10); + GPIO_PinOutClear(NFC_DEV_SS); + delay(1); + USART_SpiTransfer(NFC_DEV_USART, mode); + mode = block << 1; + USART_SpiTransfer(NFC_DEV_USART, mode); + USART_SpiTransfer(NFC_DEV_USART, *data++); + USART_SpiTransfer(NFC_DEV_USART, *data++); + USART_SpiTransfer(NFC_DEV_USART, *data++); + USART_SpiTransfer(NFC_DEV_USART, *data++); + + GPIO_PinOutSet(NFC_DEV_SS); + GPIO_PinOutClear(NFC_DEV_SS); + +} + +void read_eeprom(uint8_t block, uint8_t * data) +{ + + uint8_t mode = 0x7f; +// delay(10); + +// delay(10); + GPIO_PinOutClear(NFC_DEV_SS); + delay(1); + USART_SpiTransfer(NFC_DEV_USART, mode); + mode = block << 1; + USART_SpiTransfer(NFC_DEV_USART, mode); + *data++ = USART_SpiTransfer(NFC_DEV_USART, 0); + *data++ = USART_SpiTransfer(NFC_DEV_USART, 0); + *data++ = USART_SpiTransfer(NFC_DEV_USART, 0); + *data++ = USART_SpiTransfer(NFC_DEV_USART, 0); + + + GPIO_PinOutSet(NFC_DEV_SS); + GPIO_PinOutClear(NFC_DEV_SS); - if (ret != i2cTransferDone) { - printf("I2C fail %04x\r\n",ret); - exit(1); - } } uint8_t read_reg(uint8_t reg_addr) { - I2C_TransferSeq_TypeDef seq; - I2C_TransferReturn_TypeDef ret; - uint8_t write_data[1]; - uint8_t read_data[1]; - seq.addr = NFC_DEV_ADDR; - seq.flags = I2C_FLAG_WRITE_READ; - write_data[0] = (0x1f & reg_addr) | (0x20); - printf("mode: 0x%x = 0x%02x\n",NFC_DEV_ADDR, (int)write_data[0]); + uint8_t mode = 0x20 | (reg_addr & 0x1f); +// delay(10); - seq.buf[0].data = write_data; - seq.buf[0].len = 1; - seq.buf[1].data = read_data; - seq.buf[1].len = 1; +// delay(10); + GPIO_PinOutClear(NFC_DEV_SS); + delay(1); + USART_SpiTransfer(NFC_DEV_USART, mode); + mode = USART_SpiTransfer(NFC_DEV_USART, 0); + GPIO_PinOutSet(NFC_DEV_SS); - ret = I2CSPM_Transfer(I2C0, &seq); + GPIO_PinOutClear(NFC_DEV_SS); - if (ret != i2cTransferDone) { - printf("I2C fail %04x\r\n",ret); - exit(1); - } - - return read_data[0]; +// printf("%02x: %x\n",(reg_addr),(int)mode); + return mode; } -// data must be 17 bytes long +void read_buffer(uint8_t * data, int len) +{ + + uint8_t mode = 0xC0; + int i; + if (len > 32) + { + printf("warning, max len is 32\n"); + len = 32; + } + + GPIO_PinOutClear(NFC_DEV_SS); + delay(1); + USART_SpiTransfer(NFC_DEV_USART, mode); + for(i = 0; i < len; i++) + { + *data++ = USART_SpiTransfer(NFC_DEV_USART, 0); + } + GPIO_PinOutSet(NFC_DEV_SS); + + GPIO_PinOutClear(NFC_DEV_SS); + +} + +// data must be 14 bytes long void read_reg_block(uint8_t * data) { int i; - for (i = 0; i < 15; i++) + uint8_t mode = 0x20 | (0 & 0x1f); + GPIO_PinOutClear(NFC_DEV_SS); + delay(1); + USART_SpiTransfer(NFC_DEV_USART, mode); + for (i = 0; i < 0x20; i++) { - - *data = read_reg(i); - printf("data %d: %x\n" ,i,(int)(*data)); - data++; + mode = USART_SpiTransfer(NFC_DEV_USART, 0); + if (i < 6 || (i >=8 && i < 0x0f) || (i >= 0x1e)) + { + *data = mode; + data++; + } } - *data++ = read_reg(0x1E); - *data++ = read_reg(0x1F); -} -#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 + GPIO_PinOutSet(NFC_DEV_SS); + GPIO_PinOutClear(NFC_DEV_SS); +} + + typedef struct { uint8_t header; @@ -207,68 +266,27 @@ typedef struct { uint8_t rtype; } NDEF; -#define PIN_SCL gpioPortA,4 -#define PIN_SDA gpioPortF,3 - -#define SDA_WRITE(x) if (x) GPIO_PinOutSet(PIN_SDA); else GPIO_PinOutClear(PIN_SDA); -#define SCL_WRITE(x) if (x) GPIO_PinOutSet(PIN_SCL); else GPIO_PinOutClear(PIN_SCL); - -void i2c_delay() -{ - int i; - for (i = 0; i < 38*5; i++) - { - __asm("nop"); - } -} - -void i2c_start() -{ - SDA_WRITE(0); - i2c_delay(); - i2c_delay(); - SCL_WRITE(0); -} - -void i2c_end() -{ - SCL_WRITE(1); - i2c_delay(); - i2c_delay(); - SDA_WRITE(1); -} - -// -int i2c_write_byte(uint8_t byte) -{ - uint8_t bit; - int i; - for(i = 0; i < 8; i++) - { - bit = (byte & 0x80) ? 1 : 0; - byte <<= 1; - SCL_WRITE(0); - SDA_WRITE(bit); - i2c_delay(); - SCL_WRITE(1); - i2c_delay(); - } - - SCL_WRITE(0); - SDA_WRITE(1); // release - i2c_delay(); - SCL_WRITE(1); - i2c_delay(); - int ack = GPIO_PinInGet(PIN_SDA); - SCL_WRITE(0); - i2c_delay(); - - return ack; -} +typedef struct { + uint8_t io; + uint8_t conf0; + uint8_t conf1; + uint8_t conf2; + uint8_t rfid_status; + uint8_t ic_status; + uint8_t mask0; + uint8_t mask1; + uint8_t int0; + uint8_t int1; + uint8_t buf_status2; + uint8_t buf_status1; + uint8_t last_nfc_address; + uint8_t maj; + uint8_t minor; +} __attribute__((packed)) AMS_REGS; void nfc_test() { - uint8_t data[17]; + uint8_t data[32]; uint8_t ns_reg; uint8_t last_ns_reg; // magic-number, @@ -276,20 +294,11 @@ void nfc_test() uint8_t ndef[32] = "\x03\x11\xD1\x01\x0D\x55\x01adafruit.com"; - printf("-NFC test-\n"); + AMS_REGS * regs; + + return ; - GPIO_PinOutSet(PIN_SCL); - GPIO_PinOutSet(PIN_SDA); - delay(1); - printf("pins: %d %d\n",GPIO_PinInGet(PIN_SCL),GPIO_PinInGet(PIN_SDA)); - delay(1); - GPIO_PinOutClear(PIN_SCL); - GPIO_PinOutClear(PIN_SDA); - delay(1); - printf("pins: %d %d\n",GPIO_PinInGet(PIN_SCL),GPIO_PinInGet(PIN_SDA)); - GPIO_PinOutSet(PIN_SCL); - GPIO_PinOutSet(PIN_SDA); delay(10); GPIO_PinOutSet(NFC_DEV_SS); @@ -297,94 +306,54 @@ void nfc_test() GPIO_PinOutClear(NFC_DEV_SS); delay(10); - i2c_start(); - int ack = i2c_write_byte(0xA0); - i2c_end(); - i2c_delay(); +// uint8_t reg = read_reg(0); + write_command(0xC2); // Set to default state + write_command(0xC4); // Clear buffer - int ack2 = GPIO_PinInGet(PIN_SDA); + write_reg(0x3, 0x80 | 0x40); // enable tunneling mode and RF configuration - printf("ack:%d, release: %d\n", ack,ack2); + + + read_reg_block(data); + + printf("regs: "); dump_hex(data,15); + + delay(100); + + + read_reg_block(data); + + printf("regs: "); dump_hex(data,15); + + + + if (0) + { + read_eeprom(0x7F, data); + printf("initial config: "); dump_hex(data,4); + + data[0] = (1<<2) | 0x03; // save cfg1 setting for energy harvesting + data[1] = 0x80 | 0x40; // save cfg2 setting for tunneling + write_eeprom(0x7F, data); + + printf("updated config: "); dump_hex(data,4); + } while (1) - ; - -// delay(10); -// GPIO_PinOutClear(NFC_DEV_SS); -// delay(10); - -// read_reg_block(data); -// -// printf("regs:\n"); -// dump_hex(data,17); -// -// while(1) -// ; -// -// while (1) -// { -// delay(1090); + { +// delay(100); // read_reg_block(data); -// } +// regs = (AMS_REGS *)data; // -// -// 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); - -// 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) -// { -// 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) +// if ((regs->buf_status2 & 0x3f) && !(regs->buf_status2 & 0x80)) // { -// printf("Data in sram\r\n"); -// } +// read_buffer(data, regs->buf_status2 & 0x3f); +// printf("data: "); // -//// 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; -// } +// dump_hex(data, regs->buf_status2 & 0x3f); +// } + +// dump_hex(data,15); + } }