|
@ -6,12 +6,13 @@ |
|
|
#define TAG "fpga_if" |
|
|
#define TAG "fpga_if" |
|
|
static fpga_if_t fpga_if; |
|
|
static fpga_if_t fpga_if; |
|
|
xs_gpio_t spi2_cs; |
|
|
xs_gpio_t spi2_cs; |
|
|
|
|
|
SemaphoreHandle_t m_spilock; |
|
|
|
|
|
|
|
|
void fpga_if_init() { // |
|
|
void fpga_if_init() { // |
|
|
// fpga_if.spi1 = &hspi1; |
|
|
// fpga_if.spi1 = &hspi1; |
|
|
// fpga_if.spi2 = &hspi2; |
|
|
// fpga_if.spi2 = &hspi2; |
|
|
uint8_t rxbuf[1]; |
|
|
uint8_t rxbuf[1]; |
|
|
|
|
|
|
|
|
|
|
|
m_spilock = xSemaphoreCreateRecursiveMutex(); |
|
|
/** |
|
|
/** |
|
|
* @brief 由于SPI在未传输第一帧数据之前,时钟线是低电平(理论上应该为高),这里 |
|
|
* @brief 由于SPI在未传输第一帧数据之前,时钟线是低电平(理论上应该为高),这里 |
|
|
* 假传输一帧数据,使时钟线变为高电平。 |
|
|
* 假传输一帧数据,使时钟线变为高电平。 |
|
@ -24,16 +25,18 @@ void fpga_if_init() { // |
|
|
// fpga_if.spi2 = &hspi1; |
|
|
// fpga_if.spi2 = &hspi1; |
|
|
// HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000); |
|
|
// HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000); |
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
|
|
|
|
fpga_if.timecode_irq_pin = PD6; |
|
|
|
|
|
fpga_if.camera_sync_code_irq_pin = PD4; |
|
|
|
|
|
|
|
|
|
|
|
#if 1 |
|
|
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.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); |
|
|
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); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 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 |
|
|
#endif |
|
|
} |
|
|
} |
|
|
/** |
|
|
/** |
|
@ -57,8 +60,8 @@ static uint8_t _fpga_if_get_timecode_u8(uint8_t add) { |
|
|
return data; |
|
|
return data; |
|
|
} |
|
|
} |
|
|
void fpga_if_get_timecode(uint32_t *timecode0, uint32_t *timecode1) { |
|
|
void fpga_if_get_timecode(uint32_t *timecode0, uint32_t *timecode1) { |
|
|
*timecode0 = 1; |
|
|
|
|
|
*timecode1 = 2; |
|
|
|
|
|
|
|
|
// *timecode0 = 1; |
|
|
|
|
|
// *timecode1 = 2; |
|
|
#if 0 |
|
|
#if 0 |
|
|
*timecode0 = 0; |
|
|
*timecode0 = 0; |
|
|
*timecode1 = 0; |
|
|
*timecode1 = 0; |
|
@ -71,6 +74,9 @@ void fpga_if_get_timecode(uint32_t *timecode0, uint32_t *timecode1) { |
|
|
*timecode1 |= fpga_if_get_timecode_u8(4) << 0; |
|
|
*timecode1 |= fpga_if_get_timecode_u8(4) << 0; |
|
|
*timecode1 |= fpga_if_get_timecode_u8(5) << 8; |
|
|
*timecode1 |= fpga_if_get_timecode_u8(5) << 8; |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
fpga_if_spi_read_data_02(577, timecode0); |
|
|
|
|
|
fpga_if_spi_read_data_02(578, timecode1); |
|
|
|
|
|
|
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -127,6 +133,7 @@ void fpga_if_spi_write_data_01(uint32_t add, uint32_t txdata, uint32_t *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_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) { |
|
|
void fpga_if_spi_write_data_02(uint32_t add, uint32_t txdata, uint32_t *rxdata) { |
|
|
|
|
|
xSemaphoreTakeRecursive(m_spilock, portMAX_DELAY); |
|
|
xs_gpio_write(&spi2_cs, false); |
|
|
xs_gpio_write(&spi2_cs, false); |
|
|
_fpga_if_spi_write_data(fpga_if.spi2, add, txdata, rxdata); |
|
|
_fpga_if_spi_write_data(fpga_if.spi2, add, txdata, rxdata); |
|
|
xs_gpio_write(&spi2_cs, true); |
|
|
xs_gpio_write(&spi2_cs, true); |
|
@ -134,11 +141,14 @@ void fpga_if_spi_write_data_02(uint32_t add, uint32_t txdata, uint32_t *rxdata) |
|
|
xs_gpio_write(&spi2_cs, false); |
|
|
xs_gpio_write(&spi2_cs, false); |
|
|
_fpga_if_spi_read_data(fpga_if.spi2, add, rxdata); |
|
|
_fpga_if_spi_read_data(fpga_if.spi2, add, rxdata); |
|
|
xs_gpio_write(&spi2_cs, true); |
|
|
xs_gpio_write(&spi2_cs, true); |
|
|
|
|
|
xSemaphoreGiveRecursive(m_spilock); |
|
|
} |
|
|
} |
|
|
void fpga_if_spi_read_data_02(uint32_t add, uint32_t *rxdata) { |
|
|
void fpga_if_spi_read_data_02(uint32_t add, uint32_t *rxdata) { |
|
|
|
|
|
xSemaphoreTakeRecursive(m_spilock, portMAX_DELAY); |
|
|
xs_gpio_write(&spi2_cs, false); |
|
|
xs_gpio_write(&spi2_cs, false); |
|
|
_fpga_if_spi_read_data(fpga_if.spi2, add, rxdata); |
|
|
_fpga_if_spi_read_data(fpga_if.spi2, add, rxdata); |
|
|
xs_gpio_write(&spi2_cs, true); |
|
|
xs_gpio_write(&spi2_cs, true); |
|
|
|
|
|
xSemaphoreGiveRecursive(m_spilock); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
fpga_if_t *fpga_if_get_instance() { return &fpga_if; } |
|
|
fpga_if_t *fpga_if_get_instance() { return &fpga_if; } |