spi.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. /*
  2. * ESPRSSIF MIT License
  3. *
  4. * Copyright (c) 2016 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
  5. *
  6. * Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
  7. * it is free of charge, to any person obtaining a copy of this software and associated
  8. * documentation files (the "Software"), to deal in the Software without restriction, including
  9. * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the Software is furnished
  11. * to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in all copies or
  14. * substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  18. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  19. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  20. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22. *
  23. */
  24. #include "driver/spi.h"
  25. #include "driver/spi_overlap.h"
  26. #define CACHE_FLASH_CTRL_REG 0x3ff0000C
  27. #define CACHE_FLUSH_START_BIT BIT0
  28. #define CACHE_EMPTY_FLAG_BIT BIT1
  29. /******************************************************************************
  30. * FunctionName : cache_flush
  31. * Description : clear all the cpu cache data for stability test.
  32. *******************************************************************************/
  33. void cache_flush(void)
  34. {
  35. while(READ_PERI_REG(CACHE_FLASH_CTRL_REG)&CACHE_EMPTY_FLAG_BIT) {
  36. CLEAR_PERI_REG_MASK(CACHE_FLASH_CTRL_REG, CACHE_FLUSH_START_BIT);
  37. SET_PERI_REG_MASK(CACHE_FLASH_CTRL_REG, CACHE_FLUSH_START_BIT);
  38. }
  39. while(!(READ_PERI_REG(CACHE_FLASH_CTRL_REG)&CACHE_EMPTY_FLAG_BIT));
  40. CLEAR_PERI_REG_MASK(CACHE_FLASH_CTRL_REG, CACHE_FLUSH_START_BIT);
  41. }
  42. /******************************************************************************
  43. * FunctionName : spi_master_init
  44. * Description : SPI master initial function for common byte units transmission
  45. * Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
  46. *******************************************************************************/
  47. void ICACHE_FLASH_ATTR
  48. spi_master_init(uint8 spi_no)
  49. {
  50. uint32 regvalue;
  51. if(spi_no>1) return; //handle invalid input number
  52. SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND);
  53. CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);
  54. WRITE_PERI_REG(SPI_CLOCK(spi_no),
  55. ((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
  56. ((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
  57. ((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); //clear bit 31,set SPI clock div
  58. }
  59. /******************************************************************************
  60. * FunctionName : spi_lcd_9bit_write
  61. * Description : SPI 9bits transmission function for driving LCD TM035PDZV36
  62. * Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
  63. * uint8 high_bit - first high bit of the data, 0 is for "0",the other value 1-255 is for "1"
  64. * uint8 low_8bit- the rest 8bits of the data.
  65. *******************************************************************************/
  66. void ICACHE_FLASH_ATTR
  67. spi_lcd_9bit_write(uint8 spi_no,uint8 high_bit,uint8 low_8bit)
  68. {
  69. uint32 regvalue;
  70. uint8 bytetemp;
  71. if(spi_no>1) return; //handle invalid input number
  72. if(high_bit) bytetemp=(low_8bit>>1)|0x80;
  73. else bytetemp=(low_8bit>>1)&0x7f;
  74. regvalue= ((8&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|((uint32)bytetemp); //configure transmission variable,9bit transmission length and first 8 command bit
  75. if(low_8bit&0x01) regvalue|=BIT15; //write the 9th bit
  76. while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR); //waiting for spi module available
  77. WRITE_PERI_REG(SPI_USER2(spi_no), regvalue); //write command and command length into spi reg
  78. SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR); //transmission start
  79. // while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
  80. }
  81. /******************************************************************************
  82. * FunctionName : spi_mast_byte_write
  83. * Description : SPI master 1 byte transmission function
  84. * Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
  85. * uint8 data- transmitted data
  86. *******************************************************************************/
  87. void ICACHE_FLASH_ATTR
  88. spi_mast_byte_write(uint8 spi_no,uint8 data)
  89. {
  90. uint32 regvalue;
  91. if(spi_no>1) return; //handle invalid input number
  92. while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
  93. CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MOSI|SPI_USR_MISO);
  94. //SPI_FLASH_USER2 bit28-31 is cmd length,cmd bit length is value(0-15)+1,
  95. // bit15-0 is cmd value.
  96. WRITE_PERI_REG(SPI_USER2(spi_no),
  97. ((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|((uint32)data));
  98. SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
  99. while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
  100. }
  101. /******************************************************************************
  102. * FunctionName : spi_byte_write_espslave
  103. * Description : SPI master 1 byte transmission function for esp8266 slave,
  104. * transmit 1byte data to esp8266 slave buffer needs 16bit transmission ,
  105. * first byte is command 0x04 to write slave buffer, second byte is data
  106. * Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
  107. * uint8 data- transmitted data
  108. *******************************************************************************/
  109. void ICACHE_FLASH_ATTR
  110. spi_byte_write_espslave(uint8 spi_no,uint8 data)
  111. {
  112. uint32 regvalue;
  113. if(spi_no>1) return; //handle invalid input number
  114. while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
  115. SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MOSI);
  116. CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MISO|SPI_USR_ADDR|SPI_USR_DUMMY);
  117. //SPI_FLASH_USER2 bit28-31 is cmd length,cmd bit length is value(0-15)+1,
  118. // bit15-0 is cmd value.
  119. //0x70000000 is for 8bits cmd, 0x04 is eps8266 slave write cmd value
  120. WRITE_PERI_REG(SPI_USER2(spi_no),
  121. ((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|4);
  122. WRITE_PERI_REG(SPI_W0(spi_no), (uint32)(data));
  123. SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
  124. }
  125. /******************************************************************************
  126. * FunctionName : spi_byte_read_espslave
  127. * Description : SPI master 1 byte read function for esp8266 slave,
  128. * read 1byte data from esp8266 slave buffer needs 16bit transmission ,
  129. * first byte is command 0x06 to read slave buffer, second byte is recieved data
  130. * Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
  131. * uint8* data- recieved data address
  132. *******************************************************************************/
  133. void ICACHE_FLASH_ATTR
  134. spi_byte_read_espslave(uint8 spi_no,uint8 *data)
  135. {
  136. uint32 regvalue;
  137. if(spi_no>1) return; //handle invalid input number
  138. while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
  139. SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MISO);
  140. CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MOSI|SPI_USR_ADDR|SPI_USR_DUMMY);
  141. //SPI_FLASH_USER2 bit28-31 is cmd length,cmd bit length is value(0-15)+1,
  142. // bit15-0 is cmd value.
  143. //0x70000000 is for 8bits cmd, 0x06 is eps8266 slave read cmd value
  144. WRITE_PERI_REG(SPI_USER2(spi_no),
  145. ((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|6);
  146. SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
  147. while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
  148. *data=(uint8)(READ_PERI_REG(SPI_W0(spi_no))&0xff);
  149. }
  150. /******************************************************************************
  151. * FunctionName : spi_slave_init
  152. * Description : SPI slave mode initial funtion, including mode setting,
  153. * IO setting, transmission interrupt opening, interrupt function registration
  154. * Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
  155. * uint8 data_len - read&write data pack length,using byte as unit,the range is 1-32
  156. *******************************************************************************/
  157. void ICACHE_FLASH_ATTR
  158. spi_slave_init(uint8 spi_no,uint8 data_len)
  159. {
  160. uint32 regvalue;
  161. uint32 data_bit_len;
  162. if(spi_no>1)
  163. return; //handle invalid input number
  164. if(data_len<=1) data_bit_len=7;
  165. else if(data_len>=32) data_bit_len=0xff;
  166. else data_bit_len=(data_len<<3)-1;
  167. //clear bit9,bit8 of reg PERIPHS_IO_MUX
  168. //bit9 should be cleared when HSPI clock doesn't equal CPU clock
  169. //bit8 should be cleared when SPI clock doesn't equal CPU clock
  170. ////WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105); //clear bit9//TEST
  171. if(spi_no==SPI){
  172. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, 1);//configure io to spi mode
  173. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, 1);//configure io to spi mode
  174. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, 1);//configure io to spi mode
  175. PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, 1);//configure io to spi mode
  176. }else if(spi_no==HSPI){
  177. PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode
  178. PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode
  179. PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode
  180. PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode
  181. }
  182. //regvalue=READ_PERI_REG(SPI_FLASH_SLAVE(spi_no));
  183. //slave mode,slave use buffers which are register "SPI_FLASH_C0~C15", enable trans done isr
  184. //set bit 30 bit 29 bit9,bit9 is trans done isr mask
  185. SET_PERI_REG_MASK( SPI_SLAVE(spi_no),
  186. SPI_SLAVE_MODE|SPI_SLV_WR_RD_BUF_EN|
  187. SPI_SLV_WR_BUF_DONE_EN|SPI_SLV_RD_BUF_DONE_EN|
  188. SPI_SLV_WR_STA_DONE_EN|SPI_SLV_RD_STA_DONE_EN|
  189. SPI_TRANS_DONE_EN);
  190. //disable general trans intr
  191. //CLEAR_PERI_REG_MASK(SPI_SLAVE(spi_no),SPI_TRANS_DONE_EN);
  192. CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);//disable flash operation mode
  193. SET_PERI_REG_MASK(SPI_USER(spi_no),SPI_USR_MISO_HIGHPART);//SLAVE SEND DATA BUFFER IN C8-C15
  194. //////**************RUN WHEN SLAVE RECIEVE*******************///////
  195. //tow lines below is to configure spi timing.
  196. SET_PERI_REG_MASK(SPI_CTRL2(spi_no),(0x2&SPI_MOSI_DELAY_NUM)<<SPI_MOSI_DELAY_NUM_S) ;//delay num
  197. os_printf("SPI_CTRL2 is %08x\n",READ_PERI_REG(SPI_CTRL2(spi_no)));
  198. WRITE_PERI_REG(SPI_CLOCK(spi_no), 0);
  199. /////***************************************************//////
  200. //set 8 bit slave command length, because slave must have at least one bit addr,
  201. //8 bit slave+8bit addr, so master device first 2 bytes can be regarded as a command
  202. //and the following bytes are datas,
  203. //32 bytes input wil be stored in SPI_FLASH_C0-C7
  204. //32 bytes output data should be set to SPI_FLASH_C8-C15
  205. WRITE_PERI_REG(SPI_USER2(spi_no), (0x7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S); //0x70000000
  206. //set 8 bit slave recieve buffer length, the buffer is SPI_FLASH_C0-C7
  207. //set 8 bit slave status register, which is the low 8 bit of register "SPI_FLASH_STATUS"
  208. SET_PERI_REG_MASK(SPI_SLAVE1(spi_no), ((data_bit_len&SPI_SLV_BUF_BITLEN)<< SPI_SLV_BUF_BITLEN_S)|
  209. ((0x7&SPI_SLV_STATUS_BITLEN)<<SPI_SLV_STATUS_BITLEN_S)|
  210. ((0x7&SPI_SLV_WR_ADDR_BITLEN)<<SPI_SLV_WR_ADDR_BITLEN_S)|
  211. ((0x7&SPI_SLV_RD_ADDR_BITLEN)<<SPI_SLV_RD_ADDR_BITLEN_S));
  212. SET_PERI_REG_MASK(SPI_PIN(spi_no),BIT19);//BIT19
  213. //maybe enable slave transmission liston
  214. SET_PERI_REG_MASK(SPI_CMD(spi_no),SPI_USR);
  215. //register level2 isr function, which contains spi, hspi and i2s events
  216. ETS_SPI_INTR_ATTACH(spi_slave_isr_handler,NULL);
  217. //enable level2 isr, which contains spi, hspi and i2s events
  218. ETS_SPI_INTR_ENABLE();
  219. }
  220. /* =============================================================================================
  221. * code below is for spi slave r/w testcase with 2 r/w state lines connected to the spi master mcu
  222. * replace with your own process functions
  223. * find "add system_os_post here" in spi_slave_isr_handler.
  224. * =============================================================================================
  225. */
  226. #ifdef SPI_SLAVE_DEBUG
  227. /******************************************************************************
  228. * FunctionName : hspi_master_readwrite_repeat
  229. * Description : SPI master test function for reading and writing esp8266 slave buffer,
  230. the function uses HSPI module
  231. *******************************************************************************/
  232. os_timer_t timer2;
  233. void hspi_master_readwrite_repeat(void)
  234. {
  235. static uint8 data=0;
  236. uint8 temp;
  237. os_timer_disarm(&timer2);
  238. spi_byte_read_espslave(HSPI,&temp);
  239. temp++;
  240. spi_byte_write_espslave(HSPI,temp);
  241. os_timer_setfn(&timer2, (os_timer_func_t *)hspi_master_readwrite_repeat, NULL);
  242. os_timer_arm(&timer2, 500, 0);
  243. }
  244. #endif
  245. /******************************************************************************
  246. * FunctionName : spi_slave_isr_handler
  247. * Description : SPI interrupt function, SPI HSPI and I2S interrupt can trig this function
  248. some basic operation like clear isr flag has been done,
  249. and it is availible for adding user coder in the funtion
  250. * Parameters : void *para- function parameter address, which has been registered in function spi_slave_init
  251. *******************************************************************************/
  252. #include "gpio.h"
  253. #include "user_interface.h"
  254. #include "mem.h"
  255. static uint8 spi_data[32] = {0};
  256. static uint8 idx = 0;
  257. static uint8 spi_flg = 0;
  258. #define SPI_MISO
  259. #define SPI_QUEUE_LEN 8
  260. os_event_t * spiQueue;
  261. #define MOSI 0
  262. #define MISO 1
  263. #define STATUS_R_IN_WR 2
  264. #define STATUS_W 3
  265. #define TR_DONE_ALONE 4
  266. #define WR_RD 5
  267. #define DATA_ERROR 6
  268. #define STATUS_R_IN_RD 7
  269. //init the two intr line of slave
  270. //gpio0: wr_ready ,and
  271. //gpio2: rd_ready , controlled by slave
  272. void ICACHE_FLASH_ATTR
  273. gpio_init()
  274. {
  275. PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
  276. PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
  277. //PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
  278. GPIO_OUTPUT_SET(0, 1);
  279. GPIO_OUTPUT_SET(2, 0);
  280. //GPIO_OUTPUT_SET(4, 1);
  281. }
  282. void spi_slave_isr_handler(void *para)
  283. {
  284. uint32 regvalue,calvalue;
  285. static uint8 state =0;
  286. uint32 recv_data,send_data;
  287. if(READ_PERI_REG(0x3ff00020)&BIT4){
  288. //following 3 lines is to clear isr signal
  289. CLEAR_PERI_REG_MASK(SPI_SLAVE(SPI), 0x3ff);
  290. }else if(READ_PERI_REG(0x3ff00020)&BIT7){ //bit7 is for hspi isr,
  291. regvalue=READ_PERI_REG(SPI_SLAVE(HSPI));
  292. CLEAR_PERI_REG_MASK(SPI_SLAVE(HSPI),
  293. SPI_TRANS_DONE_EN|
  294. SPI_SLV_WR_STA_DONE_EN|
  295. SPI_SLV_RD_STA_DONE_EN|
  296. SPI_SLV_WR_BUF_DONE_EN|
  297. SPI_SLV_RD_BUF_DONE_EN);
  298. SET_PERI_REG_MASK(SPI_SLAVE(HSPI), SPI_SYNC_RESET);
  299. CLEAR_PERI_REG_MASK(SPI_SLAVE(HSPI),
  300. SPI_TRANS_DONE|
  301. SPI_SLV_WR_STA_DONE|
  302. SPI_SLV_RD_STA_DONE|
  303. SPI_SLV_WR_BUF_DONE|
  304. SPI_SLV_RD_BUF_DONE);
  305. SET_PERI_REG_MASK(SPI_SLAVE(HSPI),
  306. SPI_TRANS_DONE_EN|
  307. SPI_SLV_WR_STA_DONE_EN|
  308. SPI_SLV_RD_STA_DONE_EN|
  309. SPI_SLV_WR_BUF_DONE_EN|
  310. SPI_SLV_RD_BUF_DONE_EN);
  311. if(regvalue&SPI_SLV_WR_BUF_DONE){
  312. GPIO_OUTPUT_SET(0, 0);
  313. idx=0;
  314. while(idx<8){
  315. recv_data=READ_PERI_REG(SPI_W0(HSPI)+(idx<<2));
  316. spi_data[idx<<2] = recv_data&0xff;
  317. spi_data[(idx<<2)+1] = (recv_data>>8)&0xff;
  318. spi_data[(idx<<2)+2] = (recv_data>>16)&0xff;
  319. spi_data[(idx<<2)+3] = (recv_data>>24)&0xff;
  320. idx++;
  321. }
  322. //add system_os_post here
  323. GPIO_OUTPUT_SET(0, 1);
  324. }
  325. if(regvalue&SPI_SLV_RD_BUF_DONE){
  326. //it is necessary to call GPIO_OUTPUT_SET(2, 1), when new data is preped in SPI_W8-15 and needs to be sended.
  327. GPIO_OUTPUT_SET(2, 0);
  328. //add system_os_post here
  329. //system_os_post(USER_TASK_PRIO_1,WR_RD,regvalue);
  330. }
  331. }else if(READ_PERI_REG(0x3ff00020)&BIT9){ //bit7 is for i2s isr,
  332. }
  333. }
  334. #ifdef SPI_SLAVE_DEBUG
  335. void ICACHE_FLASH_ATTR
  336. set_miso_data()
  337. {
  338. if(GPIO_INPUT_GET(2)==0){
  339. WRITE_PERI_REG(SPI_W8(HSPI),0x05040302);
  340. WRITE_PERI_REG(SPI_W9(HSPI),0x09080706);
  341. WRITE_PERI_REG(SPI_W10(HSPI),0x0d0c0b0a);
  342. WRITE_PERI_REG(SPI_W11(HSPI),0x11100f0e);
  343. WRITE_PERI_REG(SPI_W12(HSPI),0x15141312);
  344. WRITE_PERI_REG(SPI_W13(HSPI),0x19181716);
  345. WRITE_PERI_REG(SPI_W14(HSPI),0x1d1c1b1a);
  346. WRITE_PERI_REG(SPI_W15(HSPI),0x21201f1e);
  347. GPIO_OUTPUT_SET(2, 1);
  348. }
  349. }
  350. void ICACHE_FLASH_ATTR
  351. disp_spi_data()
  352. {
  353. uint8 i = 0;
  354. for(i=0;i<32;i++){
  355. os_printf("data %d : 0x%02x\n\r",i,spi_data[i]);
  356. }
  357. //os_printf("d31:0x%02x\n\r",spi_data[31]);
  358. }
  359. void ICACHE_FLASH_ATTR
  360. spi_task(os_event_t *e)
  361. {
  362. uint8 data;
  363. switch(e->sig){
  364. case MOSI:
  365. disp_spi_data();
  366. break;
  367. case STATUS_R_IN_WR :
  368. os_printf("SR ERR in WRPR,Reg:%08x \n",e->par);
  369. break;
  370. case STATUS_W:
  371. os_printf("SW ERR,Reg:%08x\n",e->par);
  372. break;
  373. case TR_DONE_ALONE:
  374. os_printf("TD ALO ERR,Reg:%08x\n",e->par);
  375. break;
  376. case WR_RD:
  377. os_printf("WR&RD ERR,Reg:%08x\n",e->par);
  378. break;
  379. case DATA_ERROR:
  380. os_printf("Data ERR,Reg:%08x\n",e->par);
  381. break;
  382. case STATUS_R_IN_RD :
  383. os_printf("SR ERR in RDPR,Reg:%08x\n",e->par);
  384. break;
  385. default:
  386. break;
  387. }
  388. }
  389. void ICACHE_FLASH_ATTR
  390. spi_task_init(void)
  391. {
  392. spiQueue = (os_event_t*)os_malloc(sizeof(os_event_t)*SPI_QUEUE_LEN);
  393. system_os_task(spi_task,USER_TASK_PRIO_1,spiQueue,SPI_QUEUE_LEN);
  394. }
  395. os_timer_t spi_timer_test;
  396. void ICACHE_FLASH_ATTR
  397. spi_test_init()
  398. {
  399. os_printf("spi init\n\r");
  400. spi_slave_init(HSPI);
  401. os_printf("gpio init\n\r");
  402. gpio_init();
  403. os_printf("spi task init \n\r");
  404. spi_task_init();
  405. #ifdef SPI_MISO
  406. os_printf("spi miso init\n\r");
  407. set_miso_data();
  408. #endif
  409. //os_timer_disarm(&spi_timer_test);
  410. //os_timer_setfn(&spi_timer_test, (os_timer_func_t *)set_miso_data, NULL);//wjl
  411. //os_timer_arm(&spi_timer_test,50,1);
  412. }
  413. #endif