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@0:db8030e71f55, 2016-09-13 (annotated)
- Committer:
- dotnfc
- Date:
- Tue Sep 13 06:01:19 2016 +0000
- Revision:
- 0:db8030e71f55
first commit
Who changed what in which revision?
User | Revision | Line number | New 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 |