|
|
|
|
|
|
|
|
updateCTAR(ctar); |
|
|
updateCTAR(ctar); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool SPIClass::pinIsChipSelect(uint8_t pin) |
|
|
|
|
|
|
|
|
uint8_t SPIClass::pinIsChipSelect(uint8_t pin) |
|
|
{ |
|
|
{ |
|
|
if (pin == 10 || pin == 9 || pin == 6 || pin == 2 || pin == 15) return true; |
|
|
|
|
|
if (pin >= 20 && pin <= 23) return true; |
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
switch (pin) { |
|
|
|
|
|
case 10: return 0x01; // PTC4 |
|
|
|
|
|
case 2: return 0x01; // PTD0 |
|
|
|
|
|
case 9: return 0x02; // PTC3 |
|
|
|
|
|
case 6: return 0x02; // PTD4 |
|
|
|
|
|
case 20: return 0x04; // PTD5 |
|
|
|
|
|
case 23: return 0x04; // PTC2 |
|
|
|
|
|
case 21: return 0x08; // PTD6 |
|
|
|
|
|
case 22: return 0x08; // PTC1 |
|
|
|
|
|
case 15: return 0x10; // PTC0 |
|
|
|
|
|
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) |
|
|
|
|
|
case 26: return 0x01; |
|
|
|
|
|
#endif |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool SPIClass::pinIsChipSelect(uint8_t pin1, uint8_t pin2) |
|
|
bool SPIClass::pinIsChipSelect(uint8_t pin1, uint8_t pin2) |
|
|
{ |
|
|
{ |
|
|
if (!pinIsChipSelect(pin1) || !pinIsChipSelect(pin2)) return false; |
|
|
|
|
|
if ((pin1 == 2 && pin2 == 10) || (pin1 == 10 && pin2 == 2)) return false; |
|
|
|
|
|
if ((pin1 == 6 && pin2 == 9) || (pin1 == 9 && pin2 == 6)) return false; |
|
|
|
|
|
if ((pin1 == 20 && pin2 == 23) || (pin1 == 23 && pin2 == 20)) return false; |
|
|
|
|
|
if ((pin1 == 21 && pin2 == 22) || (pin1 == 22 && pin2 == 21)) return false; |
|
|
|
|
|
|
|
|
uint8_t pin1_mask, pin2_mask; |
|
|
|
|
|
if ((pin1_mask = (uint8_t)pinIsChipSelect(pin1)) == 0) return false; |
|
|
|
|
|
if ((pin2_mask = (uint8_t)pinIsChipSelect(pin2)) == 0) return false; |
|
|
|
|
|
Serial.printf("pinIsChipSelect %d %d %x %x\n\r", pin1, pin2, pin1_mask, pin2_mask); |
|
|
|
|
|
if ((pin1_mask & pin2_mask) != 0) return false; |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SIM_SCGC6 |= SIM_SCGC6_SPI1; |
|
|
SIM_SCGC6 |= SIM_SCGC6_SPI1; |
|
|
|
|
|
|
|
|
// TODO: implement with native code |
|
|
// TODO: implement with native code |
|
|
|
|
|
|
|
|
SPCR = (SPCR & ~SPI_MODE_MASK) | dataMode; |
|
|
|
|
|
|
|
|
SPCR1 = (SPCR1 & ~SPI_MODE_MASK) | dataMode; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void SPI1Class::setClockDivider_noInline(uint32_t clk) |
|
|
void SPI1Class::setClockDivider_noInline(uint32_t clk) |