void spi0::setClockDiv(int factor)//8<=factor <=255 { disableCS(); if(factor<8)factor=8; //make sure factor is always greater than 8 clkDiv=factor&(~0x1); //save with lsb always 0 S0SPCCR=clkDiv; //number of pclk cycles that clock=pclk/clkDiv; //make up one spiclock cycle }
uint8_t gpio_MCP23SXX::beginSpi(bool avoidSpiInit) { uint8_t _initError = 0xFF; #if defined(__MK20DX128__) || defined(__MK20DX256__)//Teensy 3.0 -> 3.2 if ((_mosi == 11 || _mosi == 7) && (_sclk == 13 || _sclk == 14) && (_miso == 255 || _miso == 12 || _miso == 8)) { if (!avoidSpiInit) SPI.begin(); SPI.setMOSI(_mosi); if (_miso != 255) SPI.setMISO(_miso); SPI.setSCK(_sclk) if (SPI.pinIsChipSelect(_cs)){ pinMode(_cs,OUTPUT); disableCS(); } else { bitClear(_initError,1); } } else {
/* Return register content from bank A & B of a 16 bit GPIO chip, combined in a 16 bit data. An 8 Bit chip will return always bank A. Parameters reg: a legal 8bit MCP23Sxx register. */ uint16_t gpio_MCP23SXX::gpioReadRegisterBoth(byte reg) { if (_ports < 16){ return gpioReadRegister(reg); } else { uint16_t result = 0; #if defined(SPI_LEGACY_METHOD) startTransaction(); writeByte_cont(_readCmd); writeByte_cont(reg); #if defined(SPI_HAS_TRANSACTION) setSpiSettings(SPISettings(10000000, MSBFIRST, SPI_MODE0)); result = readWord_cont(); setSpiSettings(SPISettings(_maxGpioSPIspeed, MSBFIRST, SPI_MODE0)); #else result = readWord_cont(); #endif disableCS(); endTransaction(); #else _spi.startTransaction(); _spi.writeByte_cont(_readCmd); _spi.writeByte_cont(reg); #if (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__)) _spi.waitTransmitComplete(); #endif #if defined(SPI_HAS_TRANSACTION) _spi.setSpiSettings(SPISettings(10000000, MSBFIRST, SPI_MODE0)); result = _spi.readWord_cont(false);//command mode _spi.setSpiSettings(SPISettings(_maxGpioSPIspeed, MSBFIRST, SPI_MODE0)); #else result = _spi.readWord_cont(false);//command mode #endif #if (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__)) _spi.writeByte_last(0xFF);//NOP? #else _spi.disableCS(); #endif _spi.endTransaction(); #endif return result; } }