- Timestamp:
- Apr 30, 2016, 11:29:25 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
rtos_arduino/trunk/arduino_lib/hardware/arduino/samd/libraries/SPI/SPI.cpp
r136 r224 13 13 #include "assert.h" 14 14 #include "variant.h" 15 #include <Arduino.h> 15 16 16 17 SPIClass::SPIClass(SERCOM *p_sercom, uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI) … … 38 39 } 39 40 41 42 void SPIClass::beginSlave() 43 { 44 // PIO init 45 pinPeripheral(_uc_pinMiso, g_APinDescription[_uc_pinMiso].ulPinType); 46 pinPeripheral(_uc_pinSCK, g_APinDescription[_uc_pinSCK].ulPinType); 47 pinPeripheral(_uc_pinMosi, g_APinDescription[_uc_pinMosi].ulPinType); 48 49 // Default speed set to 4Mhz, SPI mode set to MODE 0 and Bit order set to MSB first. 50 _p_sercom->initSPIslave(SPI_PAD_2_SCK_3, SERCOM_RX_PAD_0, SPI_CHAR_SIZE_8_BITS, MSB_FIRST); 51 52 _p_sercom->enableSPI(); 53 } 54 40 55 void SPIClass::end() 41 56 { 42 57 _p_sercom->resetSPI(); 43 58 } 59 60 61 void SPIClass::beginTransaction(SPISettings settings) 62 { 63 SercomDataOrder bitOrder; 64 SercomSpiClockMode SpiClockMode; 65 66 interruptSave = intStatus(); 67 noInterrupts(); 68 69 70 if(settings.bit_order==LSBFIRST) bitOrder = LSB_FIRST; 71 else if(settings.bit_order==MSBFIRST) bitOrder = MSB_FIRST; 72 else; 73 74 if(settings.data_mode==SPI_MODE0) SpiClockMode = SERCOM_SPI_MODE_0; 75 else if(settings.data_mode==SPI_MODE1) SpiClockMode = SERCOM_SPI_MODE_1; 76 else if(settings.data_mode==SPI_MODE2) SpiClockMode = SERCOM_SPI_MODE_2; 77 else if(settings.data_mode==SPI_MODE3) SpiClockMode = SERCOM_SPI_MODE_3; 78 else; 79 80 end(); 81 82 pinPeripheral(_uc_pinMiso, g_APinDescription[_uc_pinMiso].ulPinType); 83 pinPeripheral(_uc_pinSCK, g_APinDescription[_uc_pinSCK].ulPinType); 84 pinPeripheral(_uc_pinMosi, g_APinDescription[_uc_pinMosi].ulPinType); 85 86 _p_sercom->initSPI(SPI_PAD_2_SCK_3, SERCOM_RX_PAD_0, SPI_CHAR_SIZE_8_BITS, bitOrder); 87 _p_sercom->initSPIClock(SpiClockMode, settings.interface_clock); 88 89 _p_sercom->enableSPI(); 90 inTransactionFlag=1; 91 } 92 93 void SPIClass::endTransaction(void) 94 { 95 inTransactionFlag=0; 96 interrupts(); 97 } 44 98 45 99 void SPIClass::setBitOrder(BitOrder order) … … 76 130 } 77 131 78 void SPIClass::setClockDivider(uint 8_t div)132 void SPIClass::setClockDivider(uint16_t div) 79 133 { 80 134 _p_sercom->setBaudrateSPI(div); … … 90 144 } 91 145 146 byte SPIClass::read() 147 { 148 return _p_sercom->readDataSPI(); 149 } 150 151 void SPIClass::usingInterrupt(uint8_t intNum) 152 { 153 uint8_t irestore; 154 uint32_t mask; 155 156 irestore=intStatus(); 157 noInterrupts(); 158 if(intNum > 13) 159 { 160 //Interrupts(); 161 return; 162 } 163 else 164 { 165 //Pio *pio=g_APinDescription[intNum].ulPort; 166 mask=g_APinDescription[intNum].ulPin; 167 interruptMode=1; 168 interruptMask=mask; 169 } 170 if (irestore) interrupts(); 171 } 172 173 void SPIClass::write(uint8_t data) 174 { 175 //Writing the data 176 _p_sercom->writeDataSPI(data); 177 } 178 179 void SPIClass::transfer(void *data, size_t count) 180 { 181 uint8_t *p; 182 //int i=0; 183 //Serial.println("dentro transfer"); 184 if(count==0) return; 185 p=(uint8_t *)data; 186 _p_sercom->writeDataSPI(*p); //scrittura primo dato 187 188 while(--count > 0) 189 { 190 //Serial.println("dentro while"); 191 uint8_t out=*(p+1); //copio in out il prossimo dato 192 uint8_t in = _p_sercom->readDataSPI(); //leggo dato da SPI 193 //Serial.println("UNO"); 194 //while(!(SERCOM4->SPI.INTFLAG.bit.RXC)); // controllo trasferimento //vedere se necessario 195 //Serial.println("DUE"); 196 //Serial.println(out); 197 _p_sercom->writeDataSPI(out); //scrivo il out su SPI 198 *p++=in; //metto in p il dato letto da spi 199 } 200 while(!(SERCOM4->SPI.INTFLAG.bit.TXC)); // controllo trasferimrnto 201 //Serial.print("*p: "); 202 //Serial.println(*p); 203 *p = _p_sercom->readDataSPI(); 204 205 206 207 } 208 209 uint16_t SPIClass::transfer16(uint16_t data) 210 { 211 union{ 212 uint16_t value; 213 struct{ 214 uint8_t lsb; 215 uint8_t msb; 216 }; 217 }in, out; 218 219 in.value = data; 220 221 if(SERCOM4->SPI.CTRLA.bit.DORD==0) 222 { 223 _p_sercom->writeDataSPI(in.msb); 224 while(!(SERCOM4->SPI.INTFLAG.bit.TXC)); 225 out.msb = _p_sercom->readDataSPI(); 226 //while(!(SERCOM4->SPI.INTFLAG.bit.RXC)); 227 _p_sercom->writeDataSPI(in.lsb); 228 while(!(SERCOM4->SPI.INTFLAG.bit.TXC)); 229 out.lsb = _p_sercom->readDataSPI(); 230 } 231 232 else 233 { 234 _p_sercom->writeDataSPI(in.lsb); 235 while(!(SERCOM4->SPI.INTFLAG.bit.TXC)); 236 out.lsb = _p_sercom->readDataSPI(); 237 //while(!(SERCOM4->SPI.INTFLAG.bit.RXC)); 238 _p_sercom->writeDataSPI(in.msb); 239 while(!(SERCOM4->SPI.INTFLAG.bit.TXC)); 240 out.msb = _p_sercom->readDataSPI(); 241 } 242 243 return out.value; 244 } 245 92 246 void SPIClass::attachInterrupt() { 93 247 // Should be enableInterrupt()
Note:
See TracChangeset
for help on using the changeset viewer.