Fork of the GitHub version

Revision:
0:cf62b690f57c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/x_nucleo_nfc04a1.cpp	Thu Nov 14 10:30:13 2019 +0000
@@ -0,0 +1,362 @@
+/**
+  ******************************************************************************
+  * @file    x_nucleo_nfc04a1.c
+  * @author  MMY Application Team
+  * @version $Revision: 3351 $
+  * @date    $Date: 2017-01-25 17:28:08 +0100 (Wed, 25 Jan 2017) $
+  * @brief   This file provides nfc04a1 specific functions
+  ******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2017 STMicroelectronics</center></h2>
+  *
+  * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
+  * You may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at:
+  *
+  *        http://www.st.com/myliberty  
+  *
+  * Unless required by applicable law or agreed to in writing, software 
+  * distributed under the License is distributed on an "AS IS" BASIS, 
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+  * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+  * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  *
+  ******************************************************************************
+  */ 
+
+/* Includes ------------------------------------------------------------------*/
+#include "x_nucleo_nfc04a1.h"
+//#include "x_nucleo_nfc04a1_nfctag.h"
+//#include "mbed.h"
+//#include "PinNames.h"
+#include "time.h"
+
+/*
+#if define
+define
+#endif
+*/
+
+
+/*Stream *_serial = NULL;
+#if defined(ARDUINO_SAM_DUE)
+TwoWire *_wire = &Wire1;
+#else
+TwoWire *_wire = &Wire;
+#endif
+* @addtogroup BSP
+ * @{
+ */
+
+/** @defgroup X_NUCLEO_NFC04A1
+ * @{
+ */
+/* Private typedef -----------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/ 
+/* Global variables ----------------------------------------------------------*/
+/** @defgroup X_NUCLEO_NFC04A1_Global_Variables
+ * @{
+ */
+//uint8_t NFC04A1_Led[3] = {  1 , 2 , 3 };
+
+/**
+ * @}
+ */
+
+/* Private function prototypes -----------------------------------------------*/
+
+NFCTAG_StatusTypeDef ST25DV_IO_Init( I2C* mi2cChannel, DigitalOut *mLPD );
+NFCTAG_StatusTypeDef ST25DV_IO_MemWrite( const uint8_t * const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size, I2C* mi2cChannel );
+NFCTAG_StatusTypeDef ST25DV_IO_MemRead( uint8_t * const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size, I2C* mi2cChannel );
+NFCTAG_StatusTypeDef ST25DV_IO_Read( uint8_t * const pData, const uint8_t DevAddr, const uint16_t Size, I2C* mi2cChannel );
+NFCTAG_StatusTypeDef ST25DV_IO_IsDeviceReady( const uint8_t DevAddr, const uint32_t Trials, I2C* mi2cChannel);
+NFCTAG_StatusTypeDef NFCTAG_ConvertStatus(uint8_t ret);
+
+
+/* Functions Definition ------------------------------------------------------*/
+/** @defgroup X_NUCLEO_NFC04A1_Public_Functions
+ * @{
+ */
+
+
+
+/**
+  * @brief  Toggles the selected LED
+  * @param  led : Specifies the Led to be toggled
+  * @retval None
+  */
+void NFC04A1_LED_Toggle( DigitalOut* led)
+{
+	*led = !(*led);
+}
+
+
+
+/**
+  * @brief  This function get the GPIO value through GPIO
+  * @param  None
+  * @retval HAL GPIO pin status
+  */
+DigitalOut NFC04A1_GPO_ReadPin( DigitalOut *mMISO )
+{
+  return *mMISO;
+}
+
+/**
+  * @brief  This function initialize the GPIO to manage the NFCTAG LPD pin
+  * @param  None
+  * @retval None
+  */
+
+void NFC04A1_LPD_Init( DigitalOut *mLPD )
+{
+	*mLPD = 0;
+}
+
+/**
+  * @brief  This function get the GPIO value through GPIO
+  * @param  None
+  * @retval HAL GPIO pin status
+  */
+uint8_t NFC04A1_LPD_ReadPin( DigitalOut *mLPD )
+{
+  return mLPD -> read();
+}
+
+/**
+  * @brief  This function get the GPIO value through GPIO
+  * @param  None
+  * @retval HAL GPIO pin status
+  */
+void NFC04A1_LPD_WritePin( uint8_t LpdPinState, DigitalOut *mLPD )
+{
+  mLPD -> write( LpdPinState );
+}
+
+/**
+  * @brief  This function select the i2cChannel1 speed to communicate with NFCTAG
+  * @param  i2cChannelspeedchoice Number from 0 to 5 to select i2cChannel speed
+  * @param mi2cChannel : I2C channel
+  * @retval HAL GPIO pin status
+  */
+void NFC04A1_Selecti2cSpeed( uint8_t i2cspeedchoice, I2C* mi2cChannel)
+{
+  
+  switch( i2cspeedchoice )
+  {
+    case 0:
+      
+      mi2cChannel -> frequency(10000);
+      break;
+    
+    case 1:
+      
+      mi2cChannel -> frequency(100000);
+      break;
+    
+    case 2:
+      
+    mi2cChannel -> frequency(200000);
+      break;
+    
+    case 3:
+      
+    mi2cChannel -> frequency(400000);
+      break;
+    
+    case 4:
+
+    mi2cChannel -> frequency(800000);
+      break;
+    
+    case 5:
+      
+    mi2cChannel -> frequency(1000000);
+      break;
+    
+    default:
+      
+    mi2cChannel -> frequency(1000000);
+      break;
+  }    
+
+}
+
+/**
+ * @}
+ */
+
+/** @defgroup X_NUCLEO_NFC04A1_Private_Functions
+ * @{
+ */
+/******************************** LINK EEPROM COMPONENT *****************************/
+
+/**
+  * @brief  Initializes peripherals used by the i2cChannel NFCTAG driver
+  * @param mi2cChannel : I2C channel
+  * @param mLPD
+  * @retval NFCTAG enum status
+  */
+NFCTAG_StatusTypeDef ST25DV_IO_Init( I2C* mi2cChannel, DigitalOut *mLPD )
+{
+
+  
+  NFC04A1_LPD_Init( mLPD );
+
+  NFC04A1_Selecti2cSpeed(3, mi2cChannel);
+
+  return NFCTAG_OK;
+}
+
+/**
+  * @brief  Write data, at specific address, through i2c to the ST25DV
+  * @param  pData: pointer to the data to write
+  * @param  DevAddr : Target device address
+  * @param  TarAddr : i2c data memory address to write
+  * @param  Size : Size in bytes of the value to be written
+  * @param mi2cChannel : I2C channel
+  * @retval NFCTAG enum status
+  */
+NFCTAG_StatusTypeDef ST25DV_IO_MemWrite( const uint8_t * const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size, I2C* mi2cChannel )
+{
+
+  uint8_t ret = 4;
+  
+  uint8_t Addr = DevAddr;
+
+
+  uint8_t buffer[2];
+  buffer[0] = (uint8_t) (TarAddr>>8);
+  buffer[1] = (uint8_t) (TarAddr&0xFF);
+
+
+   char * pDataChar = (char*) pData;
+
+
+  ret = mi2cChannel -> write(Addr, (const char*)buffer, 2 , true);
+
+  // Address is not OK
+  	if(ret != 0)
+		return NFCTAG_ConvertStatus(ret);
+
+	ret = mi2cChannel -> write(Addr, pDataChar, Size, false);
+
+  return NFCTAG_ConvertStatus(ret);
+}
+
+
+/*
+  * @brief  Reads data at a specific address from the NFCTAG.
+  * @param  pData: pointer to store read data
+  * @param  DevAddr : Target device address
+  * @param  TarAddr : i2c data memory address to read
+  * @param  Size : Size in bytes of the value to be read
+  * @param mi2cChannel : I2C channel
+  * @retval NFCTAG enum status
+  */
+
+NFCTAG_StatusTypeDef ST25DV_IO_MemRead( uint8_t * const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size, I2C* mi2cChannel )
+{
+
+	uint8_t ret = 4;
+	uint8_t Addr = DevAddr;
+
+    uint8_t buffer[2];
+    buffer[0] = (uint8_t) (TarAddr>>8);
+    buffer[1] = (uint8_t) (TarAddr&0xFF);
+
+    ret = mi2cChannel -> write(Addr, (const char*)buffer , 2 , false);
+
+    // Address is not OK
+  	if(ret != 0)
+  		return NFCTAG_ConvertStatus(ret);
+
+	char * pDataChar = (char*) pData;
+
+	ret = mi2cChannel -> read(DevAddr, pDataChar, Size, false );
+
+	return NFCTAG_ConvertStatus(ret);
+}
+
+NFCTAG_StatusTypeDef NFCTAG_ConvertStatus(uint8_t ret) {
+	if (ret == 0) {
+		return NFCTAG_OK;
+	} else if ((ret == 2) || (ret == 3)) {
+		return NFCTAG_NACK;
+	} else {
+		return NFCTAG_ERROR;
+	}
+}
+
+
+/**
+  * @brief  Reads data at current address from the NFCTAG.
+  * @param  pData: pointer to store read data
+  * @param  DevAddr : Target device address
+  * @param  Size : Size in bytes of the value to be read
+  * @retval NFCTAG enum status
+  */
+NFCTAG_StatusTypeDef ST25DV_IO_Read( uint8_t * const pData, const uint8_t DevAddr, const uint16_t Size, I2C* mi2cChannel )
+{
+	//this has to change( send  addr then read)
+	int i = 0;
+	uint8_t ret = 4;
+
+	char * pDataChar = (char*) pData;
+	uint8_t ReadAddr = DevAddr | 1u;
+	ret = mi2cChannel -> read(ReadAddr, pDataChar, 1, false );
+
+
+// Tell slave we need to read 1byte from the current register
+	while(mi2cChannel -> read( 0 ) != 0) {
+		pData[i++] = mi2cChannel -> read( 0 );
+
+	}
+
+
+  return NFCTAG_ConvertStatus( ret);
+}
+
+
+/**
+* @brief  Checks if target device is ready for communication
+* @note   This function is used with Memory devices
+* @param  DevAddr : Target device address
+* @param  mi2cChannel : I2C channel
+* @retval NFCTAG enum status
+*/
+NFCTAG_StatusTypeDef ST25DV_IO_IsDeviceReady( const uint8_t DevAddr, const uint32_t Trials, I2C* mi2cChannel)
+{ 
+  int ret = 4;
+  uint32_t count = 0;
+
+  uint8_t Addr = DevAddr;
+
+
+  while ((count++ < Trials && ret) ) {
+	  ret = mi2cChannel -> write(Addr, NULL, 0 , false);
+  }
+  return NFCTAG_ConvertStatus(ret);
+}
+
+
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/