T4: Support legacy (pre SPI.transaction) methodsmain
// Lets initialize the Transmit FIFO watermark to FIFO size - 1... | // Lets initialize the Transmit FIFO watermark to FIFO size - 1... | ||||
// BUGBUG:: I assume queue of 16 for now... | // BUGBUG:: I assume queue of 16 for now... | ||||
port().FCR = LPSPI_FCR_TXWATER(15); | port().FCR = LPSPI_FCR_TXWATER(15); | ||||
// We should initialize the SPI to be in a known default state. | |||||
beginTransaction(SPISettings()); | |||||
endTransaction(); | |||||
} | |||||
void SPIClass::setClockDivider_noInline(uint32_t clk) { | |||||
// Again depreciated, but... | |||||
hardware().clock_gate_register |= hardware().clock_gate_mask; | |||||
if (clk != _clock) { | |||||
static const uint32_t clk_sel[4] = {664615384, // PLL3 PFD1 | |||||
720000000, // PLL3 PFD0 | |||||
528000000, // PLL2 | |||||
396000000}; // PLL2 PFD2 | |||||
// First save away the new settings.. | |||||
_clock = clk; | |||||
uint32_t cbcmr = CCM_CBCMR; | |||||
uint32_t clkhz = clk_sel[(cbcmr >> 4) & 0x03] / (((cbcmr >> 26 ) & 0x07 ) + 1); // LPSPI peripheral clock | |||||
uint32_t d, div; | |||||
d = _clock ? clkhz/_clock : clkhz; | |||||
if (d && clkhz/d > _clock) d++; | |||||
if (d > 257) d= 257; // max div | |||||
if (d > 2) { | |||||
div = d-2; | |||||
} else { | |||||
div =0; | |||||
} | |||||
_ccr = LPSPI_CCR_SCKDIV(div) | LPSPI_CCR_DBT(div/2); | |||||
} | |||||
//Serial.printf("SPI.setClockDivider_noInline CCR:%x TCR:%x\n", _ccr, port().TCR); | |||||
port().CR = 0; | |||||
port().CFGR1 = LPSPI_CFGR1_MASTER | LPSPI_CFGR1_SAMPLE; | |||||
port().CCR = _ccr; | |||||
port().CR = LPSPI_CR_MEN; | |||||
} | } | ||||
uint8_t SPIClass::pinIsChipSelect(uint8_t pin) | uint8_t SPIClass::pinIsChipSelect(uint8_t pin) | ||||
{ | { | ||||
for (unsigned int i = 0; i < sizeof(hardware().cs_pin); i++) { | for (unsigned int i = 0; i < sizeof(hardware().cs_pin); i++) { | ||||
{ | { | ||||
hardware().clock_gate_register |= hardware().clock_gate_mask; | hardware().clock_gate_register |= hardware().clock_gate_mask; | ||||
//SPCR = (SPCR & ~SPI_MODE_MASK) | dataMode; | //SPCR = (SPCR & ~SPI_MODE_MASK) | dataMode; | ||||
// Handle Data Mode | |||||
uint32_t tcr = port().TCR & ~(LPSPI_TCR_CPOL | LPSPI_TCR_CPHA); | |||||
if (dataMode & 0x08) tcr |= LPSPI_TCR_CPOL; | |||||
// Note: On T3.2 when we set CPHA it also updated the timing. It moved the | |||||
// PCS to SCK Delay Prescaler into the After SCK Delay Prescaler | |||||
if (dataMode & 0x04) tcr |= LPSPI_TCR_CPHA; | |||||
// Save back out | |||||
port().TCR = tcr; | |||||
} | } | ||||
void _spi_dma_rxISR0(void) {SPI.dma_rxisr();} | void _spi_dma_rxISR0(void) {SPI.dma_rxisr();} |
// beginTransaction() to configure SPI settings. | // beginTransaction() to configure SPI settings. | ||||
void setClockDivider(uint8_t clockDiv) { | void setClockDivider(uint8_t clockDiv) { | ||||
if (clockDiv == SPI_CLOCK_DIV2) { | if (clockDiv == SPI_CLOCK_DIV2) { | ||||
//setClockDivider_noInline(SPISettings(12000000, MSBFIRST, SPI_MODE0).ctar); | |||||
setClockDivider_noInline(12000000); | |||||
} else if (clockDiv == SPI_CLOCK_DIV4) { | } else if (clockDiv == SPI_CLOCK_DIV4) { | ||||
//setClockDivider_noInline(SPISettings(4000000, MSBFIRST, SPI_MODE0).ctar); | |||||
setClockDivider_noInline(4000000); | |||||
} else if (clockDiv == SPI_CLOCK_DIV8) { | } else if (clockDiv == SPI_CLOCK_DIV8) { | ||||
//setClockDivider_noInline(SPISettings(2000000, MSBFIRST, SPI_MODE0).ctar); | |||||
setClockDivider_noInline(2000000); | |||||
} else if (clockDiv == SPI_CLOCK_DIV16) { | } else if (clockDiv == SPI_CLOCK_DIV16) { | ||||
//setClockDivider_noInline(SPISettings(1000000, MSBFIRST, SPI_MODE0).ctar); | |||||
setClockDivider_noInline(1000000); | |||||
} else if (clockDiv == SPI_CLOCK_DIV32) { | } else if (clockDiv == SPI_CLOCK_DIV32) { | ||||
//setClockDivider_noInline(SPISettings(500000, MSBFIRST, SPI_MODE0).ctar); | |||||
setClockDivider_noInline(500000); | |||||
} else if (clockDiv == SPI_CLOCK_DIV64) { | } else if (clockDiv == SPI_CLOCK_DIV64) { | ||||
//setClockDivider_noInline(SPISettings(250000, MSBFIRST, SPI_MODE0).ctar); | |||||
setClockDivider_noInline(250000); | |||||
} else { /* clockDiv == SPI_CLOCK_DIV128 */ | } else { /* clockDiv == SPI_CLOCK_DIV128 */ | ||||
//setClockDivider_noInline(SPISettings(125000, MSBFIRST, SPI_MODE0).ctar); | |||||
setClockDivider_noInline(125000); | |||||
} | } | ||||
} | } | ||||
void setClockDivider_noInline(uint32_t clk); | void setClockDivider_noInline(uint32_t clk); |