You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

155 lines
4.3 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include <stdbool.h>
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "main.h"
  6. #include "usart.h"
  7. #include "tim.h"
  8. #define READ_CMD 0x80
  9. #define SPI_TIMEOUT_VALUE 1000
  10. #define SPI_CS_1() HAL_GPIO_WritePin(SEL_GPIO_Port, SEL_Pin, GPIO_PIN_SET) /* */
  11. #define SPI_CS_0() HAL_GPIO_WritePin(SEL_GPIO_Port, SEL_Pin, GPIO_PIN_RESET) /* */
  12. #define SPI_SCK_1() HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET) /* SCK = 1 */
  13. #define SPI_SCK_0() HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET) /* SCK = 0 */
  14. #define SPI_MOSI_1() HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_SET) /* MOSI = 1 */
  15. #define SPI_MOSI_0() HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_RESET) /* MOSI = 0 */
  16. #define SPI_READ_MISO() HAL_GPIO_ReadPin(MISO_GPIO_Port, MISO_Pin) /* 读MISO口线状态 */
  17. #define Dummy_Byte 0xFF // 读取时MISO发送的数据,可以为任意数据
  18. #define spi_delay_us 5
  19. #define spi_table_type_size 50
  20. typedef enum
  21. {
  22. SPI_SEL_TYPE = 0,
  23. SPI_SCK_TYPE,
  24. SPI_MOSI_TYPE,
  25. SPI_MISO_TYPE,
  26. SPI_TYPE_NUMBER,
  27. } SPI_TYPE;
  28. uint8_t table[SPI_TYPE_NUMBER][spi_table_type_size] = {
  29. {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}, // sel
  30. {1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // sck
  31. {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // mosi
  32. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // miso
  33. };
  34. void sys_delay_us(uint32_t us)
  35. {
  36. uint16_t counter = 0;
  37. __HAL_TIM_SET_COUNTER(&htim7, 0);
  38. HAL_TIM_Base_Start(&htim7);
  39. while (counter < us)
  40. {
  41. counter = __HAL_TIM_GET_COUNTER(&htim7);
  42. }
  43. HAL_TIM_Base_Stop(&htim7);
  44. }
  45. void set_spi_table_sel(uint8_t startoff)
  46. {
  47. for (size_t i = 0; i < spi_table_type_size; i++)
  48. {
  49. if (i < startoff)
  50. {
  51. table[SPI_SEL_TYPE][i] = 1;
  52. }
  53. else if (i >= startoff && i < (startoff + 35))
  54. {
  55. table[SPI_SEL_TYPE][i] = 0;
  56. }
  57. else
  58. {
  59. table[SPI_SEL_TYPE][i] = 1;
  60. }
  61. }
  62. }
  63. void set_spi_table_sck(uint8_t startoff)
  64. {
  65. bool clocklevel = false;
  66. for (size_t i = 0; i < spi_table_type_size; i++)
  67. {
  68. if (i < startoff)
  69. {
  70. table[SPI_SCK_TYPE][i] = 1;
  71. }
  72. else if (i >= startoff && i < (startoff + 16))
  73. {
  74. (clocklevel) ? (table[SPI_SCK_TYPE][i] = 1) : (table[SPI_SCK_TYPE][i] = 0);
  75. clocklevel = !clocklevel;
  76. }
  77. else
  78. {
  79. table[SPI_SCK_TYPE][i] = 1;
  80. }
  81. }
  82. }
  83. void set_spi_table_mosi(uint8_t startoff, uint8_t txdata)
  84. {
  85. HAL_UART_Transmit(&huart1, &txdata, 1, 100);
  86. for (size_t i = 0; i < spi_table_type_size; i += 2)
  87. {
  88. if (i < startoff)
  89. {
  90. table[SPI_MOSI_TYPE][i] = 1;
  91. table[SPI_MOSI_TYPE][i + 1] = 1;
  92. }
  93. else if ((i >= startoff) && (i < (startoff + 16)))
  94. {
  95. table[SPI_MOSI_TYPE][i] = 1;
  96. (txdata & 0x80) ? (table[SPI_MOSI_TYPE][i] = 1), (table[SPI_MOSI_TYPE][i + 1] = 1) : (table[SPI_MOSI_TYPE][i] = 0), (table[SPI_MOSI_TYPE][i + 1] = 0);
  97. txdata = txdata << 1;
  98. }
  99. else if ((i >= startoff + 16) && (i < (startoff + 32)))
  100. {
  101. table[SPI_MOSI_TYPE][i] = 1;
  102. table[SPI_MOSI_TYPE][i + 1] = 1;
  103. }
  104. else
  105. {
  106. table[SPI_MOSI_TYPE][i] = 1;
  107. table[SPI_MOSI_TYPE][i + 1] = 1;
  108. }
  109. }
  110. }
  111. void dotable(uint8_t txdata)
  112. {
  113. int sel_startoff = 2;
  114. int clock_startoff = 4;
  115. int mosi_startoff = 4;
  116. set_spi_table_sel(sel_startoff);
  117. // set_spi_table_sck(clock_startoff);
  118. // set_spi_table_mosi(mosi_startoff, txdata);
  119. for (size_t i = 0; i < spi_table_type_size; i++)
  120. {
  121. table[SPI_SEL_TYPE][i] ? SPI_CS_1() : SPI_CS_0();
  122. table[SPI_SCK_TYPE][i] ? SPI_SCK_1() : SPI_SCK_0();
  123. table[SPI_MOSI_TYPE][i] ? SPI_MOSI_1() : SPI_MOSI_0();
  124. sys_delay_us(spi_delay_us);
  125. }
  126. }
  127. void user_main()
  128. {
  129. // uint8_t temp;
  130. SPI_CS_1(); // 片选
  131. SPI_SCK_1(); // 时钟空闲高电平
  132. SPI_MOSI_1(); // 数据线空闲高电平
  133. while (1)
  134. {
  135. dotable(0x86);
  136. // HAL_UART_Transmit(&huart1, &temp, 1, 100);
  137. HAL_Delay(10);
  138. }
  139. }