project_sensor

Dependencies:   project mbed nRF51822

Committer:
didierlauwerys
Date:
Sun May 28 16:26:53 2017 +0000
Revision:
0:75d0e1bb5990
spi_ctrl

Who changed what in which revision?

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