spi_interface.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  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. /**
  25. * @file spi_interface.c
  26. * @brief Defines and Macros for the SPI.
  27. */
  28. #include "driver/spi_interface.h"
  29. #include "osapi.h"
  30. #include "ets_sys.h"
  31. //*****************************************************************************
  32. //
  33. // Make sure all of the definitions in this header have a C binding.
  34. //
  35. //*****************************************************************************
  36. #ifdef __cplusplus
  37. extern "C"
  38. {
  39. #endif
  40. /**
  41. * @brief Based on pAttr initialize SPI module.
  42. *
  43. */
  44. void ICACHE_FLASH_ATTR SPIInit(SpiNum spiNum, SpiAttr* pAttr)
  45. {
  46. if ((spiNum > SpiNum_HSPI)
  47. || (NULL == pAttr)) {
  48. return;
  49. }
  50. // SPI_CPOL & SPI_CPHA
  51. switch (pAttr->subMode) {
  52. case SpiSubMode_1:
  53. CLEAR_PERI_REG_MASK(SPI_PIN(spiNum), SPI_IDLE_EDGE);
  54. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_CK_OUT_EDGE); // CHPA_FALLING_EDGE_SAMPLE
  55. break;
  56. case SpiSubMode_2:
  57. SET_PERI_REG_MASK(SPI_PIN(spiNum), SPI_IDLE_EDGE);
  58. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_CK_OUT_EDGE); // CHPA_FALLING_EDGE_SAMPLE
  59. break;
  60. case SpiSubMode_3:
  61. SET_PERI_REG_MASK(SPI_PIN(spiNum), SPI_IDLE_EDGE);
  62. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_CK_OUT_EDGE);
  63. break;
  64. case SpiSubMode_0:
  65. default:
  66. CLEAR_PERI_REG_MASK(SPI_PIN(spiNum), SPI_IDLE_EDGE);
  67. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_CK_OUT_EDGE);
  68. // To do nothing
  69. break;
  70. }
  71. // SPI bit order
  72. if (SpiBitOrder_MSBFirst == pAttr->bitOrder) {
  73. CLEAR_PERI_REG_MASK(SPI_CTRL(spiNum), SPI_WR_BIT_ORDER);
  74. CLEAR_PERI_REG_MASK(SPI_CTRL(spiNum), SPI_RD_BIT_ORDER);
  75. } else if (SpiBitOrder_LSBFirst == pAttr->bitOrder) {
  76. SET_PERI_REG_MASK(SPI_CTRL(spiNum), SPI_WR_BIT_ORDER);
  77. SET_PERI_REG_MASK(SPI_CTRL(spiNum), SPI_RD_BIT_ORDER);
  78. } else {
  79. // To do nothing
  80. }
  81. // Disable flash operation mode
  82. // As earlier as better, if not SPI_CTRL2 can not to be set delay cycles.
  83. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_FLASH_MODE);
  84. // SPI mode type
  85. if (SpiMode_Master == pAttr->mode) {
  86. // SPI mode type
  87. CLEAR_PERI_REG_MASK(SPI_SLAVE(spiNum), SPI_SLAVE_MODE);
  88. // SPI Send buffer
  89. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MISO_HIGHPART );// By default slave send buffer C0-C7
  90. // SPI Speed
  91. if (1 < (pAttr->speed)) {
  92. uint8 i, k;
  93. i = (pAttr->speed / 40) ? (pAttr->speed / 40) : 1;
  94. k = pAttr->speed / i;
  95. CLEAR_PERI_REG_MASK(SPI_CLOCK(spiNum), SPI_CLK_EQU_SYSCLK);
  96. WRITE_PERI_REG(SPI_CLOCK(spiNum),
  97. (((i - 1) & SPI_CLKDIV_PRE) << SPI_CLKDIV_PRE_S) |
  98. (((k - 1) & SPI_CLKCNT_N) << SPI_CLKCNT_N_S) |
  99. ((((k + 1) / 2 - 1) & SPI_CLKCNT_H) << SPI_CLKCNT_H_S) |
  100. (((k - 1) & SPI_CLKCNT_L) << SPI_CLKCNT_L_S)); //clear bit 31,set SPI clock div
  101. } else {
  102. WRITE_PERI_REG(SPI_CLOCK(spiNum), SPI_CLK_EQU_SYSCLK); // 80Mhz speed
  103. }
  104. // By default format:CMD+ADDR+DATA
  105. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_CS_SETUP | SPI_CS_HOLD | SPI_USR_MOSI );
  106. //delay num
  107. SET_PERI_REG_MASK(SPI_CTRL2(spiNum), ((0x1 & SPI_MISO_DELAY_NUM) << SPI_MISO_DELAY_NUM_S));
  108. } else if (SpiMode_Slave == pAttr->mode) {
  109. // BIT19 must do
  110. SET_PERI_REG_MASK(SPI_PIN(spiNum), BIT19);
  111. // SPI mode type
  112. SET_PERI_REG_MASK(SPI_SLAVE(spiNum), SPI_SLAVE_MODE);
  113. // SPI Send buffer
  114. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MISO_HIGHPART);// By default slave send buffer C8-C15
  115. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MOSI);
  116. // If do not set delay cycles, slave not working,master cann't get the data.
  117. SET_PERI_REG_MASK(SPI_CTRL2(spiNum), ((0x1 & SPI_MOSI_DELAY_NUM) << SPI_MOSI_DELAY_NUM_S)); //delay num
  118. // SPI Speed
  119. WRITE_PERI_REG(SPI_CLOCK(spiNum), 0);
  120. // By default format::CMD(8bits)+ADDR(8bits)+DATA(32bytes).
  121. SET_PERI_REG_BITS(SPI_USER2(spiNum), SPI_USR_COMMAND_BITLEN,
  122. 7, SPI_USR_COMMAND_BITLEN_S);
  123. SET_PERI_REG_BITS(SPI_SLAVE1(spiNum), SPI_SLV_WR_ADDR_BITLEN,
  124. 7, SPI_SLV_WR_ADDR_BITLEN_S);
  125. SET_PERI_REG_BITS(SPI_SLAVE1(spiNum), SPI_SLV_RD_ADDR_BITLEN,
  126. 7, SPI_SLV_RD_ADDR_BITLEN_S);
  127. SET_PERI_REG_BITS(SPI_SLAVE1(spiNum), SPI_SLV_BUF_BITLEN,
  128. (32 * 8 - 1), SPI_SLV_BUF_BITLEN_S);
  129. // For 8266 work on slave mode.
  130. SET_PERI_REG_BITS(SPI_SLAVE1(spiNum), SPI_SLV_STATUS_BITLEN,
  131. 7, SPI_SLV_STATUS_BITLEN_S);
  132. } else {
  133. // To do nothing
  134. }
  135. //clear Daul or Quad lines transmission mode
  136. CLEAR_PERI_REG_MASK(SPI_CTRL(spiNum), SPI_QIO_MODE | SPI_DIO_MODE | SPI_DOUT_MODE | SPI_QOUT_MODE);
  137. // Clear the data buffer.
  138. uint8 i;
  139. uint32 regAddr = REG_SPI_BASE(spiNum) + 0x40;
  140. for (i = 0; i < 16; ++i) {
  141. WRITE_PERI_REG(regAddr, 0);
  142. regAddr += 4;
  143. }
  144. }
  145. /**
  146. * @brief Set address value by master mode.
  147. *
  148. */
  149. void ICACHE_FLASH_ATTR SPIMasterCfgAddr(SpiNum spiNum, uint32_t addr)
  150. {
  151. if (spiNum > SpiNum_HSPI) {
  152. return;
  153. }
  154. // Set address
  155. WRITE_PERI_REG(SPI_ADDR(spiNum), addr);
  156. }
  157. /**
  158. * @brief Set command value by master mode.
  159. *
  160. */
  161. void ICACHE_FLASH_ATTR SPIMasterCfgCmd(SpiNum spiNum, uint32_t cmd)
  162. {
  163. if (spiNum > SpiNum_HSPI) {
  164. return;
  165. }
  166. // SPI_USER2 bit28-31 is cmd length,cmd bit length is value(0-15)+1,
  167. // bit15-0 is cmd value.
  168. SET_PERI_REG_BITS(SPI_USER2(spiNum), SPI_USR_COMMAND_VALUE, cmd, SPI_USR_COMMAND_VALUE_S);
  169. }
  170. /**
  171. * @brief Send data to slave.
  172. *
  173. */
  174. int ICACHE_FLASH_ATTR SPIMasterSendData(SpiNum spiNum, SpiData* pInData)
  175. {
  176. char idx = 0;
  177. if ((spiNum > SpiNum_HSPI)
  178. || (NULL == pInData)
  179. || (64 < pInData->dataLen)) {
  180. return -1;
  181. }
  182. uint32_t *value = pInData->data;
  183. while (READ_PERI_REG(SPI_CMD(spiNum))&SPI_USR);
  184. // Set command by user.
  185. if (pInData->cmdLen != 0) {
  186. // Max command length 16 bits.
  187. SET_PERI_REG_BITS(SPI_USER2(spiNum), SPI_USR_COMMAND_BITLEN,
  188. ((pInData->cmdLen << 3) - 1), SPI_USR_COMMAND_BITLEN_S);
  189. // Enable command
  190. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_COMMAND);
  191. // Load command
  192. SPIMasterCfgCmd(spiNum, pInData->cmd);
  193. } else {
  194. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_COMMAND);
  195. SET_PERI_REG_BITS(SPI_USER2(spiNum), SPI_USR_COMMAND_BITLEN,
  196. 0, SPI_USR_COMMAND_BITLEN_S);
  197. }
  198. // Set Address by user.
  199. if (pInData->addrLen == 0) {
  200. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_ADDR);
  201. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_ADDR_BITLEN,
  202. 0, SPI_USR_ADDR_BITLEN_S);
  203. } else {
  204. if (NULL == pInData->addr) {
  205. return -1;
  206. }
  207. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_ADDR_BITLEN,
  208. ((pInData->addrLen << 3) - 1), SPI_USR_ADDR_BITLEN_S);
  209. // Enable address
  210. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_ADDR);
  211. // Load address
  212. SPIMasterCfgAddr(spiNum, *pInData->addr);
  213. }
  214. // Set data by user.
  215. if (pInData->dataLen != 0) {
  216. if (NULL == value) {
  217. return -1;
  218. }
  219. // Enable MOSI
  220. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MOSI);
  221. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MISO);
  222. // Load send buffer
  223. do {
  224. WRITE_PERI_REG((SPI_W0(spiNum) + (idx << 2)), *value++);
  225. } while (++idx < ((pInData->dataLen / 4) + ((pInData->dataLen % 4) ? 1 : 0)));
  226. // Set data send buffer length.Max data length 64 bytes.
  227. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_MOSI_BITLEN, ((pInData->dataLen << 3) - 1), SPI_USR_MOSI_BITLEN_S);
  228. } else {
  229. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MOSI);
  230. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_MOSI_BITLEN,
  231. 0, SPI_USR_MOSI_BITLEN_S);
  232. }
  233. // Start send data
  234. SET_PERI_REG_MASK(SPI_CMD(spiNum), SPI_USR);
  235. // Wait for transmit done
  236. while (!(READ_PERI_REG(SPI_SLAVE(spiNum))&SPI_TRANS_DONE));
  237. CLEAR_PERI_REG_MASK(SPI_SLAVE(spiNum), SPI_TRANS_DONE);
  238. return 0;
  239. }
  240. /**
  241. * @brief Receive data from slave.
  242. *
  243. */
  244. int ICACHE_FLASH_ATTR SPIMasterRecvData(SpiNum spiNum, SpiData* pOutData)
  245. {
  246. char idx = 0;
  247. if ((spiNum > SpiNum_HSPI)
  248. || (NULL == pOutData)) {
  249. return -1;
  250. }
  251. uint32_t *value = pOutData->data;
  252. while (READ_PERI_REG(SPI_CMD(spiNum))&SPI_USR);
  253. // Set command by user.
  254. if (pOutData->cmdLen != 0) {
  255. // Max command length 16 bits.
  256. SET_PERI_REG_BITS(SPI_USER2(spiNum), SPI_USR_COMMAND_BITLEN,
  257. ((pOutData->cmdLen << 3) - 1), SPI_USR_COMMAND_BITLEN_S);
  258. // Enable command
  259. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_COMMAND);
  260. // Load command
  261. SPIMasterCfgCmd(spiNum, pOutData->cmd);
  262. } else {
  263. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_COMMAND);
  264. SET_PERI_REG_BITS(SPI_USER2(spiNum), SPI_USR_COMMAND_BITLEN,
  265. 0, SPI_USR_COMMAND_BITLEN_S);
  266. }
  267. // Set Address by user.
  268. if (pOutData->addrLen == 0) {
  269. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_ADDR);
  270. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_ADDR_BITLEN,
  271. 0, SPI_USR_ADDR_BITLEN_S);
  272. } else {
  273. if (NULL == pOutData->addr) {
  274. return -1;
  275. }
  276. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_ADDR_BITLEN,
  277. ((pOutData->addrLen << 3) - 1), SPI_USR_ADDR_BITLEN_S);
  278. // Enable address
  279. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_ADDR);
  280. // Load address
  281. SPIMasterCfgAddr(spiNum, *pOutData->addr);
  282. }
  283. // Set data by user.
  284. if (pOutData->dataLen != 0) {
  285. if (NULL == value) {
  286. return -1;
  287. }
  288. // Clear MOSI enable
  289. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MOSI);
  290. // Enable MOSI
  291. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MISO);
  292. // Set data send buffer length.Max data length 64 bytes.
  293. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_MISO_BITLEN, ((pOutData->dataLen << 3) - 1), SPI_USR_MISO_BITLEN_S);
  294. } else {
  295. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MOSI);
  296. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MISO);
  297. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_MISO_BITLEN,
  298. 0, SPI_USR_MISO_BITLEN_S);
  299. }
  300. // Start send data
  301. SET_PERI_REG_MASK(SPI_CMD(spiNum), SPI_USR);
  302. while (READ_PERI_REG(SPI_CMD(spiNum))&SPI_USR);
  303. // Read data out
  304. do {
  305. *value++ = READ_PERI_REG(SPI_W0(spiNum) + (idx << 2));
  306. } while (++idx < ((pOutData->dataLen / 4) + ((pOutData->dataLen % 4) ? 1 : 0)));
  307. return 0;
  308. }
  309. /**
  310. * @brief Load data to send buffer by slave mode.
  311. *
  312. */
  313. int ICACHE_FLASH_ATTR SPISlaveSendData(SpiNum spiNum, uint32_t *pInData, uint8_t inLen)
  314. {
  315. if (NULL == pInData) {
  316. return -1;
  317. }
  318. uint32_t *value = pInData;
  319. char i;
  320. for (i = 0; i < inLen; ++i) {
  321. WRITE_PERI_REG((SPI_W8(spiNum) + (i << 2)), *value++);
  322. }
  323. // Enable slave transmission liston
  324. SET_PERI_REG_MASK(SPI_CMD(spiNum), SPI_USR);
  325. return 0;
  326. }
  327. /**
  328. * @brief Configurate slave prepare for receive data.
  329. *
  330. */
  331. int ICACHE_FLASH_ATTR SPISlaveRecvData(SpiNum spiNum)
  332. {
  333. if ((spiNum > SpiNum_HSPI)) {
  334. return -1;
  335. }
  336. // Enable slave transmission liston
  337. SET_PERI_REG_MASK(SPI_CMD(spiNum), SPI_USR);
  338. return 0;
  339. }
  340. /**
  341. * @brief Send data to slave(ESP8266 register of RD_STATUS or WR_STATUS).
  342. *
  343. */
  344. void ICACHE_FLASH_ATTR SPIMasterSendStatus(SpiNum spiNum, uint8_t data)
  345. {
  346. if (spiNum > SpiNum_HSPI) {
  347. return;
  348. }
  349. while (READ_PERI_REG(SPI_CMD(spiNum))&SPI_USR);
  350. // Enable MOSI
  351. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MOSI);
  352. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MISO | SPI_USR_DUMMY | SPI_USR_ADDR);
  353. // 8bits cmd, 0x04 is eps8266 slave write cmd value
  354. WRITE_PERI_REG(SPI_USER2(spiNum),
  355. ((7 & SPI_USR_COMMAND_BITLEN) << SPI_USR_COMMAND_BITLEN_S)
  356. | MASTER_WRITE_STATUS_TO_SLAVE_CMD);
  357. // Set data send buffer length.
  358. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_MOSI_BITLEN,
  359. ((sizeof(data) << 3) - 1), SPI_USR_MOSI_BITLEN_S);
  360. WRITE_PERI_REG(SPI_W0(spiNum), (uint32)(data));
  361. // Start SPI
  362. SET_PERI_REG_MASK(SPI_CMD(spiNum), SPI_USR);
  363. }
  364. /**
  365. * @brief Receive status register from slave(ESP8266).
  366. *
  367. */
  368. int ICACHE_FLASH_ATTR SPIMasterRecvStatus(SpiNum spiNum)
  369. {
  370. if (spiNum > SpiNum_HSPI) {
  371. return -1;
  372. }
  373. while (READ_PERI_REG(SPI_CMD(spiNum))&SPI_USR);
  374. // Enable MISO
  375. SET_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MISO);
  376. CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MOSI | SPI_USR_DUMMY | SPI_USR_ADDR);
  377. // 8bits cmd, 0x06 is eps8266 slave read status cmd value
  378. WRITE_PERI_REG(SPI_USER2(spiNum),
  379. ((7 & SPI_USR_COMMAND_BITLEN) << SPI_USR_COMMAND_BITLEN_S)
  380. | MASTER_READ_STATUS_FROM_SLAVE_CMD);
  381. // Set revcive buffer length.
  382. SET_PERI_REG_BITS(SPI_USER1(spiNum), SPI_USR_MISO_BITLEN,
  383. 7, SPI_USR_MISO_BITLEN_S);
  384. // start spi module.
  385. SET_PERI_REG_MASK(SPI_CMD(spiNum), SPI_USR);
  386. while (READ_PERI_REG(SPI_CMD(spiNum))&SPI_USR);
  387. uint8_t data = (uint8)(READ_PERI_REG(SPI_W0(spiNum)) & 0xff);
  388. return (uint8)(READ_PERI_REG(SPI_W0(spiNum)) & 0xff);
  389. }
  390. /**
  391. * @brief Select SPI CS pin.
  392. *
  393. */
  394. void ICACHE_FLASH_ATTR SPICsPinSelect(SpiNum spiNum, SpiPinCS pinCs)
  395. {
  396. if (spiNum > SpiNum_HSPI) {
  397. return;
  398. }
  399. // clear select
  400. SET_PERI_REG_BITS(SPI_PIN(spiNum), 3, 0, 0);
  401. SET_PERI_REG_MASK(SPI_PIN(spiNum), pinCs);
  402. }
  403. void SPIIntCfg(SpiNum spiNum, SpiIntInfo *pIntInfo)
  404. {
  405. if ((spiNum > SpiNum_HSPI)
  406. || (NULL == pIntInfo)) {
  407. return;
  408. }
  409. // Clear the interrupt source and disable all of the interrupt.
  410. CLEAR_PERI_REG_MASK(SPI_SLAVE(spiNum), 0x3FF);
  411. SPIIntEnable(spiNum, pIntInfo->src);
  412. os_printf("src=%x\r\n,isrFunc=%x", (pIntInfo->src << 5), pIntInfo->isrFunc);
  413. //
  414. ETS_SPI_INTR_ATTACH(pIntInfo->isrFunc, NULL);
  415. // Enable isr
  416. ETS_SPI_INTR_ENABLE();
  417. }
  418. /**
  419. * @brief Enable SPI interrupt source.
  420. *
  421. */
  422. void ICACHE_FLASH_ATTR SPIIntEnable(SpiNum spiNum, SpiIntSrc intSrc)
  423. {
  424. if (spiNum > SpiNum_HSPI) {
  425. return;
  426. }
  427. SET_PERI_REG_MASK(SPI_SLAVE(spiNum), (intSrc << 5));
  428. }
  429. /**
  430. * @brief Disable SPI interrupt source.
  431. *
  432. */
  433. void ICACHE_FLASH_ATTR SPIIntDisable(SpiNum spiNum, SpiIntSrc intSrc)
  434. {
  435. if (spiNum > SpiNum_HSPI) {
  436. return;
  437. }
  438. CLEAR_PERI_REG_MASK(SPI_SLAVE(spiNum), intSrc);
  439. }
  440. /**
  441. * @brief Clear all of SPI interrupt source.
  442. *
  443. */
  444. void ICACHE_FLASH_ATTR SPIIntClear(SpiNum spiNum)
  445. {
  446. if (spiNum > SpiNum_HSPI) {
  447. return;
  448. }
  449. CLEAR_PERI_REG_MASK(SPI_SLAVE(spiNum), SpiIntSrc_TransDone
  450. | SpiIntSrc_WrStaDone
  451. | SpiIntSrc_RdStaDone
  452. | SpiIntSrc_WrBufDone
  453. | SpiIntSrc_RdBufDone);
  454. }
  455. #ifdef __cplusplus
  456. }
  457. #endif