//----------------------------------------------------------------------------- static void initSDHC() { #ifdef HAS_KINETIS_MPU // Allow SDHC Bus Master access. MPU_RGDAAC0 |= 0x0C000000; #endif // Enable SDHC clock. SIM_SCGC3 |= SIM_SCGC3_SDHC; // Disable GPIO clock. enableGPIO(false); // Reset SDHC. Use default Water Mark Level of 16. SDHC_SYSCTL = SDHC_SYSCTL_RSTA; while (SDHC_SYSCTL & SDHC_SYSCTL_RSTA) { } // Set initial SCK rate. setSdclk(400); enableGPIO(true); // Enable desired IRQSTAT bits. SDHC_IRQSTATEN = SDHC_IRQSTATEN_MASK; NVIC_SET_PRIORITY(IRQ_SDHC, 6*16); NVIC_ENABLE_IRQ(IRQ_SDHC); // Send 80 clocks to card. SDHC_SYSCTL |= SDHC_SYSCTL_INITA; while (SDHC_SYSCTL & SDHC_SYSCTL_INITA) { } }
void prvSetupHardware( void ) { /* If running on Rev A2 silicon, turn the LDO voltage up to 2.75V. This is a workaround to allow the PLL to operate reliably. */ // if( DEVICE_IS_REVA2 ) // { // SysCtlLDOSet( SYSCTL_LDO_2_75V ); // } // // Set the clocking to run from the PLL at 50 MHz // SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); /* Enable Port F for Ethernet LEDs LED0 Bit 3 Output LED1 Bit 2 Output */ SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); enableSysClock(); enableGPIO(); enableADC(); enableUART(); }
/******************************************************************************* swI2CInit This function initializes the i2c attributes and bus Parameters: i2cClkGPIO - The GPIO pin to be used as i2c SCL i2cDataGPIO - The GPIO pin to be used as i2c SDA Return Value: -1 - Fail to initialize the i2c 0 - Success *******************************************************************************/ int32_t swI2CInit(unsigned char i2cClkGPIO, unsigned char i2cDataGPIO,swI2C_wait_proc function) { int i; uint32_t value; uint32_t gate; /* Return 0 if the GPIO pins to be used is out of range. The range is only from [0..63] */ if ((i2cClkGPIO > 31) || (i2cDataGPIO > 31)) return (-1); /* initialize the function pointer */ pfn_swI2C_wait = function; if(pfn_swI2C_wait == NULL) pfn_swI2C_wait = swI2CWait; /* Initialize the GPIO pin for the i2c Clock Register */ g_i2cClkGPIOMuxReg = GPIO_MUX; g_i2cClkGPIODataReg = GPIO_DATA; g_i2cClkGPIODataDirReg = GPIO_DATA_DIRECTION; /* Initialize the Clock GPIO Offset */ g_i2cClockGPIO = i2cClkGPIO; /* Initialize the GPIO pin for the i2c Data Register */ g_i2cDataGPIOMuxReg = GPIO_MUX; g_i2cDataGPIODataReg = GPIO_DATA; g_i2cDataGPIODataDirReg = GPIO_DATA_DIRECTION; /* Initialize the Data GPIO Offset */ g_i2cDataGPIO = i2cDataGPIO; /* Enable the GPIO pins for the i2c Clock and Data (GPIO MUX) */ pokeRegisterDWord(g_i2cClkGPIOMuxReg, peekRegisterDWord(g_i2cClkGPIOMuxReg) & ~(1 << g_i2cClockGPIO)); pokeRegisterDWord(g_i2cDataGPIOMuxReg, peekRegisterDWord(g_i2cDataGPIOMuxReg) & ~(1 << g_i2cDataGPIO)); /* Enable GPIO power */ enableGPIO(1); /* Clear the i2c lines. */ for(i=0; i<9; i++) swI2CStop(); return 0; }
/* * This function initializes the i2c attributes and bus * * Parameters: * i2cClkGPIO - The GPIO pin to be used as i2c SCL * i2cDataGPIO - The GPIO pin to be used as i2c SDA * * Return Value: * -1 - Fail to initialize the i2c * 0 - Success */ long swI2CInit( unsigned char i2cClkGPIO, unsigned char i2cDataGPIO ) { int i; /* Return 0 if the GPIO pins to be used is out of range. The range is only from [0..63] */ if ((i2cClkGPIO > 31) || (i2cDataGPIO > 31)) return -1; if (getChipType() == SM750LE) return swI2CInit_SM750LE(i2cClkGPIO, i2cDataGPIO); /* Initialize the GPIO pin for the i2c Clock Register */ g_i2cClkGPIOMuxReg = GPIO_MUX; g_i2cClkGPIODataReg = GPIO_DATA; g_i2cClkGPIODataDirReg = GPIO_DATA_DIRECTION; /* Initialize the Clock GPIO Offset */ g_i2cClockGPIO = i2cClkGPIO; /* Initialize the GPIO pin for the i2c Data Register */ g_i2cDataGPIOMuxReg = GPIO_MUX; g_i2cDataGPIODataReg = GPIO_DATA; g_i2cDataGPIODataDirReg = GPIO_DATA_DIRECTION; /* Initialize the Data GPIO Offset */ g_i2cDataGPIO = i2cDataGPIO; /* Enable the GPIO pins for the i2c Clock and Data (GPIO MUX) */ POKE32(g_i2cClkGPIOMuxReg, PEEK32(g_i2cClkGPIOMuxReg) & ~(1 << g_i2cClockGPIO)); POKE32(g_i2cDataGPIOMuxReg, PEEK32(g_i2cDataGPIOMuxReg) & ~(1 << g_i2cDataGPIO)); /* Enable GPIO power */ enableGPIO(1); /* Clear the i2c lines. */ for(i=0; i<9; i++) swI2CStop(); return 0; }
//============================================================================= bool SdioCard::begin() { uint32_t kHzSdClk; uint32_t arg; m_initDone = false; m_errorCode = SD_CARD_ERROR_NONE; m_highCapacity = false; m_version2 = false; // initialize controller. initSDHC(); if (!cardCommand(CMD0_XFERTYP, 0)) { return sdError(SD_CARD_ERROR_CMD0); } // Try several times for case of reset delay. for (uint32_t i = 0; i < CMD8_RETRIES; i++) { if (cardCommand(CMD8_XFERTYP, 0X1AA)) { if (SDHC_CMDRSP0 != 0X1AA) { return sdError(SD_CARD_ERROR_CMD8); } m_version2 = true; break; } } arg = m_version2 ? 0X40300000 : 0x00300000; uint32_t m = micros(); do { if (!cardAcmd(0, ACMD41_XFERTYP, arg) || ((micros() - m) > BUSY_TIMEOUT_MICROS)) { return sdError(SD_CARD_ERROR_ACMD41); } } while ((SDHC_CMDRSP0 & 0x80000000) == 0); m_ocr = SDHC_CMDRSP0; if (SDHC_CMDRSP0 & 0x40000000) { // Is high capacity. m_highCapacity = true; } if (!cardCommand(CMD2_XFERTYP, 0)) { return sdError(SD_CARD_ERROR_CMD2); } if (!cardCommand(CMD3_XFERTYP, 0)) { return sdError(SD_CARD_ERROR_CMD3); } m_rca = SDHC_CMDRSP0 & 0xFFFF0000; if (!readReg16(CMD9_XFERTYP, &m_csd)) { return sdError(SD_CARD_ERROR_CMD9); } if (!readReg16(CMD10_XFERTYP, &m_cid)) { return sdError(SD_CARD_ERROR_CMD10); } if (!cardCommand(CMD7_XFERTYP, m_rca)) { return sdError(SD_CARD_ERROR_CMD7); } // Set card to bus width four. if (!cardAcmd(m_rca, ACMD6_XFERTYP, 2)) { return sdError(SD_CARD_ERROR_ACMD6); } // Set SDHC to bus width four. SDHC_PROCTL &= ~SDHC_PROCTL_DTW_MASK; SDHC_PROCTL |= SDHC_PROCTL_DTW(SDHC_PROCTL_DTW_4BIT); SDHC_WML = SDHC_WML_RDWML(FIFO_WML) | SDHC_WML_WRWML(FIFO_WML); // Determine if High Speed mode is supported and set frequency. uint8_t status[64]; if (cardCMD6(0X00FFFFFF, status) && (2 & status[13]) && cardCMD6(0X80FFFFF1, status) && (status[16] & 0XF) == 1) { kHzSdClk = 50000; } else { kHzSdClk = 25000; } // disable GPIO enableGPIO(false); // Set the SDHC SCK frequency. setSdclk(kHzSdClk); // enable GPIO enableGPIO(true); m_initDone = true; return true; }