Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
pn512_registers.c
00001 00002 /* 00003 * Copyright (c) 2013-2018, ARM Limited, All Rights Reserved 00004 * SPDX-License-Identifier: Apache-2.0 00005 * 00006 * Licensed under the Apache License, Version 2.0 (the "License"); you may 00007 * not use this file except in compliance with the License. 00008 * You may obtain a copy of the License at 00009 * 00010 * http://www.apache.org/licenses/LICENSE-2.0 00011 * 00012 * Unless required by applicable law or agreed to in writing, software 00013 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 00014 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00015 * See the License for the specific language governing permissions and 00016 * limitations under the License. 00017 */ 00018 /** 00019 * \file pn512_registers.c 00020 * \copyright Copyright (c) ARM Ltd 2013 00021 * \author Donatien Garnier 00022 * \details Access to PN512 registers 00023 */ 00024 00025 00026 #define __DEBUG__ 0 00027 #ifndef __MODULE__ 00028 #define __MODULE__ "pn512_registers.c" 00029 #endif 00030 #include "stack/nfc_errors.h" 00031 00032 #include "pn512_registers.h" 00033 #include "pn512_hw.h" 00034 #include "pn512.h" 00035 00036 #define REGISTER_PAGE(x) ((x)>>4) 00037 #define REGISTER_ADDR(x) ((x)&0xF) 00038 00039 /** \addtogroup PN512 00040 * \internal 00041 * @{ 00042 * \name Registers 00043 * @{ 00044 */ 00045 00046 static void pn512_register_switch_page_intl(pn512_t *pPN512, uint8_t page); 00047 00048 /** \internal Initialize underlying pn512_registers_t structure 00049 * \param pPN512 pointer to pn512_t structure 00050 */ 00051 void pn512_registers_init(pn512_t *pPN512) 00052 { 00053 pPN512->registers.registers_page = 0; 00054 } 00055 00056 #define PN512_CFG_INIT_LEN 9 00057 static const uint8_t PN512_CFG_INIT_REGS[] = { 00058 PN512_REG_DIVIEN, 00059 PN512_REG_MODE, 00060 PN512_REG_GSNOFF, 00061 PN512_REG_RFCFG, 00062 PN512_REG_CWGSP, 00063 PN512_REG_MIFNFC, 00064 PN512_REG_FELNFC2, 00065 PN512_REG_RXSEL, 00066 PN512_REG_TYPEB 00067 }; 00068 static const uint8_t PN512_CFG_INIT_VALS[] = { 00069 0x80, 00070 0x3F, 00071 0xF2, 00072 0x68, 00073 0x3F, 00074 0x62, 00075 0x80, 00076 0x84, 00077 0x00 00078 }; //Timer: For now max prescaler, max reload value 00079 00080 /** \internal Switch to known (0) registers page, reset registers state 00081 * \param pPN512 pointer to pn512_t structure 00082 */ 00083 void pn512_registers_reset(pn512_t *pPN512) 00084 { 00085 pn512_register_switch_page_intl(pPN512, 0); 00086 for (int i = 0; i < PN512_CFG_INIT_LEN; i++) { 00087 pn512_register_write(pPN512, PN512_CFG_INIT_REGS[i], PN512_CFG_INIT_VALS[i]); 00088 } 00089 } 00090 00091 /** \internal Write register 00092 * \param pPN512 pointer to pn512_t structure 00093 * \param address register address 00094 * \param data value to write in register 00095 */ 00096 void pn512_register_write(pn512_t *pPN512, uint8_t address, uint8_t data) 00097 { 00098 NFC_DBG("Write [%02x] << %02x", address, data); 00099 if (REGISTER_PAGE(address) != pPN512->registers.registers_page) { 00100 pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address)); 00101 } 00102 address = REGISTER_ADDR(address); 00103 pn512_hw_write(pPN512, address, &data, 1); 00104 } 00105 00106 /** \internal Read register 00107 * \param pPN512 pointer to pn512_t structure 00108 * \param address register address 00109 * \return data value read from register 00110 */ 00111 uint8_t pn512_register_read(pn512_t *pPN512, uint8_t address) 00112 { 00113 uint8_t data; 00114 NFC_DBG_BLOCK( 00115 uint8_t __dbg_addr; 00116 __dbg_addr = address; //FIXME 00117 ) 00118 if (REGISTER_PAGE(address) != pPN512->registers.registers_page) { 00119 pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address)); 00120 } 00121 address = REGISTER_ADDR(address); 00122 pn512_hw_read(pPN512, address, &data, 1); 00123 NFC_DBG("Read [%02x] >> %02x", __dbg_addr, data); 00124 return data; 00125 } 00126 00127 void pn512_register_switch_page(pn512_t *pPN512, uint8_t address) 00128 { 00129 if (REGISTER_PAGE(address) != pPN512->registers.registers_page) { 00130 pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address)); 00131 } 00132 } 00133 00134 /** \internal Switch registers page 00135 * \param pPN512 pointer to pn512_t structure 00136 * \param page registers page 00137 */ 00138 void pn512_register_switch_page_intl(pn512_t *pPN512, uint8_t page) 00139 { 00140 uint8_t pageRegValue; 00141 pageRegValue = (1 << 7) | page; 00142 00143 pn512_hw_write(pPN512, PN512_REG_PAGE, &pageRegValue, 1); 00144 00145 pPN512->registers.registers_page = page; 00146 } 00147 00148 00149 00150 /** 00151 * @} 00152 * @} 00153 * */
Generated on Tue Jul 12 2022 13:54:41 by
