|
|
使用的时GD32H737系列的芯片
定时器配置
void timer14_config(uint32_t period)
{
/* -----------------------------------------------------------------------
TIMER50 configuration:
TIMER50CLK = 300MHz/300 = 1MHz, .
----------------------------------------------------------------------- */
/* enable the peripherals clock */
rcu_periph_clock_enable(RCU_TIMER14);
/* deinit a TIMER */
timer_deinit(TIMER14);
timer_parameter_struct timer_initpara;
/* initialize TIMER init parameter struct */
timer_struct_para_init(&timer_initpara);
/* TIMER50 configuration */
timer_initpara.prescaler = 299;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = period-1;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER14, &timer_initpara);
/* TIMER0 update DMA request enable */
timer_dma_enable(TIMER14, TIMER_DMA_UPD);
/* enable a TIMER */
timer_enable(TIMER14);
}
spi配置 (此处使用了硬件CS且每次传输定量字节后需重置片选,这点为外设需求)
void spi_config(void)
{
rcu_periph_clock_enable(RCU_SPI4);
rcu_spi_clock_config(IDX_SPI4, RCU_SPISRC_APB2);
spi_parameter_struct spi4;
spi_i2s_deinit(SPI4);
spi_struct_para_init(&spi4);
spi4.device_mode = SPI_MASTER;
spi4.trans_mode = SPI_TRANSMODE_BDTRANSMIT;
spi4.data_size = SPI_DATASIZE_32BIT;
// spi4.nss = SPI_NSS_SOFT;
spi4.nss = SPI_NSS_HARD;
spi4.endian = SPI_ENDIAN_MSB;
spi4.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;
spi4.prescale = SPI_PSC_256; //300/256=1.17 <50M
spi_init(SPI4, &spi4);
spi_word_access_enable(SPI4);
spi_fifo_threshold_level_set(SPI4, SPI_FIFO_TH_04DATA);
// spi_nss_idleness_delay_set(SPI4, SPI_NSS_IDLENESS_03CYCLE);
spi_data_frame_delay_set(SPI4, SPI_DATA_IDLENESS_15CYCLE);
/* enable SPI NSS output */
spi_nss_output_enable(SPI4);
spi_nss_output_control(SPI4, SPI_NSS_INVALID_PULSE);
// spi_nss_output_control(SPI4, SPI_NSS_HOLD_UNTIL_TRANS_END);
// spi_reload_data_num_config(SPI4, 1);
// spi_current_data_num_config(SPI4, 1);
spi_enable(SPI4);
}
dma配置
void spi_dma_config(void)
{
/* enable DMA clock */
rcu_periph_clock_enable(RCU_DMA1);
/* enable DMAMUX clock */
rcu_periph_clock_enable(RCU_DMAMUX);
dma_single_data_parameter_struct dma_init_struct;
/* deinitialize DMA registers of a channel */
dma_deinit(DMA1, DMA_CH6);
dma_single_data_para_struct_init(&dma_init_struct);
/* SPI4 transmit DMA config: DMA_CH6 */
dma_init_struct.request = DMA_REQUEST_TIMER14_UP;
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
dma_init_struct.memory0_addr = (uint32_t)test_data;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_32BIT;
dma_init_struct.number = 8;
dma_init_struct.periph_addr = (uint32_t)&SPI_TDATA(SPI4);
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_single_data_mode_init(DMA1, DMA_CH6, &dma_init_struct);
dma_circulation_enable(DMA1, DMA_CH6);
/* enable DMA channel */
dma_channel_enable(DMA1, DMA_CH6);
spi_master_transfer_start(SPI4, SPI_TRANS_START);
// spi_dma_enable(SPI4, SPI_DMA_TRANSMIT);
}
请问上述配置有什么地方有问题吗,现在现象是每个字节被传输三次(大约120us,统一数据被完整的传输三次)后传输下一个数据,定时器配置的是10KHZ的
|
|