Bluetooth enabled control of a BLDC via the Allegro MicroSystems A4960.

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_LED by Bluetooth Low Energy

Committer:
anniemao
Date:
Tue May 16 19:31:49 2017 +0000
Revision:
11:4251b62991ac
Annie Mao 2017

Who changed what in which revision?

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