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.

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