|
|
|
|
|
|
|
|
|
|
|
|
|
|
#elif defined(__arm__) && defined(TEENSYDUINO) && (defined(__IMXRT1052__) || defined(__IMXRT1062__)) |
|
|
#elif defined(__arm__) && defined(TEENSYDUINO) && (defined(__IMXRT1052__) || defined(__IMXRT1062__)) |
|
|
|
|
|
|
|
|
#include "debug/printf.h" |
|
|
|
|
|
|
|
|
//#include "debug/printf.h" |
|
|
|
|
|
|
|
|
void SPIClass::begin() |
|
|
void SPIClass::begin() |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
// CBCMR[LPSPI_CLK_SEL] - PLL2 = 528 MHz |
|
|
// CBCMR[LPSPI_CLK_SEL] - PLL2 = 528 MHz |
|
|
// CBCMR[LPSPI_PODF] - div4 = 132 MHz |
|
|
// CBCMR[LPSPI_PODF] - div4 = 132 MHz |
|
|
|
|
|
|
|
|
CCM_CCGR1 &= ~CCM_CCGR1_LPSPI4(CCM_CCGR_ON); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hardware->clock_gate_register &= ~hardware->clock_gate_mask; |
|
|
|
|
|
|
|
|
CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_LPSPI_PODF_MASK | CCM_CBCMR_LPSPI_CLK_SEL_MASK)) | |
|
|
CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_LPSPI_PODF_MASK | CCM_CBCMR_LPSPI_CLK_SEL_MASK)) | |
|
|
CCM_CBCMR_LPSPI_PODF(6) | CCM_CBCMR_LPSPI_CLK_SEL(2); // pg 714 |
|
|
CCM_CBCMR_LPSPI_PODF(6) | CCM_CBCMR_LPSPI_CLK_SEL(2); // pg 714 |
|
|
|
|
|
|
|
|
uint32_t fastio = IOMUXC_PAD_SRE | IOMUXC_PAD_DSE(3) | IOMUXC_PAD_SPEED(3); |
|
|
uint32_t fastio = IOMUXC_PAD_SRE | IOMUXC_PAD_DSE(3) | IOMUXC_PAD_SPEED(3); |
|
|
//uint32_t fastio = IOMUXC_PAD_DSE(3) | IOMUXC_PAD_SPEED(3); |
|
|
//uint32_t fastio = IOMUXC_PAD_DSE(3) | IOMUXC_PAD_SPEED(3); |
|
|
IOMUXC_SW_PAD_CTL_PAD_GPIO_B0_01 = fastio; |
|
|
|
|
|
IOMUXC_SW_PAD_CTL_PAD_GPIO_B0_02 = fastio; |
|
|
|
|
|
IOMUXC_SW_PAD_CTL_PAD_GPIO_B0_03 = fastio; |
|
|
|
|
|
|
|
|
Serial.printf("SPI MISO: %d MOSI: %d, SCK: %d\n", hardware->miso_pin[miso_pin_index], hardware->mosi_pin[mosi_pin_index], hardware->sck_pin[sck_pin_index]); |
|
|
|
|
|
*(portControlRegister(hardware->miso_pin[miso_pin_index])) = fastio; |
|
|
|
|
|
*(portControlRegister(hardware->mosi_pin[mosi_pin_index])) = fastio; |
|
|
|
|
|
*(portControlRegister(hardware->sck_pin[sck_pin_index])) = fastio; |
|
|
|
|
|
|
|
|
//printf("CBCMR = %08lX\n", CCM_CBCMR); |
|
|
//printf("CBCMR = %08lX\n", CCM_CBCMR); |
|
|
CCM_CCGR1 |= CCM_CCGR1_LPSPI4(CCM_CCGR_ON); |
|
|
|
|
|
IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_01 = 3 | 0x10; // SDI |
|
|
|
|
|
IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_02 = 3 | 0x10; // SDO |
|
|
|
|
|
IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_03 = 3 | 0x10; // SCK |
|
|
|
|
|
|
|
|
hardware->clock_gate_register |= hardware->clock_gate_mask; |
|
|
|
|
|
*(portConfigRegister(hardware->miso_pin[miso_pin_index])) = hardware->miso_mux[miso_pin_index]; |
|
|
|
|
|
*(portConfigRegister(hardware->mosi_pin [mosi_pin_index])) = hardware->mosi_mux[mosi_pin_index]; |
|
|
|
|
|
*(portConfigRegister(hardware->sck_pin [sck_pin_index])) = hardware->sck_mux[sck_pin_index]; |
|
|
|
|
|
|
|
|
//digitalWriteFast(10, HIGH); |
|
|
//digitalWriteFast(10, HIGH); |
|
|
//pinMode(10, OUTPUT); |
|
|
//pinMode(10, OUTPUT); |
|
|
//digitalWriteFast(10, HIGH); |
|
|
//digitalWriteFast(10, HIGH); |
|
|
LPSPI4_CR = LPSPI_CR_RST; |
|
|
|
|
|
|
|
|
port->CR = LPSPI_CR_RST; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
uint8_t SPIClass::pinIsChipSelect(uint8_t pin) |
|
|
uint8_t SPIClass::pinIsChipSelect(uint8_t pin) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool SPIClass::pinIsMOSI(uint8_t pin) |
|
|
bool SPIClass::pinIsMOSI(uint8_t pin) |
|
|
{ |
|
|
{ |
|
|
for (unsigned int i = 0; i < sizeof(hardware().mosi_pin); i++) { |
|
|
|
|
|
if (pin == hardware().mosi_pin[i]) return true; |
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < sizeof(hardware->mosi_pin); i++) { |
|
|
|
|
|
if (pin == hardware->mosi_pin[i]) return true; |
|
|
} |
|
|
} |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool SPIClass::pinIsMISO(uint8_t pin) |
|
|
bool SPIClass::pinIsMISO(uint8_t pin) |
|
|
{ |
|
|
{ |
|
|
for (unsigned int i = 0; i < sizeof(hardware().miso_pin); i++) { |
|
|
|
|
|
if (pin == hardware().miso_pin[i]) return true; |
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < sizeof(hardware->miso_pin); i++) { |
|
|
|
|
|
if (pin == hardware->miso_pin[i]) return true; |
|
|
} |
|
|
} |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool SPIClass::pinIsSCK(uint8_t pin) |
|
|
bool SPIClass::pinIsSCK(uint8_t pin) |
|
|
{ |
|
|
{ |
|
|
for (unsigned int i = 0; i < sizeof(hardware().sck_pin); i++) { |
|
|
|
|
|
if (pin == hardware().sck_pin[i]) return true; |
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < sizeof(hardware->sck_pin); i++) { |
|
|
|
|
|
if (pin == hardware->sck_pin[i]) return true; |
|
|
} |
|
|
} |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
uint8_t SPIClass::setCS(uint8_t pin) |
|
|
uint8_t SPIClass::setCS(uint8_t pin) |
|
|
{ |
|
|
{ |
|
|
/* |
|
|
/* |
|
|
for (unsigned int i = 0; i < sizeof(hardware().cs_pin); i++) { |
|
|
|
|
|
if (pin == hardware().cs_pin[i]) { |
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < sizeof(hardware->cs_pin); i++) { |
|
|
|
|
|
if (pin == hardware->cs_pin[i]) { |
|
|
volatile uint32_t *reg = portConfigRegister(pin); |
|
|
volatile uint32_t *reg = portConfigRegister(pin); |
|
|
*reg = hardware().cs_mux[i]; |
|
|
|
|
|
return hardware().cs_mask[i]; |
|
|
|
|
|
|
|
|
*reg = hardware->cs_mux[i]; |
|
|
|
|
|
return hardware->cs_mask[i]; |
|
|
} |
|
|
} |
|
|
} */ |
|
|
} */ |
|
|
return 0; |
|
|
return 0; |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const SPIClass::SPI_Hardware_t SPIClass::lpspi4_hardware = { |
|
|
|
|
|
CCM_CCGR1, |
|
|
|
|
|
|
|
|
const SPIClass::SPI_Hardware_t spiclass_lpspi4_hardware = { |
|
|
|
|
|
CCM_CCGR1, CCM_CCGR1_LPSPI4(CCM_CCGR_ON), |
|
|
12, |
|
|
12, |
|
|
3 | 0x10, |
|
|
3 | 0x10, |
|
|
11, |
|
|
11, |
|
|
|
|
|
|
|
|
10, |
|
|
10, |
|
|
3 | 0x10, |
|
|
3 | 0x10, |
|
|
}; |
|
|
}; |
|
|
SPIClass SPI(0, (uintptr_t)&SPIClass::lpspi4_hardware); |
|
|
|
|
|
|
|
|
SPIClass SPI(&IMXRT_LPSPI4_S, &spiclass_lpspi4_hardware); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SPIClass::transfer(const void * buf, void * retbuf, size_t count) |
|
|
void SPIClass::transfer(const void * buf, void * retbuf, size_t count) |