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.

106 lines
3.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
  1. #include "fpga_if.h"
  2. /**
  3. * @brief fpga_ifʼ
  4. */
  5. static fpga_if_t fpga_if;
  6. void fpga_if_init() { //
  7. fpga_if.spi1 = &hspi1;
  8. fpga_if.spi2 = &hspi2;
  9. // xs_gpio_init_as_output(PA)
  10. #if 0
  11. 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);
  12. xs_gpio_init_as_input(&fpga_if.timecode_irq_io, fpga_if.timecode_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
  13. for (size_t i = 0; i < 4; i++) {
  14. xs_gpio_init_as_output(&fpga_if.timecode_add[i], fpga_if.timecode_add_pin[i], kxs_gpio_nopull, false, false);
  15. }
  16. for (size_t i = 0; i < 8; i++) {
  17. xs_gpio_init_as_input(&fpga_if.timecode_data[i], fpga_if.timecode_data_pin[i], kxs_gpio_nopull, kxs_gpio_no_irq, false);
  18. }
  19. #endif
  20. }
  21. /**
  22. * @brief ȡǰtimecode
  23. *
  24. * @param timecode0
  25. * @param timecode1
  26. */
  27. static uint8_t _fpga_if_get_timecode_u8(uint8_t add) {
  28. xs_gpio_write(&fpga_if.timecode_add[0], add & 0x01);
  29. xs_gpio_write(&fpga_if.timecode_add[1], add & 0x02);
  30. xs_gpio_write(&fpga_if.timecode_add[2], add & 0x04);
  31. xs_gpio_write(&fpga_if.timecode_add[3], add & 0x08);
  32. xs_delay_us(2);
  33. uint8_t data = 0;
  34. for (size_t i = 0; i < 8; i++) {
  35. data |= xs_gpio_read(&fpga_if.timecode_data[i]) << i;
  36. }
  37. return data;
  38. }
  39. void fpga_if_get_timecode(uint32_t *timecode0, uint32_t *timecode1) {
  40. *timecode0 = 1;
  41. *timecode1 = 2;
  42. #if 0
  43. *timecode0 = 0;
  44. *timecode1 = 0;
  45. *timecode0 |= fpga_if_get_timecode_u8(0) << 0;
  46. *timecode0 |= fpga_if_get_timecode_u8(1) << 8;
  47. *timecode0 |= fpga_if_get_timecode_u8(2) << 16;
  48. *timecode0 |= fpga_if_get_timecode_u8(3) << 24;
  49. *timecode1 |= fpga_if_get_timecode_u8(4) << 0;
  50. *timecode1 |= fpga_if_get_timecode_u8(5) << 8;
  51. #endif
  52. return;
  53. }
  54. /**
  55. * @brief SPIĴдָ
  56. *
  57. * @param add
  58. * @param txdata
  59. * @param rxdata
  60. */
  61. static void _fpga_if_spi_write_data(SPI_HandleTypeDef *hspi, uint32_t add, uint32_t txdata, uint32_t *rxdata) {
  62. uint8_t txbuf[2 + 4] = {0};
  63. txbuf[0] = add & 0xFF;
  64. txbuf[1] = (add >> 8) & 0xFF;
  65. txbuf[1] |= 0x80; // write flag
  66. txbuf[2] = txdata & 0xFF;
  67. txbuf[3] = (txdata >> 8) & 0xFF;
  68. txbuf[4] = (txdata >> 16) & 0xFF;
  69. txbuf[5] = (txdata >> 24) & 0xFF;
  70. HAL_SPI_TransmitReceive(hspi, txbuf, txbuf, 2 + 4, 1000);
  71. *rxdata = txbuf[2] | (txbuf[3] << 8) | (txbuf[4] << 16) | (txbuf[5] << 24);
  72. }
  73. /**
  74. * @brief SPIĴָ
  75. *
  76. * @param add
  77. * @param rxdata
  78. */
  79. static void _fpga_if_spi_read_data(SPI_HandleTypeDef *hspi, uint32_t add, uint32_t *rxdata) {
  80. uint8_t txbuf[2 + 4] = {0};
  81. txbuf[0] = add & 0xFF;
  82. txbuf[1] = (add >> 8) & 0xFF;
  83. txbuf[2] = 0;
  84. txbuf[3] = 0;
  85. txbuf[4] = 0;
  86. txbuf[5] = 0;
  87. HAL_SPI_TransmitReceive(hspi, txbuf, txbuf, 2 + 4, 1000);
  88. *rxdata = txbuf[2] | (txbuf[3] << 8) | (txbuf[4] << 16) | (txbuf[5] << 24);
  89. }
  90. void fpga_if_spi_write_data_01(uint32_t add, uint32_t txdata, uint32_t *rxdata) { _fpga_if_spi_write_data(fpga_if.spi1, add, txdata, rxdata); }
  91. void fpga_if_spi_read_data_01(uint32_t add, uint32_t *rxdata) { _fpga_if_spi_read_data(fpga_if.spi1, add, rxdata); }
  92. void fpga_if_spi_write_data_02(uint32_t add, uint32_t txdata, uint32_t *rxdata) { _fpga_if_spi_write_data(fpga_if.spi2, add, txdata, rxdata); }
  93. void fpga_if_spi_read_data_02(uint32_t add, uint32_t *rxdata) { _fpga_if_spi_read_data(fpga_if.spi2, add, rxdata); }
  94. fpga_if_t *fpga_if_get_instance() { return &fpga_if; }