- Timestamp:
- Apr 30, 2016, 11:29:25 PM (8 years ago)
- Location:
- rtos_arduino/trunk/arduino_lib/hardware/arduino/samd/libraries
- Files:
-
- 15 added
- 2 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() -
rtos_arduino/trunk/arduino_lib/hardware/arduino/samd/libraries/SPI/SPI.h
r136 r224 14 14 #include "variant.h" 15 15 #include "wiring_constants.h" 16 #include <Arduino.h> 17 18 //#define LSBFIRST 0 //already defined in wiring_constants.h 19 //#define MSBFIRST 1 16 20 17 21 #define SPI_MODE0 0x02 … … 20 24 #define SPI_MODE3 0x01 21 25 26 27 #define SPI_CLOCK_DIV2 6 //8 MHz 28 #define SPI_CLOCK_DIV4 12 //4 MHz 29 #define SPI_CLOCK_DIV8 24 //2 MHz 30 #define SPI_CLOCK_DIV16 48 //1 MHz 31 #define SPI_CLOCK_DIV32 96 //500 KHz 32 #define SPI_CLOCK_DIV64 192 //250 KHz 33 #define SPI_CLOCK_DIV128 384 //125 KHz 34 35 #ifndef intStatus 36 #define intStatus() __intStatus() 37 static inline unsigned char __intStatus(void) __attribute__((always_inline, unused)); 38 static inline unsigned char __intStatus(void) { 39 unsigned int primask, faultmask; 40 asm volatile ("mrs %0, primask" : "=r" (primask)); 41 if (primask) return 0; 42 asm volatile ("mrs %0, faultmask" : "=r" (faultmask)); 43 if (faultmask) return 0; 44 return 1; 45 } 46 #endif 47 48 class SPISettings { 49 public: 50 SPISettings(uint32_t clock, uint8_t bitOrder, uint8_t dataMode) 51 { 52 interface_clock = clock; 53 bit_order = bitOrder; 54 data_mode = dataMode; 55 56 /*Serial.print("clock: "); 57 Serial.println(interface_clock); 58 Serial.print("bit order: "); 59 Serial.println(bit_order); 60 Serial.print("data mode: "); 61 Serial.println(data_mode);*/ 62 } 63 64 SPISettings(void) 65 { 66 interface_clock = 4000000; 67 bit_order = MSBFIRST; 68 data_mode = SPI_MODE0; 69 70 /*Serial.print("clock: "); 71 Serial.println(interface_clock); 72 Serial.print("bit order: "); 73 Serial.println(bit_order); 74 Serial.print("data mode: "); 75 Serial.println(data_mode);*/ 76 } 77 private: 78 uint32_t interface_clock; 79 uint8_t bit_order; 80 uint8_t data_mode; 81 82 friend class SPIClass; 83 }; 84 85 22 86 class SPIClass { 23 87 public: … … 25 89 26 90 byte transfer(uint8_t data); 27 91 void transfer(void *data, size_t count); 92 byte read(void); 93 uint16_t transfer16(uint16_t data); 94 void write(uint8_t data); 28 95 // SPI Configuration methods 96 void beginTransaction(SPISettings settings); 97 void endTransaction(void); 98 29 99 void attachInterrupt(); 30 100 void detachInterrupt(); 101 102 void usingInterrupt(uint8_t interruptNumber); 31 103 32 104 void begin(); 105 void beginSlave(); 33 106 void end(); 34 107 35 108 void setBitOrder(BitOrder order); 36 109 void setDataMode(uint8_t uc_mode); 37 void setClockDivider(uint 8_t uc_div);110 void setClockDivider(uint16_t uc_div); 38 111 39 112 private: … … 42 115 uint8_t _uc_pinMosi; 43 116 uint8_t _uc_pinSCK; 117 uint8_t interruptMode; 118 uint32_t interruptMask; 119 uint8_t interruptSave; 120 uint8_t inTransactionFlag; 44 121 }; 45 122
Note:
See TracChangeset
for help on using the changeset viewer.