11#define NFC4_I2C_ADDR_USER (0x53 << 1)
12#define NFC4_I2C_ADDR_SYSTEM (0x57 << 1)
15#define REG_GPO_CTRL_DYN 0x2000
16#define REG_EH_CTRL_DYN 0x2001
17#define REG_MB_CTRL_DYN 0x200D
18#define REG_MB_LEN_DYN 0x200E
19#define REG_MB_RAM_START 0x2008
22#define NFC4_EH_FIELD_ON 0x04
25#define NFC4_RF_BUSY_TIMEOUT 20U
33int8_t nfc_st25r3_Is(I2C_HandleTypeDef *hi2c, int8_t tryInit)
36 nfc_st25r3_Init(hi2c);
40static HAL_StatusTypeDef nfc_st25r3_PresentPassword(I2C_HandleTypeDef *hi2c)
43 uint8_t pwd_payload[17];
44 pwd_payload[0] = 0x09;
45 memset(&pwd_payload[1], 0x00, 16);
48 return HAL_I2C_Mem_Write(hi2c, NFC4_I2C_ADDR_SYSTEM, 0x0900, 2, pwd_payload, 17, 200);
51static HAL_StatusTypeDef nfc_st25r3_onOff(I2C_HandleTypeDef *hi2c, uint8_t onOff)
53 HAL_StatusTypeDef status = HAL_ERROR;
62 for (i = 0; i < 5; i++)
64 status = HAL_I2C_Mem_Write(hi2c, NFC4_I2C_ADDR_USER, REG_GPO_CTRL_DYN, I2C_MEMADD_SIZE_16BIT, ®_val, 1, 100);
69 _isNfc = (status == HAL_OK);
75HAL_StatusTypeDef nfc_st25r3_On(I2C_HandleTypeDef *hi2c)
79 return nfc_st25r3_onOff(hi2c, 0x95);
82HAL_StatusTypeDef nfc_st25r3_Off(I2C_HandleTypeDef *hi2c)
86 return nfc_st25r3_onOff(hi2c, 0x00);
89HAL_StatusTypeDef nfc_st25r3_IsOn(I2C_HandleTypeDef *hi2c, uint8_t *onOff)
91 HAL_StatusTypeDef status = HAL_ERROR;
96 status = HAL_I2C_Mem_Read(hi2c, NFC4_I2C_ADDR_USER, REG_GPO_CTRL_DYN, I2C_MEMADD_SIZE_16BIT, ®_val, 1, 100);
99 *onOff = (reg_val & 0x80) != 0;
104HAL_StatusTypeDef nfc_st25r3_Init(I2C_HandleTypeDef *hi2c)
106 HAL_StatusTypeDef status;
116 if ((status = nfc_st25r3_PresentPassword(hi2c)) != HAL_OK)
125 if ((status = HAL_I2C_Mem_Write(hi2c, NFC4_I2C_ADDR_SYSTEM, 0x000D, 2, ®_val, 1, 100)) != HAL_OK)
133 for (i = 0; i < 5; i++)
135 status = HAL_I2C_Mem_Write(hi2c, NFC4_I2C_ADDR_USER, REG_MB_CTRL_DYN, I2C_MEMADD_SIZE_16BIT, ®_val, 1, 100);
136 if (status == HAL_OK)
140 if (status != HAL_OK)
149 if ((status = HAL_I2C_Mem_Write(hi2c, NFC4_I2C_ADDR_USER, REG_MB_CTRL_DYN, I2C_MEMADD_SIZE_16BIT, ®_val, 1, 100)) != HAL_OK)
156 nfc_st25r3_Off(hi2c);
161HAL_StatusTypeDef nfc_st25r3_ReadEEPROM(I2C_HandleTypeDef *hi2c, uint16_t addr, uint8_t *pData, uint16_t len)
163 return (
_isNfc) ? HAL_I2C_Mem_Read(hi2c, NFC4_I2C_ADDR_USER, addr, I2C_MEMADD_SIZE_16BIT, pData, len, 500) : HAL_ERROR;
166int8_t nfc_st25r3_IsRFBusy(I2C_HandleTypeDef *hi2c)
174 if (HAL_I2C_Mem_Read(hi2c, NFC4_I2C_ADDR_USER, REG_EH_CTRL_DYN,
175 I2C_MEMADD_SIZE_16BIT, ®_val, 1, 50) != HAL_OK)
179 return (reg_val & NFC4_EH_FIELD_ON) ? 1 : 0;
182HAL_StatusTypeDef nfc_st25r3_WriteEEPROM(I2C_HandleTypeDef *hi2c, uint16_t addr, uint8_t *pData, uint16_t len)
184 HAL_StatusTypeDef status = HAL_ERROR;
198 if (status == HAL_OK)
206 uint16_t page_offset = (addr + i) % 4;
207 uint16_t max_in_page = 4 - page_offset;
208 uint16_t remaining = len - i;
209 uint16_t chunk = remaining < max_in_page ? remaining : max_in_page;
215 status = HAL_I2C_Mem_Write(hi2c, NFC4_I2C_ADDR_USER, addr + i, I2C_MEMADD_SIZE_16BIT, &pData[i], chunk, 100);
216 if (status == HAL_OK)
219 }
while (++retry < 10);
221 if (status != HAL_OK)
231void nfc_st25r3_ResetEEPROM(I2C_HandleTypeDef *hi2c, uint16_t len)
236 for (uint16_t i = 0; i < len; i++)
238 nfc_st25r3_WriteEEPROM(hi2c, i, &zero, 1);
242HAL_StatusTypeDef nfc_st25r3_ProcessMailBox(I2C_HandleTypeDef *hi2c)
244 uint8_t mb_ctrl, mb_len;
249 HAL_I2C_Mem_Read(hi2c, NFC4_I2C_ADDR_USER, REG_MB_CTRL_DYN, I2C_MEMADD_SIZE_16BIT, &mb_ctrl, 1, 100);
253 HAL_I2C_Mem_Read(hi2c, NFC4_I2C_ADDR_USER, REG_MB_LEN_DYN, I2C_MEMADD_SIZE_16BIT, &mb_len, 1, 100);
255 uint16_t msg_len = mb_len + 1;
257 HAL_I2C_Mem_Read(hi2c, NFC4_I2C_ADDR_USER, REG_MB_RAM_START, I2C_MEMADD_SIZE_16BIT, buffer, msg_len, 200);
265HAL_StatusTypeDef nfc_st25r3_WriteMailBoxNDEF(I2C_HandleTypeDef *hi2c,
char *text)
270 uint8_t payload[128];
271 uint8_t text_len = strlen(text);
276 payload[2] = text_len + 3;
281 memcpy(&payload[7], text, text_len);
283 return HAL_I2C_Mem_Write(hi2c, NFC4_I2C_ADDR_USER, REG_MB_RAM_START, I2C_MEMADD_SIZE_16BIT, payload, text_len + 7, 200);
286HAL_StatusTypeDef nfc_st25r3_SetRFMgmt(I2C_HandleTypeDef *hi2c, uint8_t enable)
291 nfc_st25r3_PresentPassword(hi2c);
292 uint8_t val = enable ? 0x00 : 0x01;
293 return HAL_I2C_Mem_Write(hi2c, NFC4_I2C_ADDR_SYSTEM, 0x0003, 2, &val, 1, 100);
This file contains all the function prototypes for the i2c.c file.
HAL_StatusTypeDef I2C_IsDeviceReadyMT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
Wrapper around HAL_I2C_IsDeviceReady() that recovers from a busy bus. If the HAL I2C bus is in a BUSY...
void nfc_st25r3_OnMailboxData(uint8_t *data, uint16_t len)
void HAL_Delay(__IO uint32_t Delay)