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.
127 lines
4.0 KiB
127 lines
4.0 KiB
#include "fpga_if.h"
|
|
|
|
#include "xsync_regs.hpp"
|
|
/**
|
|
* @brief fpga_if初始化
|
|
*/
|
|
#define TAG "fpga_if"
|
|
static fpga_if_t fpga_if;
|
|
xs_gpio_t spi2_cs;
|
|
SemaphoreHandle_t m_spilock;
|
|
|
|
void fpga_if_init() { //
|
|
// fpga_if.spi1 = &hspi1;
|
|
// fpga_if.spi2 = &hspi2;
|
|
uint8_t rxbuf[1];
|
|
m_spilock = xSemaphoreCreateRecursiveMutex();
|
|
/**
|
|
* @brief 由于SPI在未传输第一帧数据之前,时钟线是低电平(理论上应该为高),这里
|
|
* 假传输一帧数据,使时钟线变为高电平。
|
|
*/
|
|
|
|
/**
|
|
* @brief
|
|
*
|
|
* CPOL:1
|
|
* CPHA:1
|
|
* LSB-FIRST
|
|
*/
|
|
fpga_if.spi2 = &hspi1;
|
|
xs_gpio_init_as_output(&spi2_cs, PA4, kxs_gpio_pullup, false, true);
|
|
HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000);
|
|
|
|
// fpga_if.spi2 = &hspi1;
|
|
// HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000);
|
|
|
|
fpga_if.timecode_irq_pin = PD6;
|
|
fpga_if.camera_sync_code_irq_pin = PD4;
|
|
fpga_if.xsync_workstate_start_sig_irq_io_pin = PD5;
|
|
fpga_if.reset_pin = PD7;
|
|
|
|
#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.timecode_irq_io, fpga_if.timecode_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
|
|
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);
|
|
xs_gpio_init_as_output(&fpga_if.reset_pin_io, fpga_if.reset_pin, kxs_gpio_pullup, false, false);
|
|
|
|
xs_gpio_write(&fpga_if.reset_pin_io, false);
|
|
xs_delay_ms(10);
|
|
xs_gpio_write(&fpga_if.reset_pin_io, true);
|
|
#endif
|
|
}
|
|
void fpga_if_get_timecode(uint32_t *timecode0, uint32_t *timecode1) {
|
|
fpga_if_spi_read_data_02(sys_timecode_data0, timecode0);
|
|
fpga_if_spi_read_data_02(sys_timecode_data1, timecode1);
|
|
return;
|
|
}
|
|
void fpga_if_get_record_state(uint32_t *recordstate) {
|
|
fpga_if_spi_read_data_02(record_sig_gen_record_state, recordstate);
|
|
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 + 5] = {0};
|
|
uint8_t rxbuf[2 + 5] = {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_DMA(hspi, txbuf, rxbuf, 2 + 5);
|
|
while (HAL_SPI_GetState(hspi) != HAL_SPI_STATE_READY) {
|
|
}
|
|
|
|
// HAL_SPI_Transmit(hspi, txbuf, 2 + 4, 1000);
|
|
*rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[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 + 5] = {0};
|
|
uint8_t rxbuf[2 + 5] = {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_DMA(hspi, txbuf, rxbuf, 2 + 5);
|
|
while (HAL_SPI_GetState(hspi) != HAL_SPI_STATE_READY) {
|
|
}
|
|
*rxdata = rxbuf[2] | (rxbuf[3] << 8) | (rxbuf[4] << 16) | (rxbuf[5] << 24);
|
|
}
|
|
|
|
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);
|
|
_fpga_if_spi_write_data(fpga_if.spi2, add, txdata, rxdata);
|
|
xs_gpio_write(&spi2_cs, true);
|
|
xs_delay_us(1);
|
|
xs_gpio_write(&spi2_cs, false);
|
|
_fpga_if_spi_read_data(fpga_if.spi2, add, rxdata);
|
|
xs_gpio_write(&spi2_cs, true);
|
|
xSemaphoreGiveRecursive(m_spilock);
|
|
}
|
|
void fpga_if_spi_read_data_02(uint32_t add, uint32_t *rxdata) {
|
|
xSemaphoreTakeRecursive(m_spilock, portMAX_DELAY);
|
|
xs_gpio_write(&spi2_cs, false);
|
|
_fpga_if_spi_read_data(fpga_if.spi2, add, rxdata);
|
|
xs_gpio_write(&spi2_cs, true);
|
|
xSemaphoreGiveRecursive(m_spilock);
|
|
}
|
|
|
|
fpga_if_t *fpga_if_get_instance() { return &fpga_if; }
|