HW_SPI_ATY.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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 - 2023 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. * -Undone: in soft
  25. ********************************************************************************
  26. */
  27. #ifndef __HW_SPI_ATY_C
  28. #define __HW_SPI_ATY_C
  29. #include "HW_SPI_ATY.h"
  30. /******************************* For user *************************************/
  31. /******************************************************************************/
  32. #ifndef __SPI_HARDWARE_ATY
  33. #else
  34. #if defined(__STC51_ATY)
  35. uint8_t SPI_Write(uint8_t* data_t, uint16_t len)
  36. {
  37. uint8_t i = 0;
  38. uint16_t errCount = 1000;
  39. SPCTL = 0xD4;
  40. for(i = 0; i < len; i++)
  41. {
  42. SPSTAT |= 0xC0;
  43. SPDAT = *(data_t + i);
  44. while(((SPSTAT & 0x80) != 0x80) && errCount)
  45. errCount--;
  46. if(errCount == 0)
  47. return 1;
  48. }
  49. return 0;
  50. }
  51. uint8_t SPI_Read(uint8_t* data_t, uint16_t len)
  52. {
  53. uint8_t i = 0;
  54. uint16_t errCode = 1000;
  55. SPCTL = 0xD4;
  56. for(i = 0; i < len; i++)
  57. {
  58. SPSTAT |= 0xC0;
  59. SPDAT = 0xFF;
  60. while(((SPSTAT & 0x80) != 0x80) && errCode)
  61. errCode--;
  62. if(errCode == 0)
  63. return 1;
  64. *(data_t + i) = SPDAT;
  65. }
  66. return 0;
  67. }
  68. #elif defined(__STM32_HAL_ATY)
  69. #include "spi.h"
  70. uint8_t SPI_Write(uint8_t* data_t, uint16_t len)
  71. {
  72. uint8_t i = 3;
  73. while(i--)
  74. {
  75. if(HAL_SPI_Transmit(&SPIH_N, (uint8_t *)data_t, len, 1000) == HAL_OK)
  76. return 0;
  77. }
  78. return 1;
  79. }
  80. uint8_t SPI_Read(uint8_t* data_t, uint16_t len)
  81. {
  82. uint8_t i = 3;
  83. while(i--)
  84. {
  85. if(HAL_SPI_Receive(&SPIH_N, (uint8_t *)data_t, len, 1000) == HAL_OK)
  86. return 0;
  87. }
  88. return 1;
  89. }
  90. #elif defined(__ESP8266_RTOS_ATY)
  91. #include <stdio.h>
  92. #include "freertos/FreeRTOS.h"
  93. #include "freertos/task.h"
  94. #include "freertos/queue.h"
  95. #include "esp8266/gpio_struct.h"
  96. #include "esp8266/spi_struct.h"
  97. #include "esp_system.h"
  98. #include "esp_log.h"
  99. #include "esp_libc.h"
  100. #include "driver/gpio.h"
  101. #include "driver/spi.h"
  102. static const char *TAG = "user_spi";
  103. esp_err_t esp8266_spi_init(void)
  104. {
  105. ESP_LOGI(TAG, "init spi");
  106. spi_config_t spi_config;
  107. // Load default interface parameters
  108. // 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
  109. spi_config.interface.val = SPI_DEFAULT_INTERFACE;
  110. // Load default interrupt enable
  111. // TRANS_DONE: true, WRITE_STATUS: false, READ_STATUS: false, WRITE_BUFFER: false, READ_BUFFER: false
  112. spi_config.intr_enable.val = SPI_MASTER_DEFAULT_INTR_ENABLE;
  113. spi_config.interface.cs_en = 0;
  114. spi_config.interface.mosi_en = 1;
  115. spi_config.interface.miso_en = 1;
  116. // Set SPI to master mode
  117. // ESP8266 Only support half-duplex
  118. spi_config.mode = SPI_MASTER_MODE;
  119. // Set the SPI clock frequency division factor
  120. spi_config.clk_div = SPI_2MHz_DIV;
  121. spi_config.event_cb = NULL;
  122. return spi_init(HSPI_HOST, &spi_config);
  123. }
  124. /**
  125. * @brief
  126. * @note use [ESP8266_RTOS_SDK](https://github.com/espressif/ESP8266_RTOS_SDK/)
  127. */
  128. // esp_err_t SPI_Write(uint8_t* data_t, uint16_t len)
  129. uint8_t SPI_Write(uint8_t* data_t, uint16_t len)
  130. {
  131. spi_trans_t trans = {0};
  132. trans.mosi = data;
  133. trans.bits.mosi = len * 8;
  134. return spi_trans(HSPI_HOST, &trans);
  135. }
  136. uint8_t SPI_Read(uint8_t* data_t, uint16_t len)
  137. {
  138. spi_trans_t trans;
  139. memset(&trans, 0x0, sizeof(trans));
  140. trans.bits.val = 0;
  141. trans.miso = data_t;
  142. trans.bits.miso = len * 8;
  143. if(spi_trans(HSPI_HOST, &trans))
  144. return 0;
  145. return 1;
  146. }
  147. #endif /* PLATFORM */
  148. #endif /* __SPI_HARDWARE_ATY */
  149. #endif /* __HW_SPI_ATY_C */
  150. /******************************** End Of File *********************************/