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.
 
 
 

138 lines
4.2 KiB

#include "fpga_if.h"
/**
* @brief fpga_if初始化
*/
#define TAG "fpga_if"
static fpga_if_t fpga_if;
xs_gpio_t spi1_cs;
void fpga_if_init() { //
// fpga_if.spi1 = &hspi1;
// fpga_if.spi2 = &hspi2;
fpga_if.spi1 = &hspi2;
fpga_if.spi2 = &hspi1;
xs_gpio_init_as_output(&spi1_cs, PC6, kxs_gpio_nopull, false, true);
/**
* @brief 由于SPI在未传输第一帧数据之前,时钟线是低电平(理论上应该为高),这里
* 假传输一帧数据,使时钟线变为高电平。
*/
uint8_t rxbuf[1];
HAL_SPI_Receive(fpga_if.spi1, rxbuf, 1, 1000);
HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000);
// 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};
uint8_t rxbuf[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_DMA(hspi, txbuf, rxbuf, 2 + 4);
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 + 4] = {0};
uint8_t rxbuf[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_DMA(hspi, txbuf, rxbuf, 2 + 4);
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_01(uint32_t add, uint32_t txdata, uint32_t *rxdata) {
// ZLOGI(TAG, "fpga_if_spi_write_data_01 add:%d txdata:%d", add, txdata);
xs_gpio_write(&spi1_cs, false);
_fpga_if_spi_write_data(fpga_if.spi1, add, txdata, rxdata);
xs_gpio_write(&spi1_cs, true);
}
void fpga_if_spi_read_data_01(uint32_t add, uint32_t *rxdata) {
xs_gpio_write(&spi1_cs, false);
_fpga_if_spi_read_data(fpga_if.spi1, add, rxdata);
xs_gpio_write(&spi1_cs, true);
}
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; }