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

1.7.10のファイルに更新

File:
1 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()
Note: See TracChangeset for help on using the changeset viewer.