Josse Brys / Mbed 2 deprecated SPI_Demo_Nano

Dependencies:   mbed

Committer:
jossebrys
Date:
Tue Jul 28 17:20:58 2015 +0000
Revision:
0:b720fba8540a
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jossebrys 0:b720fba8540a 1 /*
jossebrys 0:b720fba8540a 2
jossebrys 0:b720fba8540a 3 Copyright (c) 2012-2014 RedBearLab
jossebrys 0:b720fba8540a 4
jossebrys 0:b720fba8540a 5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
jossebrys 0:b720fba8540a 6 and associated documentation files (the "Software"), to deal in the Software without restriction,
jossebrys 0:b720fba8540a 7 including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
jossebrys 0:b720fba8540a 8 and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
jossebrys 0:b720fba8540a 9 subject to the following conditions:
jossebrys 0:b720fba8540a 10 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
jossebrys 0:b720fba8540a 11
jossebrys 0:b720fba8540a 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
jossebrys 0:b720fba8540a 13 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
jossebrys 0:b720fba8540a 14 PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
jossebrys 0:b720fba8540a 15 FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
jossebrys 0:b720fba8540a 16 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
jossebrys 0:b720fba8540a 17
jossebrys 0:b720fba8540a 18 */
jossebrys 0:b720fba8540a 19
jossebrys 0:b720fba8540a 20 #include "spi_master.h"
jossebrys 0:b720fba8540a 21
jossebrys 0:b720fba8540a 22 /**********************************************************************
jossebrys 0:b720fba8540a 23 name :
jossebrys 0:b720fba8540a 24 function :
jossebrys 0:b720fba8540a 25 **********************************************************************/
jossebrys 0:b720fba8540a 26 SPIClass::SPIClass(NRF_SPI_Type *_spi) : spi(_spi)
jossebrys 0:b720fba8540a 27 {
jossebrys 0:b720fba8540a 28 //do nothing
jossebrys 0:b720fba8540a 29 }
jossebrys 0:b720fba8540a 30
jossebrys 0:b720fba8540a 31 /**********************************************************************
jossebrys 0:b720fba8540a 32 name :
jossebrys 0:b720fba8540a 33 function :
jossebrys 0:b720fba8540a 34 **********************************************************************/
jossebrys 0:b720fba8540a 35 void SPIClass::setCPOL( bool active_low)
jossebrys 0:b720fba8540a 36 {
jossebrys 0:b720fba8540a 37 if(active_low)
jossebrys 0:b720fba8540a 38 {
jossebrys 0:b720fba8540a 39 spi->CONFIG |= (SPI_CONFIG_CPOL_ActiveLow << SPI_CONFIG_CPOL_Pos);
jossebrys 0:b720fba8540a 40 }
jossebrys 0:b720fba8540a 41 else
jossebrys 0:b720fba8540a 42 {
jossebrys 0:b720fba8540a 43 spi->CONFIG |= (SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos);
jossebrys 0:b720fba8540a 44 }
jossebrys 0:b720fba8540a 45 }
jossebrys 0:b720fba8540a 46
jossebrys 0:b720fba8540a 47 /**********************************************************************
jossebrys 0:b720fba8540a 48 name :
jossebrys 0:b720fba8540a 49 function :
jossebrys 0:b720fba8540a 50 **********************************************************************/
jossebrys 0:b720fba8540a 51 void SPIClass::setCPHA( bool trailing)
jossebrys 0:b720fba8540a 52 {
jossebrys 0:b720fba8540a 53 if(trailing)
jossebrys 0:b720fba8540a 54 {
jossebrys 0:b720fba8540a 55 spi->CONFIG |= (SPI_CONFIG_CPHA_Trailing << SPI_CONFIG_CPHA_Pos);
jossebrys 0:b720fba8540a 56 }
jossebrys 0:b720fba8540a 57 else
jossebrys 0:b720fba8540a 58 {
jossebrys 0:b720fba8540a 59 spi->CONFIG |= (SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos);
jossebrys 0:b720fba8540a 60 }
jossebrys 0:b720fba8540a 61
jossebrys 0:b720fba8540a 62 }
jossebrys 0:b720fba8540a 63
jossebrys 0:b720fba8540a 64 /**********************************************************************
jossebrys 0:b720fba8540a 65 name :
jossebrys 0:b720fba8540a 66 function : MSBFIRST, LSBFIRST
jossebrys 0:b720fba8540a 67 **********************************************************************/
jossebrys 0:b720fba8540a 68 void SPIClass::setBitORDER( BitOrder bit)
jossebrys 0:b720fba8540a 69 {
jossebrys 0:b720fba8540a 70 if(bit == MSBFIRST)
jossebrys 0:b720fba8540a 71 {
jossebrys 0:b720fba8540a 72 spi->CONFIG |= (SPI_CONFIG_ORDER_MsbFirst << SPI_CONFIG_ORDER_Pos);
jossebrys 0:b720fba8540a 73 }
jossebrys 0:b720fba8540a 74 else
jossebrys 0:b720fba8540a 75 {
jossebrys 0:b720fba8540a 76 spi->CONFIG |= (SPI_CONFIG_ORDER_LsbFirst << SPI_CONFIG_ORDER_Pos);
jossebrys 0:b720fba8540a 77 }
jossebrys 0:b720fba8540a 78 }
jossebrys 0:b720fba8540a 79
jossebrys 0:b720fba8540a 80 /**********************************************************************
jossebrys 0:b720fba8540a 81 name :
jossebrys 0:b720fba8540a 82 function :
jossebrys 0:b720fba8540a 83 **********************************************************************/
jossebrys 0:b720fba8540a 84 void SPIClass::setFrequency(uint8_t speed)
jossebrys 0:b720fba8540a 85 {
jossebrys 0:b720fba8540a 86 if (speed == 0)
jossebrys 0:b720fba8540a 87 {
jossebrys 0:b720fba8540a 88 spi->FREQUENCY = SPI_FREQUENCY_125K;
jossebrys 0:b720fba8540a 89 }
jossebrys 0:b720fba8540a 90 else if (speed == 1)
jossebrys 0:b720fba8540a 91 {
jossebrys 0:b720fba8540a 92 spi->FREQUENCY = SPI_FREQUENCY_250K;
jossebrys 0:b720fba8540a 93 }
jossebrys 0:b720fba8540a 94 else if (speed == 2)
jossebrys 0:b720fba8540a 95 {
jossebrys 0:b720fba8540a 96 spi->FREQUENCY = SPI_FREQUENCY_500K;
jossebrys 0:b720fba8540a 97 }
jossebrys 0:b720fba8540a 98 else if (speed == 3)
jossebrys 0:b720fba8540a 99 {
jossebrys 0:b720fba8540a 100 spi->FREQUENCY = SPI_FREQUENCY_1M;
jossebrys 0:b720fba8540a 101 }
jossebrys 0:b720fba8540a 102 else if (speed == 4)
jossebrys 0:b720fba8540a 103 {
jossebrys 0:b720fba8540a 104 spi->FREQUENCY = SPI_FREQUENCY_2M;
jossebrys 0:b720fba8540a 105 }
jossebrys 0:b720fba8540a 106 else if (speed == 5)
jossebrys 0:b720fba8540a 107 {
jossebrys 0:b720fba8540a 108 spi->FREQUENCY = SPI_FREQUENCY_4M;
jossebrys 0:b720fba8540a 109 }
jossebrys 0:b720fba8540a 110 else if (speed == 6)
jossebrys 0:b720fba8540a 111 {
jossebrys 0:b720fba8540a 112 spi->FREQUENCY = SPI_FREQUENCY_8M;
jossebrys 0:b720fba8540a 113 }
jossebrys 0:b720fba8540a 114 else
jossebrys 0:b720fba8540a 115 {
jossebrys 0:b720fba8540a 116 spi->FREQUENCY = SPI_FREQUENCY_4M;
jossebrys 0:b720fba8540a 117 }
jossebrys 0:b720fba8540a 118 }
jossebrys 0:b720fba8540a 119
jossebrys 0:b720fba8540a 120 /**********************************************************************
jossebrys 0:b720fba8540a 121 name :
jossebrys 0:b720fba8540a 122 function :
jossebrys 0:b720fba8540a 123 **********************************************************************/
jossebrys 0:b720fba8540a 124 void SPIClass::setSPIMode( uint8_t mode )
jossebrys 0:b720fba8540a 125 {
jossebrys 0:b720fba8540a 126 if (SPI_MODE0 == mode)
jossebrys 0:b720fba8540a 127 {
jossebrys 0:b720fba8540a 128 setCPOL(0);
jossebrys 0:b720fba8540a 129 setCPHA(0);
jossebrys 0:b720fba8540a 130 }
jossebrys 0:b720fba8540a 131 else if (mode == SPI_MODE1)
jossebrys 0:b720fba8540a 132 {
jossebrys 0:b720fba8540a 133 setCPOL(0);
jossebrys 0:b720fba8540a 134 setCPHA(1);
jossebrys 0:b720fba8540a 135 }
jossebrys 0:b720fba8540a 136 else if (mode == SPI_MODE2)
jossebrys 0:b720fba8540a 137 {
jossebrys 0:b720fba8540a 138 setCPOL(1);
jossebrys 0:b720fba8540a 139 setCPHA(0);
jossebrys 0:b720fba8540a 140 }
jossebrys 0:b720fba8540a 141 else if (mode == SPI_MODE3)
jossebrys 0:b720fba8540a 142 {
jossebrys 0:b720fba8540a 143 setCPOL(1);
jossebrys 0:b720fba8540a 144 setCPHA(1);
jossebrys 0:b720fba8540a 145 }
jossebrys 0:b720fba8540a 146 else
jossebrys 0:b720fba8540a 147 {
jossebrys 0:b720fba8540a 148 setCPOL(0);
jossebrys 0:b720fba8540a 149 setCPHA(0);
jossebrys 0:b720fba8540a 150 }
jossebrys 0:b720fba8540a 151 }
jossebrys 0:b720fba8540a 152
jossebrys 0:b720fba8540a 153 /**********************************************************************
jossebrys 0:b720fba8540a 154 name :
jossebrys 0:b720fba8540a 155 function :
jossebrys 0:b720fba8540a 156 **********************************************************************/
jossebrys 0:b720fba8540a 157 void SPIClass::begin(uint32_t sck, uint32_t mosi, uint32_t miso)
jossebrys 0:b720fba8540a 158 {
jossebrys 0:b720fba8540a 159
jossebrys 0:b720fba8540a 160 SCK_Pin = sck;
jossebrys 0:b720fba8540a 161 MOSI_Pin = mosi;
jossebrys 0:b720fba8540a 162 MISO_Pin = miso;
jossebrys 0:b720fba8540a 163
jossebrys 0:b720fba8540a 164 NRF_GPIO->PIN_CNF[SCK_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
jossebrys 0:b720fba8540a 165 | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
jossebrys 0:b720fba8540a 166 | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
jossebrys 0:b720fba8540a 167 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
jossebrys 0:b720fba8540a 168 | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
jossebrys 0:b720fba8540a 169
jossebrys 0:b720fba8540a 170 NRF_GPIO->PIN_CNF[MOSI_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
jossebrys 0:b720fba8540a 171 | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
jossebrys 0:b720fba8540a 172 | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
jossebrys 0:b720fba8540a 173 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
jossebrys 0:b720fba8540a 174 | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
jossebrys 0:b720fba8540a 175
jossebrys 0:b720fba8540a 176 NRF_GPIO->PIN_CNF[MISO_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
jossebrys 0:b720fba8540a 177 | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
jossebrys 0:b720fba8540a 178 | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
jossebrys 0:b720fba8540a 179 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
jossebrys 0:b720fba8540a 180 | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
jossebrys 0:b720fba8540a 181 spi->PSELSCK = SCK_Pin;
jossebrys 0:b720fba8540a 182 spi->PSELMOSI = MOSI_Pin;
jossebrys 0:b720fba8540a 183 spi->PSELMISO = MISO_Pin;
jossebrys 0:b720fba8540a 184
jossebrys 0:b720fba8540a 185 setFrequency(SPI_2M);
jossebrys 0:b720fba8540a 186 setSPIMode(SPI_MODE0);
jossebrys 0:b720fba8540a 187 setBitORDER(MSBFIRST);
jossebrys 0:b720fba8540a 188
jossebrys 0:b720fba8540a 189 spi->EVENTS_READY = 0;
jossebrys 0:b720fba8540a 190 spi->ENABLE = (SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos);
jossebrys 0:b720fba8540a 191
jossebrys 0:b720fba8540a 192 }
jossebrys 0:b720fba8540a 193
jossebrys 0:b720fba8540a 194 /**********************************************************************
jossebrys 0:b720fba8540a 195 name :
jossebrys 0:b720fba8540a 196 function :
jossebrys 0:b720fba8540a 197 **********************************************************************/
jossebrys 0:b720fba8540a 198 void SPIClass::begin()
jossebrys 0:b720fba8540a 199 {
jossebrys 0:b720fba8540a 200 begin(SCK, MOSI, MISO);
jossebrys 0:b720fba8540a 201 }
jossebrys 0:b720fba8540a 202
jossebrys 0:b720fba8540a 203 /**********************************************************************
jossebrys 0:b720fba8540a 204 name :
jossebrys 0:b720fba8540a 205 function :
jossebrys 0:b720fba8540a 206 **********************************************************************/
jossebrys 0:b720fba8540a 207 uint8_t SPIClass::transfer(uint8_t data)
jossebrys 0:b720fba8540a 208 {
jossebrys 0:b720fba8540a 209 while( spi->EVENTS_READY != 0U );
jossebrys 0:b720fba8540a 210
jossebrys 0:b720fba8540a 211 spi->TXD = (uint32_t)data;
jossebrys 0:b720fba8540a 212
jossebrys 0:b720fba8540a 213 while(spi->EVENTS_READY == 0);
jossebrys 0:b720fba8540a 214
jossebrys 0:b720fba8540a 215 data = (uint8_t)spi->RXD;
jossebrys 0:b720fba8540a 216
jossebrys 0:b720fba8540a 217 spi->EVENTS_READY = 0;
jossebrys 0:b720fba8540a 218
jossebrys 0:b720fba8540a 219 return data;
jossebrys 0:b720fba8540a 220 }
jossebrys 0:b720fba8540a 221
jossebrys 0:b720fba8540a 222 /**********************************************************************
jossebrys 0:b720fba8540a 223 name :
jossebrys 0:b720fba8540a 224 function :
jossebrys 0:b720fba8540a 225 **********************************************************************/
jossebrys 0:b720fba8540a 226 void SPIClass::endTransfer()
jossebrys 0:b720fba8540a 227 {
jossebrys 0:b720fba8540a 228 spi->ENABLE = (SPI_ENABLE_ENABLE_Disabled << SPI_ENABLE_ENABLE_Pos);
jossebrys 0:b720fba8540a 229 }
jossebrys 0:b720fba8540a 230
jossebrys 0:b720fba8540a 231 /**********************************************************************
jossebrys 0:b720fba8540a 232 name :
jossebrys 0:b720fba8540a 233 function :
jossebrys 0:b720fba8540a 234 **********************************************************************/
jossebrys 0:b720fba8540a 235
jossebrys 0:b720fba8540a 236 //SPIClass SPI(NRF_SPI1);