|
|
#include "fpga_if.h"
/**
* @brief fpga_if��ʼ�� */
static fpga_if_t fpga_if; void fpga_if_init() { //
fpga_if.spi1 = &hspi1; fpga_if.spi2 = &hspi2; // xs_gpio_init_as_output(PA)
#if 0
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); xs_gpio_init_as_input(&fpga_if.timecode_irq_io, fpga_if.timecode_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
for (size_t i = 0; i < 4; i++) { xs_gpio_init_as_output(&fpga_if.timecode_add[i], fpga_if.timecode_add_pin[i], kxs_gpio_nopull, false, false); } for (size_t i = 0; i < 8; i++) { xs_gpio_init_as_input(&fpga_if.timecode_data[i], fpga_if.timecode_data_pin[i], kxs_gpio_nopull, kxs_gpio_no_irq, false); } #endif
} /**
* @brief ��ȡ��ǰtimecode * * @param timecode0 * @param timecode1 */
static uint8_t _fpga_if_get_timecode_u8(uint8_t add) { xs_gpio_write(&fpga_if.timecode_add[0], add & 0x01); xs_gpio_write(&fpga_if.timecode_add[1], add & 0x02); xs_gpio_write(&fpga_if.timecode_add[2], add & 0x04); xs_gpio_write(&fpga_if.timecode_add[3], add & 0x08);
xs_delay_us(2); uint8_t data = 0; for (size_t i = 0; i < 8; i++) { data |= xs_gpio_read(&fpga_if.timecode_data[i]) << i; } return data; } void fpga_if_get_timecode(uint32_t *timecode0, uint32_t *timecode1) { *timecode0 = 1; *timecode1 = 2; #if 0
*timecode0 = 0; *timecode1 = 0;
*timecode0 |= fpga_if_get_timecode_u8(0) << 0; *timecode0 |= fpga_if_get_timecode_u8(1) << 8; *timecode0 |= fpga_if_get_timecode_u8(2) << 16; *timecode0 |= fpga_if_get_timecode_u8(3) << 24;
*timecode1 |= fpga_if_get_timecode_u8(4) << 0; *timecode1 |= fpga_if_get_timecode_u8(5) << 8; #endif
return; }
/**
* @brief SPI�Ĵ���дָ�� * * @param add * @param txdata * @param rxdata */ static void _fpga_if_spi_write_data(SPI_HandleTypeDef *hspi, uint32_t add, uint32_t txdata, uint32_t *rxdata) { uint8_t txbuf[2 + 4] = {0}; txbuf[0] = add & 0xFF; txbuf[1] = (add >> 8) & 0xFF; txbuf[1] |= 0x80; // write flag
txbuf[2] = txdata & 0xFF; txbuf[3] = (txdata >> 8) & 0xFF; txbuf[4] = (txdata >> 16) & 0xFF; txbuf[5] = (txdata >> 24) & 0xFF;
HAL_SPI_TransmitReceive(hspi, txbuf, txbuf, 2 + 4, 1000); *rxdata = txbuf[2] | (txbuf[3] << 8) | (txbuf[4] << 16) | (txbuf[5] << 24); } /**
* @brief SPI�Ĵ�����ָ�� * * @param add * @param rxdata */ static void _fpga_if_spi_read_data(SPI_HandleTypeDef *hspi, uint32_t add, uint32_t *rxdata) { uint8_t txbuf[2 + 4] = {0}; txbuf[0] = add & 0xFF; txbuf[1] = (add >> 8) & 0xFF; txbuf[2] = 0; txbuf[3] = 0; txbuf[4] = 0; txbuf[5] = 0; HAL_SPI_TransmitReceive(hspi, txbuf, txbuf, 2 + 4, 1000); *rxdata = txbuf[2] | (txbuf[3] << 8) | (txbuf[4] << 16) | (txbuf[5] << 24); }
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); } void fpga_if_spi_read_data_01(uint32_t add, uint32_t *rxdata) { _fpga_if_spi_read_data(fpga_if.spi1, add, rxdata); }
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); } void fpga_if_spi_read_data_02(uint32_t add, uint32_t *rxdata) { _fpga_if_spi_read_data(fpga_if.spi2, add, rxdata); }
fpga_if_t *fpga_if_get_instance() { return &fpga_if; }
|