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