ad0x0_spi.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #ifndef AD0X0_SPI_H
  2. #define AD0X0_SPI_H
  3. #include "stm32f103xb.h"
  4. #include "stdint.h"
  5. #include "../admisc/ad0x0_memman.h"
  6. //#include "ad0x0_sfuncs.h"
  7. #define AD0X0_SPI_EXT_COUNT 32
  8. // ************************** I2C Configuration Variables **************************
  9. /* definition of fast or default standard mode (bus speed up to 400 or 100 kHz) */
  10. //#define FAST_I2C_MODE
  11. #define AD0X0_SPI_FIFO_COUNT 16
  12. //#define AD0X0_SPI_DBG
  13. #ifndef AD0X0_LE_SWAP
  14. #define AD0X0_LE_SWAP(X) X = ((uint16_t)X >> 8)|((uint16_t)X << 8)
  15. #endif
  16. #define AD0X0_DAMN_DBG
  17. /*
  18. очередь для SPI. Это почти копипаста с очереди I2C. Ну тут интересно, что кроме передачи нужно делать DC, команда\данные.
  19. И RES - сброс. Как то надо протащить пины в виде параметров или еще как то.
  20. */
  21. //#undef AD0X0_I2C_DBG_CO
  22. typedef enum{
  23. // ADQS_START_ADDR = (uint8_t)0x1,
  24. ADQS_TX = (uint8_t)0x0,
  25. ADQS_TXRX_PBUF_DMA = (uint8_t)0xB,
  26. ADQS_TXRX_PBUF_DMA_EXT = (uint8_t)0x5,
  27. ADQS_TX_PBUF = (uint8_t)0x17,
  28. ADQS_TX_PBUF_EXT = (uint8_t)0xA,
  29. ADQS_TX_PBUF_DMA = (uint8_t)0x1C,
  30. ADQS_TX_PBUF_DMA_EXT = (uint8_t)0x2,
  31. /* ADQS_SET_RX_PBUF_H = (uint8_t)0xC, //[15:8]
  32. ADQS_SET_RX_PBUF_L = (uint8_t)0xD, //[7:0]
  33. ADQS_SET_RX_PBUF_HH = (uint8_t)0xE, //[31:24] на стм8 хватало байта, но тут это не сканает
  34. ADQS_SET_RX_PBUF_HL = (uint8_t)0xF, //[23:16] в общем пока делаю весь указатель (ad= (uint8_t)0x0 23082020)
  35. ADQS_SET_TX_PBUF_H = (uint8_t)0x18, //[15:8]
  36. ADQS_SET_TX_PBUF_L = (uint8_t)0x19, //[7:0]
  37. ADQS_SET_TX_PBUF_HH = (uint8_t)0x1A, //[31:24] на стм8 хватало байта, но тут это не сканает
  38. ADQS_SET_TX_PBUF_HL = (uint8_t)0x1B, //[23:16] в общем пока делаю весь указатель (ad= (uint8_t)0x0 23082020) */
  39. /*ADQS_SET_PFUNC_H = (uint8_t)0x10, //[15:8]
  40. ADQS_SET_PFUNC_L = (uint8_t)0x11, //[7:0]
  41. ADQS_SET_PFUNC_HH = (uint8_t)0x12, //[31:24] на стм8 хватало байта, но тут это не сканает
  42. ADQS_SET_PFUNC_HL = (uint8_t)0x13, //[23:16] после этого вызовется ф-я!!!!!!!*/
  43. ADQS_USE_EXT = (uint8_t)0x6, //а тут уже все меняется... эдакий шейдер очереди
  44. //ADQS_LRB_MODIFY_APPLY_MASK = (uint8_t)0x6, //прочитанный байт &= cbyte
  45. //ADQS_LRB_MODIFY_APPLY_OR = (uint8_t)0x7, //прочитанный байт |= cbyte
  46. ADQS_ST7735_SET_DC=(uint8_t)0x14,
  47. ADQS_ST7735_SET_CS=(uint8_t)0x15,
  48. ADQS_SET_CS = (uint8_t)0x4, //инженеры стм32 обосрались с аппаратным NSS как тока могли... значит надо дергать ногами
  49. ADQS_ST7735_SET_RESET=(uint8_t)0x16,
  50. ADQS_DELAY_MS = (uint8_t)0x9,
  51. ADQS_PROCESSED = (uint8_t)0x40,//6й бит
  52. ADQS_EMPTY = (uint8_t)0x80 //7й бит
  53. } ADQS_t;
  54. #define AD0X0_SPI_DBG
  55. /*#define AD_DBG_S1_Pin GPIO_PIN_1
  56. #define AD_DBG_S1_GPIO_Port GPIOA
  57. #define AD_DBG_S2_Pin GPIO_PIN_2
  58. #define AD_DBG_S2_GPIO_Port GPIOA
  59. #define AD_DC_Pin GPIO_PIN_3
  60. #define AD_DC_GPIO_Port GPIOA
  61. #define AD_RES_Pin GPIO_PIN_0
  62. #define AD_RES_GPIO_Port GPIOB*/
  63. //хитрая связка, но так удобнее связать кубе эмикс с нашими исходниками
  64. //#define SPI2_NSS_Port SPI2_NSS_GPIO_Port
  65. //#define SPI2_NSS_Pin SPI2_NSS_Pin
  66. #ifdef AD0X0_SPI_DBG
  67. #define ADS1_HIGH AD_DBG_S1_GPIO_Port->ODR |= AD_DBG_S1_Pin;
  68. #else
  69. #define ADS1_HIGH ;
  70. #endif
  71. #ifdef AD0X0_SPI_DBG
  72. #define ADS1_LOW AD_DBG_S1_GPIO_Port->ODR &= ~AD_DBG_S1_Pin;;//
  73. #else
  74. #define ADS1_LOW ;
  75. #endif
  76. #ifdef AD0X0_SPI_DBG
  77. #define ADS2_HIGH AD_DBG_S2_GPIO_Port->ODR |= AD_DBG_S2_Pin;
  78. #else
  79. #define ADS2_HIGH ;
  80. #endif
  81. #ifdef AD0X0_SPI_DBG
  82. #define ADS2_LOW AD_DBG_S2_GPIO_Port->ODR &= ~AD_DBG_S2_Pin;//
  83. #else
  84. #define ADS2_LOW ;
  85. #endif
  86. // ************************* Function Declaration ***************************
  87. __packed struct ad0x0_spi_cmd_s{
  88. /* //u8 processed=ctypex & 0x40;//b 0100 0000
  89. //u8 dropped=ctypex & 0x80;//b 1000 0000*/
  90. ADQS_t ctype;//
  91. uint8_t cbyte;
  92. //uint8_t cext;//ссылка на ...нахер (перенес в отдельную команду)
  93. __packed struct ad0x0_spi_cmd_s *pnext;
  94. };
  95. /*__packed struct ad0x0_spi_cmd_ext_s{
  96. uint8_t cext;//ссылка на
  97. };*/
  98. typedef struct {
  99. /* //u8 processed=ctypex & 0x40;//b 0100 0000
  100. //u8 dropped=ctypex & 0x80;//b 1000 0000*/
  101. SPI_TypeDef *spix;
  102. volatile uint8_t *rx_pbuf,*tx_pbuf,pbuf_counter;//установочные
  103. volatile uint8_t *rx_pbuf_cur,*tx_pbuf_cur,pbuf_counter_cur;//текущие
  104. volatile void (*pfunc)(void);
  105. void (*perrfunc)(void);
  106. uint8_t err_ovrflow;
  107. volatile uint8_t insint;
  108. volatile uint32_t last_hwi_process_tick;
  109. }ad0x0_spi_desc_s;
  110. /* USER CODE BEGIN PFP */
  111. //это надо в main.c копипастить
  112. /*void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi){
  113. if(hspi->Instance==(SPI_TypeDef*)SPI1_BASE){
  114. ad0x0_spi1_dma();
  115. }else{ad0x0_spi2_dma();}
  116. }
  117. //это надо в main.c копипастить
  118. void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi){
  119. if(hspi->Instance==(SPI_TypeDef*)SPI1_BASE){
  120. ad0x0_spi1_dma();
  121. }else{ad0x0_spi2_dma();}
  122. }
  123. //это надо в main.c копипастить
  124. void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi){
  125. if(hspi->Instance==(SPI_TypeDef*)SPI1_BASE){
  126. ad0x0_spi1_dma_err();
  127. }else{ad0x0_spi2_dma_err();}
  128. }*/
  129. /* USER CODE END PFP */
  130. //это туда где хендлеры прерываний
  131. /*void SPI2_IRQHandler(void)
  132. {
  133. USER CODE BEGIN SPI2_IRQn 0
  134. ad0x0_spi2_irq();
  135. USER CODE END SPI2_IRQn 0
  136. USER CODE BEGIN SPI2_IRQn 1
  137. USER CODE END SPI2_IRQn 1
  138. }*/
  139. //это туда где крутится задача
  140. /*ad0x0_spi1_xqRecieveHandler();
  141. */
  142. #endif