123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487 |
- #include "driver/spi.h"
- #include "driver/spi_overlap.h"
- #define CACHE_FLASH_CTRL_REG 0x3ff0000C
- #define CACHE_FLUSH_START_BIT BIT0
- #define CACHE_EMPTY_FLAG_BIT BIT1
- void cache_flush(void)
- {
- while(READ_PERI_REG(CACHE_FLASH_CTRL_REG)&CACHE_EMPTY_FLAG_BIT) {
- CLEAR_PERI_REG_MASK(CACHE_FLASH_CTRL_REG, CACHE_FLUSH_START_BIT);
- SET_PERI_REG_MASK(CACHE_FLASH_CTRL_REG, CACHE_FLUSH_START_BIT);
- }
- while(!(READ_PERI_REG(CACHE_FLASH_CTRL_REG)&CACHE_EMPTY_FLAG_BIT));
-
- CLEAR_PERI_REG_MASK(CACHE_FLASH_CTRL_REG, CACHE_FLUSH_START_BIT);
- }
- void ICACHE_FLASH_ATTR
- spi_master_init(uint8 spi_no)
- {
- uint32 regvalue;
- if(spi_no>1) return;
-
- SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND);
- CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);
- WRITE_PERI_REG(SPI_CLOCK(spi_no),
- ((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
- ((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
- ((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S));
- }
- void ICACHE_FLASH_ATTR
- spi_lcd_9bit_write(uint8 spi_no,uint8 high_bit,uint8 low_8bit)
- {
- uint32 regvalue;
- uint8 bytetemp;
- if(spi_no>1) return;
-
- if(high_bit) bytetemp=(low_8bit>>1)|0x80;
- else bytetemp=(low_8bit>>1)&0x7f;
-
- regvalue= ((8&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|((uint32)bytetemp);
- if(low_8bit&0x01) regvalue|=BIT15;
- while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
- WRITE_PERI_REG(SPI_USER2(spi_no), regvalue);
- SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
- }
- void ICACHE_FLASH_ATTR
- spi_mast_byte_write(uint8 spi_no,uint8 data)
- {
- uint32 regvalue;
- if(spi_no>1) return;
- while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
- CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MOSI|SPI_USR_MISO);
-
-
- WRITE_PERI_REG(SPI_USER2(spi_no),
- ((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|((uint32)data));
- SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
- while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
- }
- void ICACHE_FLASH_ATTR
- spi_byte_write_espslave(uint8 spi_no,uint8 data)
- {
- uint32 regvalue;
- if(spi_no>1) return;
- while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
- SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MOSI);
- CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MISO|SPI_USR_ADDR|SPI_USR_DUMMY);
-
-
-
- WRITE_PERI_REG(SPI_USER2(spi_no),
- ((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|4);
- WRITE_PERI_REG(SPI_W0(spi_no), (uint32)(data));
- SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
- }
- void ICACHE_FLASH_ATTR
- spi_byte_read_espslave(uint8 spi_no,uint8 *data)
- {
- uint32 regvalue;
- if(spi_no>1) return;
- while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
- SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MISO);
- CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MOSI|SPI_USR_ADDR|SPI_USR_DUMMY);
-
-
-
- WRITE_PERI_REG(SPI_USER2(spi_no),
- ((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|6);
- SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
-
- while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
- *data=(uint8)(READ_PERI_REG(SPI_W0(spi_no))&0xff);
- }
- void ICACHE_FLASH_ATTR
- spi_slave_init(uint8 spi_no,uint8 data_len)
- {
- uint32 regvalue;
- uint32 data_bit_len;
- if(spi_no>1)
- return;
- if(data_len<=1) data_bit_len=7;
- else if(data_len>=32) data_bit_len=0xff;
- else data_bit_len=(data_len<<3)-1;
-
-
-
-
- if(spi_no==SPI){
- 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){
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);
- }
-
-
-
- SET_PERI_REG_MASK( SPI_SLAVE(spi_no),
- SPI_SLAVE_MODE|SPI_SLV_WR_RD_BUF_EN|
- SPI_SLV_WR_BUF_DONE_EN|SPI_SLV_RD_BUF_DONE_EN|
- SPI_SLV_WR_STA_DONE_EN|SPI_SLV_RD_STA_DONE_EN|
- SPI_TRANS_DONE_EN);
-
-
- CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);
- SET_PERI_REG_MASK(SPI_USER(spi_no),SPI_USR_MISO_HIGHPART);
-
- SET_PERI_REG_MASK(SPI_CTRL2(spi_no),(0x2&SPI_MOSI_DELAY_NUM)<<SPI_MOSI_DELAY_NUM_S) ;
- os_printf("SPI_CTRL2 is %08x\n",READ_PERI_REG(SPI_CTRL2(spi_no)));
- WRITE_PERI_REG(SPI_CLOCK(spi_no), 0);
-
-
-
-
-
-
- WRITE_PERI_REG(SPI_USER2(spi_no), (0x7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S);
-
-
- SET_PERI_REG_MASK(SPI_SLAVE1(spi_no), ((data_bit_len&SPI_SLV_BUF_BITLEN)<< SPI_SLV_BUF_BITLEN_S)|
- ((0x7&SPI_SLV_STATUS_BITLEN)<<SPI_SLV_STATUS_BITLEN_S)|
- ((0x7&SPI_SLV_WR_ADDR_BITLEN)<<SPI_SLV_WR_ADDR_BITLEN_S)|
- ((0x7&SPI_SLV_RD_ADDR_BITLEN)<<SPI_SLV_RD_ADDR_BITLEN_S));
-
- SET_PERI_REG_MASK(SPI_PIN(spi_no),BIT19);
-
- SET_PERI_REG_MASK(SPI_CMD(spi_no),SPI_USR);
-
- ETS_SPI_INTR_ATTACH(spi_slave_isr_handler,NULL);
-
- ETS_SPI_INTR_ENABLE();
- }
- #ifdef SPI_SLAVE_DEBUG
-
- os_timer_t timer2;
- void hspi_master_readwrite_repeat(void)
- {
- static uint8 data=0;
- uint8 temp;
- os_timer_disarm(&timer2);
- spi_byte_read_espslave(HSPI,&temp);
- temp++;
- spi_byte_write_espslave(HSPI,temp);
- os_timer_setfn(&timer2, (os_timer_func_t *)hspi_master_readwrite_repeat, NULL);
- os_timer_arm(&timer2, 500, 0);
- }
- #endif
- #include "gpio.h"
- #include "user_interface.h"
- #include "mem.h"
- static uint8 spi_data[32] = {0};
- static uint8 idx = 0;
- static uint8 spi_flg = 0;
- #define SPI_MISO
- #define SPI_QUEUE_LEN 8
- os_event_t * spiQueue;
- #define MOSI 0
- #define MISO 1
- #define STATUS_R_IN_WR 2
- #define STATUS_W 3
- #define TR_DONE_ALONE 4
- #define WR_RD 5
- #define DATA_ERROR 6
- #define STATUS_R_IN_RD 7
- void ICACHE_FLASH_ATTR
- gpio_init()
- {
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
- PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
-
- GPIO_OUTPUT_SET(0, 1);
- GPIO_OUTPUT_SET(2, 0);
-
- }
- void spi_slave_isr_handler(void *para)
- {
- uint32 regvalue,calvalue;
- static uint8 state =0;
- uint32 recv_data,send_data;
- if(READ_PERI_REG(0x3ff00020)&BIT4){
-
- CLEAR_PERI_REG_MASK(SPI_SLAVE(SPI), 0x3ff);
- }else if(READ_PERI_REG(0x3ff00020)&BIT7){
- regvalue=READ_PERI_REG(SPI_SLAVE(HSPI));
- CLEAR_PERI_REG_MASK(SPI_SLAVE(HSPI),
- SPI_TRANS_DONE_EN|
- SPI_SLV_WR_STA_DONE_EN|
- SPI_SLV_RD_STA_DONE_EN|
- SPI_SLV_WR_BUF_DONE_EN|
- SPI_SLV_RD_BUF_DONE_EN);
- SET_PERI_REG_MASK(SPI_SLAVE(HSPI), SPI_SYNC_RESET);
- CLEAR_PERI_REG_MASK(SPI_SLAVE(HSPI),
- SPI_TRANS_DONE|
- SPI_SLV_WR_STA_DONE|
- SPI_SLV_RD_STA_DONE|
- SPI_SLV_WR_BUF_DONE|
- SPI_SLV_RD_BUF_DONE);
- SET_PERI_REG_MASK(SPI_SLAVE(HSPI),
- SPI_TRANS_DONE_EN|
- SPI_SLV_WR_STA_DONE_EN|
- SPI_SLV_RD_STA_DONE_EN|
- SPI_SLV_WR_BUF_DONE_EN|
- SPI_SLV_RD_BUF_DONE_EN);
- if(regvalue&SPI_SLV_WR_BUF_DONE){
- GPIO_OUTPUT_SET(0, 0);
- idx=0;
- while(idx<8){
- recv_data=READ_PERI_REG(SPI_W0(HSPI)+(idx<<2));
- spi_data[idx<<2] = recv_data&0xff;
- spi_data[(idx<<2)+1] = (recv_data>>8)&0xff;
- spi_data[(idx<<2)+2] = (recv_data>>16)&0xff;
- spi_data[(idx<<2)+3] = (recv_data>>24)&0xff;
- idx++;
- }
-
- GPIO_OUTPUT_SET(0, 1);
- }
- if(regvalue&SPI_SLV_RD_BUF_DONE){
-
- GPIO_OUTPUT_SET(2, 0);
-
-
- }
-
- }else if(READ_PERI_REG(0x3ff00020)&BIT9){
- }
- }
- #ifdef SPI_SLAVE_DEBUG
- void ICACHE_FLASH_ATTR
- set_miso_data()
- {
- if(GPIO_INPUT_GET(2)==0){
- WRITE_PERI_REG(SPI_W8(HSPI),0x05040302);
- WRITE_PERI_REG(SPI_W9(HSPI),0x09080706);
- WRITE_PERI_REG(SPI_W10(HSPI),0x0d0c0b0a);
- WRITE_PERI_REG(SPI_W11(HSPI),0x11100f0e);
- WRITE_PERI_REG(SPI_W12(HSPI),0x15141312);
- WRITE_PERI_REG(SPI_W13(HSPI),0x19181716);
- WRITE_PERI_REG(SPI_W14(HSPI),0x1d1c1b1a);
- WRITE_PERI_REG(SPI_W15(HSPI),0x21201f1e);
- GPIO_OUTPUT_SET(2, 1);
- }
- }
- void ICACHE_FLASH_ATTR
- disp_spi_data()
- {
- uint8 i = 0;
- for(i=0;i<32;i++){
- os_printf("data %d : 0x%02x\n\r",i,spi_data[i]);
- }
-
- }
- void ICACHE_FLASH_ATTR
- spi_task(os_event_t *e)
- {
- uint8 data;
- switch(e->sig){
- case MOSI:
- disp_spi_data();
- break;
- case STATUS_R_IN_WR :
- os_printf("SR ERR in WRPR,Reg:%08x \n",e->par);
- break;
- case STATUS_W:
- os_printf("SW ERR,Reg:%08x\n",e->par);
- break;
- case TR_DONE_ALONE:
- os_printf("TD ALO ERR,Reg:%08x\n",e->par);
- break;
- case WR_RD:
- os_printf("WR&RD ERR,Reg:%08x\n",e->par);
- break;
- case DATA_ERROR:
- os_printf("Data ERR,Reg:%08x\n",e->par);
- break;
- case STATUS_R_IN_RD :
- os_printf("SR ERR in RDPR,Reg:%08x\n",e->par);
- break;
- default:
- break;
- }
- }
- void ICACHE_FLASH_ATTR
- spi_task_init(void)
- {
- spiQueue = (os_event_t*)os_malloc(sizeof(os_event_t)*SPI_QUEUE_LEN);
- system_os_task(spi_task,USER_TASK_PRIO_1,spiQueue,SPI_QUEUE_LEN);
- }
- os_timer_t spi_timer_test;
- void ICACHE_FLASH_ATTR
- spi_test_init()
- {
- os_printf("spi init\n\r");
- spi_slave_init(HSPI);
- os_printf("gpio init\n\r");
- gpio_init();
- os_printf("spi task init \n\r");
- spi_task_init();
- #ifdef SPI_MISO
- os_printf("spi miso init\n\r");
- set_miso_data();
- #endif
-
-
-
-
- }
- #endif
|