PN532 Driver library This library provides an abstract API to drive the pn532 nfc chip, with I2C/HSU/SPI interface. Its based on the Seeed Studio's Arduino version.

Dependents:   PN532_ReadUid Nfctest2

Committer:
dotnfc
Date:
Tue Sep 13 06:01:19 2016 +0000
Revision:
0:db8030e71f55
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dotnfc 0:db8030e71f55 1 /*
dotnfc 0:db8030e71f55 2 * Copyright (c) 2010 by Cristian Maglie <c.maglie@bug.st>
dotnfc 0:db8030e71f55 3 * SPI Master library for arduino.
dotnfc 0:db8030e71f55 4 *
dotnfc 0:db8030e71f55 5 * This file is free software; you can redistribute it and/or modify
dotnfc 0:db8030e71f55 6 * it under the terms of either the GNU General Public License version 2
dotnfc 0:db8030e71f55 7 * or the GNU Lesser General Public License version 2.1, both as
dotnfc 0:db8030e71f55 8 * published by the Free Software Foundation.
dotnfc 0:db8030e71f55 9 */
dotnfc 0:db8030e71f55 10
dotnfc 0:db8030e71f55 11 #include "arduino.h"
dotnfc 0:db8030e71f55 12 #include "SPIClass.h"
dotnfc 0:db8030e71f55 13
dotnfc 0:db8030e71f55 14 SPIClass SPI;
dotnfc 0:db8030e71f55 15
dotnfc 0:db8030e71f55 16 void SPIClass::begin() {
dotnfc 0:db8030e71f55 17
dotnfc 0:db8030e71f55 18 // When the SS pin is set as OUTPUT, it can be used as
dotnfc 0:db8030e71f55 19 // a general purpose output port (it doesn't influence
dotnfc 0:db8030e71f55 20 // SPI operations).
dotnfc 0:db8030e71f55 21 pinMode(SS, OUTPUT);
dotnfc 0:db8030e71f55 22
dotnfc 0:db8030e71f55 23 // Set SS to high so a connected chip will be "deselected" by default
dotnfc 0:db8030e71f55 24 digitalWrite(SS, HIGH);
dotnfc 0:db8030e71f55 25
dotnfc 0:db8030e71f55 26 pinMode(SCK, ALTERNATE);
dotnfc 0:db8030e71f55 27 pinMode(MOSI, ALTERNATE);
dotnfc 0:db8030e71f55 28 pinMode(MISO, ALTERNATE);
dotnfc 0:db8030e71f55 29
dotnfc 0:db8030e71f55 30 spi = SPI1;
dotnfc 0:db8030e71f55 31 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
dotnfc 0:db8030e71f55 32
dotnfc 0:db8030e71f55 33 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
dotnfc 0:db8030e71f55 34 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
dotnfc 0:db8030e71f55 35 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
dotnfc 0:db8030e71f55 36 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_CLOCK_DIV4;
dotnfc 0:db8030e71f55 37 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
dotnfc 0:db8030e71f55 38 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
dotnfc 0:db8030e71f55 39 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
dotnfc 0:db8030e71f55 40 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
dotnfc 0:db8030e71f55 41 SPI_InitStructure.SPI_CRCPolynomial = 7;
dotnfc 0:db8030e71f55 42
dotnfc 0:db8030e71f55 43 SPI_Init(spi,&SPI_InitStructure);
dotnfc 0:db8030e71f55 44 SPI_RxFIFOThresholdConfig(spi,SPI_RxFIFOThreshold_QF);
dotnfc 0:db8030e71f55 45 SPI_Cmd(spi,ENABLE);
dotnfc 0:db8030e71f55 46 }
dotnfc 0:db8030e71f55 47
dotnfc 0:db8030e71f55 48
dotnfc 0:db8030e71f55 49 void SPIClass::end() {
dotnfc 0:db8030e71f55 50 SPI_Cmd(spi,DISABLE);
dotnfc 0:db8030e71f55 51 }
dotnfc 0:db8030e71f55 52
dotnfc 0:db8030e71f55 53 void SPIClass::setBitOrder(uint8_t bitOrder)
dotnfc 0:db8030e71f55 54 {
dotnfc 0:db8030e71f55 55 SPI_Cmd(spi,DISABLE);
dotnfc 0:db8030e71f55 56 if(bitOrder == LSBFIRST)
dotnfc 0:db8030e71f55 57 {
dotnfc 0:db8030e71f55 58 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
dotnfc 0:db8030e71f55 59 }
dotnfc 0:db8030e71f55 60 else
dotnfc 0:db8030e71f55 61 {
dotnfc 0:db8030e71f55 62 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
dotnfc 0:db8030e71f55 63 }
dotnfc 0:db8030e71f55 64 SPI_Init(spi,&SPI_InitStructure);
dotnfc 0:db8030e71f55 65 SPI_Cmd(spi,ENABLE);
dotnfc 0:db8030e71f55 66 }
dotnfc 0:db8030e71f55 67
dotnfc 0:db8030e71f55 68 void SPIClass::setDataMode(uint8_t mode)
dotnfc 0:db8030e71f55 69 {
dotnfc 0:db8030e71f55 70 SPI_Cmd(spi,DISABLE);
dotnfc 0:db8030e71f55 71 if (mode == SPI_MODE0)
dotnfc 0:db8030e71f55 72 {
dotnfc 0:db8030e71f55 73 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
dotnfc 0:db8030e71f55 74 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
dotnfc 0:db8030e71f55 75 }
dotnfc 0:db8030e71f55 76 else if(mode == SPI_MODE1)
dotnfc 0:db8030e71f55 77 {
dotnfc 0:db8030e71f55 78 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
dotnfc 0:db8030e71f55 79 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
dotnfc 0:db8030e71f55 80 }
dotnfc 0:db8030e71f55 81 else if(mode == SPI_MODE2)
dotnfc 0:db8030e71f55 82 {
dotnfc 0:db8030e71f55 83 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
dotnfc 0:db8030e71f55 84 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
dotnfc 0:db8030e71f55 85 }
dotnfc 0:db8030e71f55 86 else if(mode == SPI_MODE3)
dotnfc 0:db8030e71f55 87 {
dotnfc 0:db8030e71f55 88 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
dotnfc 0:db8030e71f55 89 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
dotnfc 0:db8030e71f55 90 }
dotnfc 0:db8030e71f55 91
dotnfc 0:db8030e71f55 92 SPI_Init(spi,&SPI_InitStructure);
dotnfc 0:db8030e71f55 93 SPI_Cmd(spi,ENABLE);
dotnfc 0:db8030e71f55 94 }
dotnfc 0:db8030e71f55 95
dotnfc 0:db8030e71f55 96 void SPIClass::setClockDivider(uint8_t rate)
dotnfc 0:db8030e71f55 97 {
dotnfc 0:db8030e71f55 98 SPI_Cmd(spi,DISABLE);
dotnfc 0:db8030e71f55 99 SPI_InitStructure.SPI_BaudRatePrescaler = rate;
dotnfc 0:db8030e71f55 100
dotnfc 0:db8030e71f55 101 SPI_Init(spi,&SPI_InitStructure);
dotnfc 0:db8030e71f55 102 SPI_Cmd(spi,ENABLE);
dotnfc 0:db8030e71f55 103 }
dotnfc 0:db8030e71f55 104
dotnfc 0:db8030e71f55 105 byte SPIClass::transfer(byte _data) {
dotnfc 0:db8030e71f55 106 uint8_t d = _data;
dotnfc 0:db8030e71f55 107
dotnfc 0:db8030e71f55 108 while (SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_TXE) == RESET);
dotnfc 0:db8030e71f55 109 SPI_SendData8(spi,d);
dotnfc 0:db8030e71f55 110
dotnfc 0:db8030e71f55 111 while (SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_RXNE) == RESET);
dotnfc 0:db8030e71f55 112 d = SPI_ReceiveData8(spi);
dotnfc 0:db8030e71f55 113 return d ;
dotnfc 0:db8030e71f55 114 }
dotnfc 0:db8030e71f55 115
dotnfc 0:db8030e71f55 116 void SPIClass::attachInterrupt(void) {
dotnfc 0:db8030e71f55 117 // Should be enableInterrupt()
dotnfc 0:db8030e71f55 118 }
dotnfc 0:db8030e71f55 119
dotnfc 0:db8030e71f55 120 void SPIClass::detachInterrupt(void) {
dotnfc 0:db8030e71f55 121 // Should be disableInterrupt()
dotnfc 0:db8030e71f55 122 }
dotnfc 0:db8030e71f55 123
dotnfc 0:db8030e71f55 124