Ignore:
Timestamp:
Apr 30, 2016, 11:29:25 PM (8 years ago)
Author:
ertl-honda
Message:

1.7.10のファイルに更新

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  
    1313#include "assert.h"
    1414#include "variant.h"
     15#include <Arduino.h>
    1516
    1617SPIClass::SPIClass(SERCOM *p_sercom, uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI)
     
    3839}
    3940
     41
     42void 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
    4055void SPIClass::end()
    4156{
    4257        _p_sercom->resetSPI();
    4358}
     59
     60
     61void 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       
     93void SPIClass::endTransaction(void)
     94{
     95        inTransactionFlag=0;
     96        interrupts();
     97}       
    4498
    4599void SPIClass::setBitOrder(BitOrder order)
     
    76130}
    77131
    78 void SPIClass::setClockDivider(uint8_t div)
     132void SPIClass::setClockDivider(uint16_t div)
    79133{
    80134        _p_sercom->setBaudrateSPI(div);
     
    90144}
    91145
     146byte SPIClass::read()
     147{
     148        return _p_sercom->readDataSPI();
     149}
     150
     151void 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
     173void SPIClass::write(uint8_t data)
     174{
     175        //Writing the data
     176        _p_sercom->writeDataSPI(data);
     177}
     178
     179void 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
     209uint16_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
    92246void SPIClass::attachInterrupt() {
    93247        // Should be enableInterrupt()
  • rtos_arduino/trunk/arduino_lib/hardware/arduino/samd/libraries/SPI/SPI.h

    r136 r224  
    1414#include "variant.h"
    1515#include "wiring_constants.h"
     16#include <Arduino.h>
     17 
     18//#define LSBFIRST 0 //already defined in wiring_constants.h
     19//#define MSBFIRST 1
    1620
    1721#define SPI_MODE0 0x02
     
    2024#define SPI_MODE3 0x01
    2125
     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()
     37static inline unsigned char __intStatus(void) __attribute__((always_inline, unused));
     38static 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
     48class 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
    2286class SPIClass {
    2387  public:
     
    2589
    2690        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);
    2895        // SPI Configuration methods
     96        void beginTransaction(SPISettings settings);
     97        void endTransaction(void);
     98       
    2999        void attachInterrupt();
    30100        void detachInterrupt();
     101       
     102        void usingInterrupt(uint8_t interruptNumber);
    31103
    32104        void begin();
     105        void beginSlave();
    33106        void end();
    34107       
    35108        void setBitOrder(BitOrder order);
    36109        void setDataMode(uint8_t uc_mode);
    37         void setClockDivider(uint8_t uc_div);
     110        void setClockDivider(uint16_t uc_div);
    38111
    39112  private:
     
    42115        uint8_t _uc_pinMosi;
    43116        uint8_t _uc_pinSCK;
     117        uint8_t interruptMode;
     118        uint32_t interruptMask;
     119        uint8_t interruptSave;
     120        uint8_t inTransactionFlag;
    44121};
    45122
Note: See TracChangeset for help on using the changeset viewer.