Chat freely about anything...

User avatar
By mgrunt
#45491 Hello,
I can use SPI which is using too internal FLASH (SDCLK, SDD0 and SDD1). CS will be control by software, no hardware.

Just SPI initialize follows?

main code:
Code: Select all#define SPI 0
spi_init(SPI);


driver:
Code: Select allvoid ICACHE_FLASH_ATTR spi_init_gpio(uint8 spi_no, uint8 sysclk_as_spiclk){
//   if(spi_no > 1) return; //Not required. Valid spi_no is checked with if/elif below.
   uint32 clock_div_flag = 0;
   if(sysclk_as_spiclk){
      clock_div_flag = 0x0001;   
   }
   if(spi_no==SPI){
      WRITE_PERI_REG(PERIPHS_IO_MUX, 0x005|(clock_div_flag<<8)); //Set bit 8 if 80MHz sysclock required
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, 1);
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, 1);
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, 1);   
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, 1);   
   }else if(spi_no==HSPI){
      WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105|(clock_div_flag<<9)); //Set bit 9 if 80MHz sysclock required
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2); //GPIO12 is HSPI MISO pin (Master Data In)
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2); //GPIO13 is HSPI MOSI pin (Master Data Out)
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2); //GPIO14 is HSPI CLK pin (Clock)
      //PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2); //GPIO15 is HSPI CS pin (Chip Select / Slave Select)
   }
}

void ICACHE_FLASH_ATTR spi_init(uint8 spi_no){
   if(!sSPI) vSemaphoreCreateBinary(sSPI);
   spi_give_semaphore();
   
   if(spi_no > 1) return; //Only SPI and HSPI are valid spi modules.

   spi_init_gpio(spi_no, SPI_CLK_USE_DIV);
   spi_clock(spi_no, SPI_CLK_PREDIV, SPI_CLK_CNTDIV);
   spi_tx_byte_order(spi_no, SPI_BYTE_ORDER_HIGH_TO_LOW);
   spi_rx_byte_order(spi_no, SPI_BYTE_ORDER_HIGH_TO_LOW);

   SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CS_SETUP|SPI_CS_HOLD);
   CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);
}

Thanks, MG