diff --git a/targets/stm32l432/src/nfc.c b/targets/stm32l432/src/nfc.c index 8d73a30..980367f 100644 --- a/targets/stm32l432/src/nfc.c +++ b/targets/stm32l432/src/nfc.c @@ -7,6 +7,9 @@ #include "log.h" #include "util.h" +#define SELECT() LL_GPIO_ResetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN) +#define UNSELECT() LL_GPIO_SetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN) + static void flush_rx() { @@ -29,10 +32,29 @@ static void wait_for_rx() } -#define SELECT() LL_GPIO_ResetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN) -#define UNSELECT() LL_GPIO_SetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN) +static void ams_print_device(AMS_DEVICE * dev) +{ + printf1(TAG_NFC, "AMS_DEVICE:\r\n"); + printf1(TAG_NFC, " io_conf: %02x\r\n",dev->regs.io_conf); + printf1(TAG_NFC, " ic_conf0: %02x\r\n",dev->regs.ic_conf0); + printf1(TAG_NFC, " ic_conf1: %02x\r\n",dev->regs.ic_conf1); + printf1(TAG_NFC, " ic_conf2: %02x\r\n",dev->regs.ic_conf2); + printf1(TAG_NFC, " rfid_status: %02x\r\n",dev->regs.rfid_status); + printf1(TAG_NFC, " ic_status: %02x\r\n",dev->regs.ic_status); + printf1(TAG_NFC, " mask_int0: %02x\r\n",dev->regs.mask_int0); + printf1(TAG_NFC, " mask_int1: %02x\r\n",dev->regs.mask_int1); + printf1(TAG_NFC, " int0: %02x\r\n",dev->regs.int0); + printf1(TAG_NFC, " int1: %02x\r\n",dev->regs.int1); + printf1(TAG_NFC, " buffer_status2: %02x\r\n",dev->regs.buffer_status2); + printf1(TAG_NFC, " buffer_status1: %02x\r\n",dev->regs.buffer_status1); + printf1(TAG_NFC, " last_nfc_addr: %02x\r\n",dev->regs.last_nfc_addr); + printf1(TAG_NFC, " product_type: %02x\r\n",dev->regs.product_type); + printf1(TAG_NFC, " product_subtype: %02x\r\n",dev->regs.product_subtype); + printf1(TAG_NFC, " version_maj: %02x\r\n",dev->regs.version_maj); + printf1(TAG_NFC, " version_min: %02x\r\n",dev->regs.version_min); +} -uint8_t send_recv(uint8_t b) +static uint8_t send_recv(uint8_t b) { wait_for_tx(); LL_SPI_TransmitData8(SPI1, b); @@ -41,16 +63,9 @@ uint8_t send_recv(uint8_t b) return b; } -uint8_t send_recv2(uint8_t b1,uint8_t b2) -{ - send_recv(b1); - return send_recv(b2); -} -void ams_write_reg(uint8_t addr, uint8_t tx) +static void ams_write_reg(uint8_t addr, uint8_t tx) { - // SELECT(); - // delay(2); send_recv(0x00| addr); send_recv(tx); @@ -61,77 +76,48 @@ void ams_write_reg(uint8_t addr, uint8_t tx) uint8_t ams_read_reg(uint8_t addr) { - // SELECT(); - // delay(2); - - uint8_t data = send_recv2(0x20| (addr & 0x1f), 0); - // send_recv(0x20| addr); - // - // uint8_t data = send_recv(0); - - // delay(2); + send_recv(0x20| (addr & 0x1f)); + uint8_t data = send_recv(0); UNSELECT(); SELECT(); return data; } // data must be 14 bytes long -void read_reg_block2(uint8_t * data) +void read_reg_block2(AMS_DEVICE * dev) { int i; - for (i = 0; i < 0x20; i++) + for (i = 0; i < 0x20; i++) { - // if (i < 6 || (i >=8 && i < 0x0f) || (i >= 0x1e)) - { - *data = ams_read_reg(i); - data++; - } + dev->buf[i] = ams_read_reg(i); } - } // data must be 14 bytes long -void read_reg_block(uint8_t * data) +void read_reg_block(AMS_DEVICE * dev) { int i; uint8_t mode = 0x20 | (0 ); flush_rx(); - // SELECT(); - // delay(2); send_recv(mode); for (i = 0; i < 0x20; i++) { - mode = send_recv(0); - // if (i < 6 || (i >=8 && i < 0x0f) || (i >= 0x1e)) - // { - *data = mode; - data++; - // } + dev->buf[i] = send_recv(0); } UNSELECT(); SELECT(); - // UNSELECT(); - // delay(2); - // SELECT(); + } void ams_write_command(uint8_t cmd) { - - uint8_t mode = cmd; - // delay(10); - - // delay(10); - SELECT(); - delay(1); - send_recv(mode); + send_recv(0xc0 | cmd); UNSELECT(); SELECT(); - } void nfc_init() @@ -149,51 +135,39 @@ void nfc_loop() { static int run = 0; + AMS_DEVICE ams,ams2; if (!run) { - uint8_t regs[0x20]; run = 1; - delay(10); - LL_GPIO_SetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN); - delay(10); - // LL_GPIO_ResetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN); delay(10); SELECT(); delay(10); - // ams_write_command(0xC2); // Set to default state - // ams_write_command(0xC4); // Clear buffer - ams_write_reg(2,7); + + ams_write_command(AMS_CMD_DEFAULT); + ams_write_command(AMS_CMD_CLEAR_BUFFER); + + ams_write_reg(AMS_REG_IC_CONF1,7); + int x; - for (x = 0 ; x < 10; x++) + for (x = 0 ; x < 2; x++) { - memset(regs,0,sizeof(regs)); - // ams_write_reg(1,7); - read_reg_block(regs); - printf1(TAG_NFC,"regs: "); dump_hex1(TAG_NFC,regs,sizeof(regs)); - - + read_reg_block(&ams); + printf1(TAG_NFC,"regs: "); dump_hex1(TAG_NFC,ams.buf,sizeof(AMS_DEVICE)); + ams_print_device(&ams); } + printf1(TAG_NFC,"---\r\n"); - for (x = 0 ; x < 10; x++) + for (x = 0 ; x < 2; x++) { - memset(regs,0,sizeof(regs)); - read_reg_block2(regs); - printf1(TAG_NFC,"regs: "); dump_hex1(TAG_NFC,regs,sizeof(regs)); + read_reg_block2(&ams2); + printf1(TAG_NFC,"regs: "); dump_hex1(TAG_NFC,ams.buf,sizeof(AMS_DEVICE)); } - printf1(TAG_NFC,"Version: %02x\r\n",ams_read_reg(0x1e)); - printf1(TAG_NFC,"Product Type: %02x\r\n",ams_read_reg(0x1c)); + printf1(TAG_NFC,"Version: %02x vs %02x\r\n",ams_read_reg(0x1e), ams.regs.version_maj); + printf1(TAG_NFC,"Product Type: %02x vs %02x\r\n",ams_read_reg(0x1c), ams.regs.product_type); + printf1(TAG_NFC,"Electrical: %02x vs %02x\r\n",ams_read_reg(2), ams.regs.ic_conf1); - // - // LL_GPIO_SetOutputPin(SOLO_AMS_CS_PORT,SOLO_AMS_CS_PIN); - // - // memset(regs,0,sizeof(regs)); - // for (x = 0 ; x < sizeof(regs); x++) - // { - // regs[x] = ams_read_reg(x); - // } - // printf1(TAG_NFC,"regs2: "); dump_hex1(TAG_NFC,regs,sizeof(regs)); } } diff --git a/targets/stm32l432/src/nfc.h b/targets/stm32l432/src/nfc.h index b686f81..1d2fdbd 100644 --- a/targets/stm32l432/src/nfc.h +++ b/targets/stm32l432/src/nfc.h @@ -1,7 +1,54 @@ #ifndef _NFC_H_ #define _NFC_H_ +#include + void nfc_loop(); void nfc_init(); +typedef union +{ + uint8_t buf[0x20]; + struct { + uint8_t io_conf; // 0x00 + uint8_t ic_conf0; // 0x01 + uint8_t ic_conf1; // 0x02 + uint8_t ic_conf2; // 0x03 + uint8_t rfid_status; // 0x04 + uint8_t ic_status; // 0x05 + uint8_t _nc0[2]; // 0x06 - 0x07 + uint8_t mask_int0; // 0x08 + uint8_t mask_int1; // 0x09 + uint8_t int0; // 0x0a + uint8_t int1; // 0x0b + uint8_t buffer_status2; // 0x0c + uint8_t buffer_status1; // 0x0d + uint8_t last_nfc_addr; // 0x0e + uint8_t _nc1[0x1b - 0x0f + 1]; // 0x0f - 0x1b + uint8_t product_type; // 0x1c + uint8_t product_subtype; // 0x1d + uint8_t version_maj; // 0x1e + uint8_t version_min; // 0x1f + } regs; +} AMS_DEVICE; + +#define AMS_REG_IO_CONF 0x00 +#define AMS_REG_IC_CONF0 0x01 +#define AMS_REG_IC_CONF1 0x02 +#define AMS_REG_IC_CONF2 0x03 + +#define AMS_CMD_DEFAULT 0x02 +#define AMS_CMD_CLEAR_BUFFER 0x04 +#define AMS_CMD_RESTART_TRANSCEIVER 0x06 +#define AMS_CMD_DIS_EN_TRANSCEIVER 0x07 +#define AMS_CMD_TRANSMIT_BUFFER 0x08 +#define AMS_CMD_TRANSMIT_ACK 0x09 +#define AMS_CMD_TRANSMIT_NACK0 0x0A +#define AMS_CMD_TRANSMIT_NACK1 0x0B +#define AMS_CMD_TRANSMIT_NACK4 0x0D +#define AMS_CMD_TRANSMIT_NACK5 0x0C +#define AMS_CMD_SLEEP 0x10 +#define AMS_CMD_SENSE 0x11 +#define AMS_CMD_SENSE_SLEEP 0x12 + #endif