HW_SPI_ATY.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /**
  2. * @file HW_SPI_ATY.c
  3. *
  4. * @param Project DEVICE_GENERAL_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2026 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief functions of SPI for C platform
  20. *
  21. * @version
  22. * - 1_01_221028 > ATY
  23. * -# Preliminary version, first Release
  24. * - 1_02_240111 > ATY
  25. * -# add multy addr and channel
  26. * -# add lock
  27. * - 1_03_251114 > ATY
  28. * -# remove delay
  29. * @todo all test
  30. ********************************************************************************
  31. */
  32. #ifndef __HW_SPI_ATY_C
  33. #define __HW_SPI_ATY_C
  34. #include "HW_SPI_ATY.h"
  35. /******************************* For user *************************************/
  36. /******************************************************************************/
  37. /**
  38. * @brief
  39. *
  40. * @param data_t
  41. * @param len
  42. * @param dev
  43. * @return uint8_t
  44. */
  45. uint8_t SPI_Write(uint8_t* data_t, uint16_t len, struct HW_SPI_ATY_Dev* dev)
  46. {
  47. if(dev->hardwareEnable == 1){
  48. uint8_t errCode = 0;
  49. __ATY_LOCK(dev);
  50. errCode = dev->spiProcess(data_t, len, __ATY_RW_W);
  51. __ATY_UNLOCK(dev);
  52. return errCode;
  53. }
  54. else{ __ATY_UNLOCK(dev); return 1; }
  55. }
  56. /**
  57. * @brief
  58. *
  59. * @param data_t
  60. * @param len
  61. * @param dev
  62. * @return uint8_t
  63. */
  64. uint8_t SPI_Read(uint8_t* data_t, uint16_t len, struct HW_SPI_ATY_Dev* dev)
  65. {
  66. if(dev->hardwareEnable == 1){
  67. uint8_t errCode = 0;
  68. __ATY_LOCK(dev);
  69. errCode = dev->spiProcess(data_t, len, __ATY_RW_R);
  70. __ATY_UNLOCK(dev);
  71. return errCode;
  72. }
  73. else{ __ATY_UNLOCK(dev); return 1; }
  74. }
  75. /**
  76. * @brief
  77. *
  78. * @param data_t
  79. * @param len
  80. * @param dev
  81. * @return uint8_t
  82. */
  83. uint8_t SPI_ReadWrite(uint8_t* data_t, uint16_t len, struct HW_SPI_ATY_Dev* dev)
  84. {
  85. if(dev->hardwareEnable == 1){
  86. uint8_t errCode = 0;
  87. __ATY_LOCK(dev);
  88. errCode = dev->spiProcess(data_t, len, _ATY_RW_RW);
  89. __ATY_UNLOCK(dev);
  90. return errCode;
  91. }
  92. else{ __ATY_UNLOCK(dev); return 1; }
  93. }
  94. #endif /* __HW_SPI_ATY_C */
  95. /************************************ etc *************************************/
  96. /* init */
  97. // // STM32 HAL
  98. // uint8_t SPI_1(uint8_t* data_t, uint8_t len, uint8_t rw){
  99. // if(rw == __ATY_RW_W)
  100. // return HAL_SPI_Transmit(&hspi2, (uint8_t*)data_t, len, 1000);
  101. // else if(rw == __ATY_RW_R)
  102. // return HAL_SPI_Receive(&hspi2, (uint8_t*)data_t, len, 1000);
  103. // else if(rw == _ATY_RW_RW)
  104. // return HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)data_t, (uint8_t*)data_t, len, 1000);
  105. // return 0;
  106. // }
  107. // // 51 // todo: not tested
  108. // uint8_t SPI_1(uint8_t* data_t, uint8_t len, uint8_t rw){
  109. // if(rw == __ATY_RW_W){
  110. // uint8_t i = 0;
  111. // uint16_t errCount = 1000;
  112. // SPCTL = 0xD4;
  113. // for(i = 0; i < len; i++)
  114. // {
  115. // SPSTAT |= 0xC0;
  116. // SPDAT = data_t[i];
  117. // while(((SPSTAT & 0x80) != 0x80) && errCount) errCount--;
  118. // if(errCount == 0) return 1; else errCount = 1000;
  119. // }
  120. // return 0;
  121. // }
  122. // else if(rw == __ATY_RW_R){
  123. // uint8_t i = 0;
  124. // uint16_t errCode = 1000;
  125. // SPCTL = 0xD4;
  126. // for(i = 0; i < len; i++)
  127. // {
  128. // SPSTAT |= 0xC0;
  129. // SPDAT = 0xFF;
  130. // while(((SPSTAT & 0x80) != 0x80) && errCode) errCode--;
  131. // if(errCount == 0) return 1; else errCount = 1000;
  132. // data_t[i] = SPDAT;
  133. // }
  134. // return 0;
  135. // }
  136. // else if(rw == _ATY_RW_RW){
  137. // uint8_t i = 0;
  138. // uint16_t errCount = 1000;
  139. // SPCTL = 0xD4;
  140. // SPSTAT |= 0xC0;
  141. // SPDAT = data_t[0];
  142. // while(((SPSTAT & 0x80) != 0x80) && errCount) errCount--;
  143. // if(errCount == 0) return 1; else errCount = 1000;
  144. // SPCTL = 0xD4;
  145. // for(i = 0; i < len; i++)
  146. // {
  147. // SPSTAT |= 0xC0;
  148. // SPDAT = 0xFF;
  149. // while(((SPSTAT & 0x80) != 0x80) && errCount) errCount--;
  150. // if(errCount == 0) return 1; else errCount = 1000;
  151. // data_t[i] = SPDAT;
  152. // }
  153. // return 0;
  154. // }
  155. // return 0;
  156. // }
  157. // // ESP8266_RTOS // todo: not tested
  158. // #include <stdio.h>
  159. // #include "freertos/FreeRTOS.h"
  160. // #include "freertos/task.h"
  161. // #include "freertos/queue.h"
  162. // #include "esp8266/gpio_struct.h"
  163. // #include "esp8266/spi_struct.h"
  164. // #include "esp_system.h"
  165. // #include "esp_log.h"
  166. // #include "esp_libc.h"
  167. // #include "driver/gpio.h"
  168. // #include "driver/spi.h"
  169. // static const char* TAG = "user_spi";
  170. // esp_err_t esp8266_spi_init(void)
  171. // {
  172. // ESP_LOGI(TAG, "init spi");
  173. // spi_config_t spi_config;
  174. // // Load default interface parameters
  175. // // CS_EN:1, MISO_EN:1, MOSI_EN:1, BYTE_TX_ORDER:1, BYTE_TX_ORDER:1, BIT_RX_ORDER:0, BIT_TX_ORDER:0, CPHA:0, CPOL:0
  176. // spi_config.interface.val = SPI_DEFAULT_INTERFACE;
  177. // // Load default interrupt enable
  178. // // TRANS_DONE: true, WRITE_STATUS: false, READ_STATUS: false, WRITE_BUFFER: false, READ_BUFFER: false
  179. // spi_config.intr_enable.val = SPI_MASTER_DEFAULT_INTR_ENABLE;
  180. // spi_config.interface.cs_en = 0;
  181. // spi_config.interface.mosi_en = 1;
  182. // spi_config.interface.miso_en = 1;
  183. // // Set SPI to master mode
  184. // // ESP8266 Only support half-duplex
  185. // spi_config.mode = SPI_MASTER_MODE;
  186. // // Set the SPI clock frequency division factor
  187. // spi_config.clk_div = SPI_2MHz_DIV;
  188. // spi_config.event_cb = NULL;
  189. // return spi_init(HSPI_HOST, &spi_config);
  190. // }
  191. // /**
  192. // * @brief
  193. // * @note use [ESP8266_RTOS_SDK](https://github.com/espressif/ESP8266_RTOS_SDK/)
  194. // */
  195. // // esp_err_t SPI_Write(uint8_t* data_t, uint16_t len)
  196. // uint8_t SPI_Write(uint8_t* data_t, uint16_t len)
  197. // {
  198. // spi_trans_t trans = {0};
  199. // trans.mosi = data;
  200. // trans.bits.mosi = len * 8;
  201. // return spi_trans(HSPI_HOST, &trans);
  202. // }
  203. // uint8_t SPI_Read(uint8_t* data_t, uint16_t len)
  204. // {
  205. // spi_trans_t trans;
  206. // memset(&trans, 0x0, sizeof(trans));
  207. // trans.bits.val = 0;
  208. // trans.miso = data_t;
  209. // trans.bits.miso = len * 8;
  210. // if(spi_trans(HSPI_HOST, &trans))
  211. // return 0;
  212. // return 1;
  213. // }
  214. // struct HW_SPI_ATY_Dev HW_SPI_ATY_Dev_1 = {
  215. // .hardwareEnable = 1,
  216. // .spiProcess = SPI_1,
  217. // .lock = __ATY_UNLOCKED
  218. // };
  219. /* use */
  220. // SPI_Write(data_t, len, &HW_SPI_ATY_Dev_1);
  221. // SPI_Read(data_t, len, &HW_SPI_ATY_Dev_1);
  222. // SPI_ReadWrite(data_t, len, &HW_SPI_ATY_Dev_1);
  223. /******************************************************************************/
  224. /******************************** End Of File *********************************/