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.

166 lines
5.4 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
  1. #include "fpga_if.h"
  2. /**
  3. * @brief fpga_ifʼ
  4. */
  5. #define TAG "fpga_if"
  6. static fpga_if_t fpga_if;
  7. xs_gpio_t spi2_cs;
  8. SemaphoreHandle_t m_spilock;
  9. void fpga_if_init() { //
  10. // fpga_if.spi1 = &hspi1;
  11. // fpga_if.spi2 = &hspi2;
  12. uint8_t rxbuf[1];
  13. m_spilock = xSemaphoreCreateRecursiveMutex();
  14. /**
  15. * @brief SPIδһ֮֡ǰʱǵ͵ƽ(ӦΪ)
  16. * ٴһ֡ݣʹʱ߱Ϊߵƽ
  17. */
  18. fpga_if.spi2 = &hspi2;
  19. xs_gpio_init_as_output(&spi2_cs, PB9, kxs_gpio_nopull, false, true);
  20. HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000);
  21. // fpga_if.spi2 = &hspi1;
  22. // HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000);
  23. fpga_if.timecode_irq_pin = PD6;
  24. fpga_if.camera_sync_code_irq_pin = PD4;
  25. fpga_if.xsync_workstate_start_sig_irq_io_pin = PD5;
  26. fpga_if.reset_pin = PD7;
  27. #if 1
  28. xs_gpio_init_as_input(&fpga_if.camera_sync_code_irq_io, fpga_if.camera_sync_code_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
  29. xs_gpio_init_as_input(&fpga_if.timecode_irq_io, fpga_if.timecode_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
  30. xs_gpio_init_as_input(&fpga_if.xsync_workstate_start_sig_irq_io, fpga_if.xsync_workstate_start_sig_irq_io_pin, kxs_gpio_pulldown, kxs_gpio_rising_and_falling_irq, false);
  31. xs_gpio_init_as_output(&fpga_if.reset_pin_io, fpga_if.reset_pin, kxs_gpio_nopull, false, false);
  32. xs_gpio_write(&fpga_if.reset_pin_io, false);
  33. xs_delay_us(1);
  34. xs_gpio_write(&fpga_if.reset_pin_io, true);
  35. // for (size_t i = 0; i < 4; i++) {
  36. // xs_gpio_init_as_output(&fpga_if.timecode_add[i], fpga_if.timecode_add_pin[i], kxs_gpio_nopull, false, false);
  37. // }
  38. // for (size_t i = 0; i < 8; i++) {
  39. // xs_gpio_init_as_input(&fpga_if.timecode_data[i], fpga_if.timecode_data_pin[i], kxs_gpio_nopull, kxs_gpio_no_irq, false);
  40. // }
  41. #endif
  42. }
  43. /**
  44. * @brief ȡǰtimecode
  45. *
  46. * @param timecode0
  47. * @param timecode1
  48. */
  49. static uint8_t _fpga_if_get_timecode_u8(uint8_t add) {
  50. xs_gpio_write(&fpga_if.timecode_add[0], add & 0x01);
  51. xs_gpio_write(&fpga_if.timecode_add[1], add & 0x02);
  52. xs_gpio_write(&fpga_if.timecode_add[2], add & 0x04);
  53. xs_gpio_write(&fpga_if.timecode_add[3], add & 0x08);
  54. xs_delay_us(2);
  55. uint8_t data = 0;
  56. for (size_t i = 0; i < 8; i++) {
  57. data |= xs_gpio_read(&fpga_if.timecode_data[i]) << i;
  58. }
  59. return data;
  60. }
  61. void fpga_if_get_timecode(uint32_t *timecode0, uint32_t *timecode1) {
  62. // *timecode0 = 1;
  63. // *timecode1 = 2;
  64. #if 0
  65. *timecode0 = 0;
  66. *timecode1 = 0;
  67. *timecode0 |= fpga_if_get_timecode_u8(0) << 0;
  68. *timecode0 |= fpga_if_get_timecode_u8(1) << 8;
  69. *timecode0 |= fpga_if_get_timecode_u8(2) << 16;
  70. *timecode0 |= fpga_if_get_timecode_u8(3) << 24;
  71. *timecode1 |= fpga_if_get_timecode_u8(4) << 0;
  72. *timecode1 |= fpga_if_get_timecode_u8(5) << 8;
  73. #endif
  74. fpga_if_spi_read_data_02(577, timecode0);
  75. fpga_if_spi_read_data_02(578, timecode1);
  76. return;
  77. }
  78. void fpga_if_get_workstate(uint32_t *workstate) {
  79. fpga_if_spi_read_data_02(60, workstate);
  80. return;
  81. }
  82. /**
  83. * @brief SPIĴдָ
  84. *
  85. * @param add
  86. * @param txdata
  87. * @param rxdata
  88. */
  89. static void _fpga_if_spi_write_data(SPI_HandleTypeDef *hspi, uint32_t add, uint32_t txdata, uint32_t *rxdata) {
  90. uint8_t txbuf[2 + 5] = {0};
  91. uint8_t rxbuf[2 + 5] = {0};
  92. txbuf[0] = add & 0xFF;
  93. txbuf[1] = (add >> 8) & 0xFF;
  94. txbuf[1] |= 0x80; // write flag
  95. txbuf[2] = txdata & 0xFF;
  96. txbuf[3] = (txdata >> 8) & 0xFF;
  97. txbuf[4] = (txdata >> 16) & 0xFF;
  98. txbuf[5] = (txdata >> 24) & 0xFF;
  99. HAL_SPI_TransmitReceive_DMA(hspi, txbuf, rxbuf, 2 + 5);
  100. while (HAL_SPI_GetState(hspi) != HAL_SPI_STATE_READY) {
  101. }
  102. // HAL_SPI_Transmit(hspi, txbuf, 2 + 4, 1000);
  103. *rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[5] << 24);
  104. }
  105. /**
  106. * @brief SPIĴָ
  107. *
  108. * @param add
  109. * @param rxdata
  110. */
  111. static void _fpga_if_spi_read_data(SPI_HandleTypeDef *hspi, uint32_t add, uint32_t *rxdata) {
  112. uint8_t txbuf[2 + 5] = {0};
  113. uint8_t rxbuf[2 + 5] = {0};
  114. txbuf[0] = add & 0xFF;
  115. txbuf[1] = (add >> 8) & 0xFF;
  116. txbuf[2] = 0;
  117. txbuf[3] = 0;
  118. txbuf[4] = 0;
  119. txbuf[5] = 0;
  120. HAL_SPI_TransmitReceive_DMA(hspi, txbuf, rxbuf, 2 + 5);
  121. while (HAL_SPI_GetState(hspi) != HAL_SPI_STATE_READY) {
  122. }
  123. *rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[5] << 24);
  124. }
  125. void fpga_if_spi_write_data_01(uint32_t add, uint32_t txdata, uint32_t *rxdata) {
  126. _fpga_if_spi_write_data(fpga_if.spi1, add, txdata, rxdata);
  127. _fpga_if_spi_read_data(fpga_if.spi1, add, rxdata);
  128. }
  129. void fpga_if_spi_read_data_01(uint32_t add, uint32_t *rxdata) { _fpga_if_spi_read_data(fpga_if.spi1, add, rxdata); }
  130. void fpga_if_spi_write_data_02(uint32_t add, uint32_t txdata, uint32_t *rxdata) {
  131. xSemaphoreTakeRecursive(m_spilock, portMAX_DELAY);
  132. xs_gpio_write(&spi2_cs, false);
  133. _fpga_if_spi_write_data(fpga_if.spi2, add, txdata, rxdata);
  134. xs_gpio_write(&spi2_cs, true);
  135. xs_delay_us(1);
  136. xs_gpio_write(&spi2_cs, false);
  137. _fpga_if_spi_read_data(fpga_if.spi2, add, rxdata);
  138. xs_gpio_write(&spi2_cs, true);
  139. xSemaphoreGiveRecursive(m_spilock);
  140. }
  141. void fpga_if_spi_read_data_02(uint32_t add, uint32_t *rxdata) {
  142. xSemaphoreTakeRecursive(m_spilock, portMAX_DELAY);
  143. xs_gpio_write(&spi2_cs, false);
  144. _fpga_if_spi_read_data(fpga_if.spi2, add, rxdata);
  145. xs_gpio_write(&spi2_cs, true);
  146. xSemaphoreGiveRecursive(m_spilock);
  147. }
  148. fpga_if_t *fpga_if_get_instance() { return &fpga_if; }