Exemplo n.º 1
0
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
}
Exemplo n.º 2
0
	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 {
Exemplo n.º 3
0
/*
  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;
	}
}