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
SPIClass.cpp
- Committer:
- dotnfc
- Date:
- 2016-09-13
- Revision:
- 0:db8030e71f55
File content as of revision 0:db8030e71f55:
/* * Copyright (c) 2010 by Cristian Maglie <c.maglie@bug.st> * SPI Master library for arduino. * * This file is free software; you can redistribute it and/or modify * it under the terms of either the GNU General Public License version 2 * or the GNU Lesser General Public License version 2.1, both as * published by the Free Software Foundation. */ #include "arduino.h" #include "SPIClass.h" SPIClass SPI; void SPIClass::begin() { // When the SS pin is set as OUTPUT, it can be used as // a general purpose output port (it doesn't influence // SPI operations). pinMode(SS, OUTPUT); // Set SS to high so a connected chip will be "deselected" by default digitalWrite(SS, HIGH); pinMode(SCK, ALTERNATE); pinMode(MOSI, ALTERNATE); pinMode(MISO, ALTERNATE); spi = SPI1; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_CLOCK_DIV4; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(spi,&SPI_InitStructure); SPI_RxFIFOThresholdConfig(spi,SPI_RxFIFOThreshold_QF); SPI_Cmd(spi,ENABLE); } void SPIClass::end() { SPI_Cmd(spi,DISABLE); } void SPIClass::setBitOrder(uint8_t bitOrder) { SPI_Cmd(spi,DISABLE); if(bitOrder == LSBFIRST) { SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB; } else { SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; } SPI_Init(spi,&SPI_InitStructure); SPI_Cmd(spi,ENABLE); } void SPIClass::setDataMode(uint8_t mode) { SPI_Cmd(spi,DISABLE); if (mode == SPI_MODE0) { SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; } else if(mode == SPI_MODE1) { SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; } else if(mode == SPI_MODE2) { SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; } else if(mode == SPI_MODE3) { SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; } SPI_Init(spi,&SPI_InitStructure); SPI_Cmd(spi,ENABLE); } void SPIClass::setClockDivider(uint8_t rate) { SPI_Cmd(spi,DISABLE); SPI_InitStructure.SPI_BaudRatePrescaler = rate; SPI_Init(spi,&SPI_InitStructure); SPI_Cmd(spi,ENABLE); } byte SPIClass::transfer(byte _data) { uint8_t d = _data; while (SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_TXE) == RESET); SPI_SendData8(spi,d); while (SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_RXNE) == RESET); d = SPI_ReceiveData8(spi); return d ; } void SPIClass::attachInterrupt(void) { // Should be enableInterrupt() } void SPIClass::detachInterrupt(void) { // Should be disableInterrupt() }