Guest User

Untitled

a guest
Apr 18th, 2016
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.46 KB | None | 0 0
  1. #define CS_SRAM_PIN 15
  2.  
  3. extern volatile uint32_t PIN_OUT;
  4. extern volatile uint32_t PIN_OUT_SET;
  5. extern volatile uint32_t PIN_OUT_CLEAR;
  6.  
  7. extern volatile uint32_t PIN_DIR;
  8. extern volatile uint32_t PIN_DIR_OUTPUT;
  9. extern volatile uint32_t PIN_DIR_INPUT;
  10.  
  11. extern volatile uint32_t PIN_IN;
  12.  
  13. extern volatile uint32_t PIN_0;
  14. extern volatile uint32_t PIN_2;
  15.  
  16. #define SPI          0
  17. #define HSPI         1
  18.  
  19. // function added
  20. void ICACHE_FLASH_ATTR spi_clock(uint8 spi_no, uint16 prediv, uint8 cntdiv){
  21.    if(spi_no > 1) return;
  22.    if((prediv==0)|(cntdiv==0)){
  23.       WRITE_PERI_REG(SPI_CLOCK(spi_no), SPI_CLK_EQU_SYSCLK);
  24.    } else {
  25.       WRITE_PERI_REG(SPI_CLOCK(spi_no),
  26.                (((prediv-1)&SPI_CLKDIV_PRE)<<SPI_CLKDIV_PRE_S)|
  27.                (((cntdiv-1)&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
  28.                (((cntdiv>>1)&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
  29.                ((0&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S));
  30.    }
  31. }
  32.  
  33. //Initialize the SPI port to talk to the chip.
  34. void ICACHE_FLASH_ATTR spiRamInit() {
  35.    char dummy[64];
  36.  
  37.    // gpio init
  38.    WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105|(clock_div_flag<<9)); //Set bit 9 if 80MHz sysclock required
  39.    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2); //GPIO12 is HSPI MISO pin (Master Data In)
  40.    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2); //GPIO13 is HSPI MOSI pin (Master Data Out)
  41.    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2); //GPIO14 is HSPI CLK pin (Clock)
  42.  
  43.    spi_clock(HSPI, 4, 1); //20MHz   - 80Mhz/4/1
  44.    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);   // configure SPI CS (set manually)*/
  45.  
  46.    PIN_DIR_OUTPUT |= (1<<CS_SRAM_PIN);
  47.    PIN_OUT_SET |= (1<<CS_SRAM_PIN);
  48.    //Dummy read to clear any weird state the SPI ram chip may be in
  49.    spiRamRead(0x0, dummy, 64);
  50.  
  51. }
  52.  
  53. //Read bytes from a memory location. The max amount of bytes that can be read is 64.
  54. void spiRamRead(int addr, char *buff, int len) {
  55.    int *p=(int*)buff;
  56.    int d;
  57.    int i=0;
  58.  
  59.    spi_clock(HSPI, 4, 2); //10MHz   - 80Mhz/4/2
  60.    PIN_OUT_CLEAR |= (1<<CS_SRAM_PIN);   // select CS
  61.  
  62.    while(READ_PERI_REG(SPI_CMD(HSPI))&SPI_USR) ;
  63.  
  64.    CLEAR_PERI_REG_MASK(SPI_USER(HSPI), SPI_FLASH_MODE|SPI_USR_MOSI);
  65.    SET_PERI_REG_MASK(SPI_USER(HSPI), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND|SPI_USR_ADDR|SPI_USR_MISO);
  66.  
  67.    WRITE_PERI_REG(SPI_USER1(HSPI), ((0&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S)| //no data out
  68.          ((((8*len)-1)&SPI_USR_MISO_BITLEN)<<SPI_USR_MISO_BITLEN_S)| //len bits of data in
  69.          ((23&SPI_USR_ADDR_BITLEN)<<SPI_USR_ADDR_BITLEN_S)); //address is 24 bits A0-A23
  70.    WRITE_PERI_REG(SPI_ADDR(HSPI), addr<<8); //write address
  71.    WRITE_PERI_REG(SPI_USER2(HSPI), (((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S) | 0x03));
  72.  
  73.    SET_PERI_REG_MASK(SPI_CMD(HSPI), SPI_USR);
  74.    while(READ_PERI_REG(SPI_CMD(HSPI))&SPI_USR) ;
  75.    //Unaligned dest address. Copy 8bit at a time
  76.    while (len>0) {
  77.       d=READ_PERI_REG(SPI_W(HSPI, i));
  78.       buff[i*4+0]=(d>>0)&0xff;
  79.       if (len>=1) buff[i*4+1]=(d>>8)&0xff;
  80.       if (len>=2) buff[i*4+2]=(d>>16)&0xff;
  81.       if (len>=3) buff[i*4+3]=(d>>24)&0xff;
  82.       len-=4;
  83.       i++;
  84.    }
  85.    PIN_OUT_SET |= (1<<CS_SRAM_PIN);   // deselect CS
  86. }
  87.  
  88. //Write bytes to a memory location. The max amount of bytes that can be written is 64.
  89. void spiRamWrite(int addr, char *buff, int len) {
  90.    int i;
  91.    int d;
  92.  
  93.    spi_clock(HSPI, 4, 2); //10MHz   - 80Mhz/4/1
  94.    PIN_OUT_CLEAR |= (1<<CS_SRAM_PIN);   // select CS
  95.  
  96.    while(READ_PERI_REG(SPI_CMD(HSPI))&SPI_USR) ;
  97.  
  98.    CLEAR_PERI_REG_MASK(SPI_USER(HSPI), SPI_FLASH_MODE|SPI_USR_MISO);
  99.    SET_PERI_REG_MASK(SPI_USER(HSPI), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND|SPI_USR_ADDR|SPI_USR_MOSI);
  100.  
  101.    WRITE_PERI_REG(SPI_USER1(HSPI), ((((8*len)-1)&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S)| //len bitsbits of data out
  102.          ((0&SPI_USR_MISO_BITLEN)<<SPI_USR_MISO_BITLEN_S)| //no data in
  103.          ((23&SPI_USR_ADDR_BITLEN)<<SPI_USR_ADDR_BITLEN_S)); //address is 24 bits A0-A23
  104.    WRITE_PERI_REG(SPI_ADDR(HSPI), addr<<8); //write address
  105.    WRITE_PERI_REG(SPI_USER2(HSPI), (((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S) | 0x02));
  106.  
  107.    //Assume unaligned src: Copy byte-wise.
  108.    for (i=0; i<(len+3)/4; i++) {
  109.       d=buff[i*4+0]<<0;
  110.       d|=buff[i*4+1]<<8;
  111.       d|=buff[i*4+2]<<16;
  112.       d|=buff[i*4+3]<<24;
  113.       WRITE_PERI_REG(SPI_W(HSPI, (i)), d);
  114.    }
  115.    SET_PERI_REG_MASK(SPI_CMD(HSPI), SPI_USR);
  116.  
  117.    PIN_OUT_SET |= (1<<CS_SRAM_PIN);   // deselect CS
  118. } - See more at: http://www.esp8266.com/viewtopic.php?f=6&t=9577#sthash.6MTN0ujN.dpuf
Advertisement
Add Comment
Please, Sign In to add comment