问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - DMA通讯
  • 求助:GDA490 spi dma通讯求助(主从模式 两个单片机之前SPI) sos

    SPI通讯收不到数据主机代码 #include "gd32a490.h" #include "SPI.h" #define SPI_CRC_ENABLE 0 #define ARRAYSIZE 16 uint16_t spi1_send_array[ARRAYSIZE] = {0}; uint16_t spi1_receive_array[ARRAYSIZE] = {0};; extern uint16_t i2s1_rxbuffer[ARRAYSIZE]; void spi_rcu_config(void); void spi_gpio_config(void); void dma_config(void); void spi_config(void); void SPI_Init(void) { /* configure RCU */ spi_rcu_config(); /* configure GPIO */ dma_config(); /* configure I2C */ spi_config(); dma_interrupt_enable(DMA1, DMA_CH3,DMA_CHXCTL_FTFIE); nvic_priority_group_set(NVIC_PRIGROUP_PRE0_SUB4); nvic_irq_enable(DMA1_Channel3_IRQn, 0, 1); // /* enable SPI DMA */ spi_dma_enable(SPI4, SPI_DMA_RECEIVE); spi_dma_enable(SPI4, SPI_DMA_TRANSMIT); /* enbale I2S and I2S_ADD*/ spi_enable(SPI4); dma_channel_enable(DMA1, DMA_CH4); dma_channel_enable(DMA1, DMA_CH3); } void spi_rcu_config(void) { rcu_periph_clock_enable(RCU_GPIOE); rcu_periph_clock_enable(RCU_DMA1); rcu_periph_clock_enable(RCU_SPI4); } /*! \brief configure the GPIO peripheral \param[in] none \param[out] none \retval none */ void spi_gpio_config(void) { /* configure SPI1 GPIO */ gpio_af_set(GPIOE, GPIO_AF_6, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14); gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14); gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14); /* set SPI1_NSS as GPIO*/ } /*! \brief configure the DMA peripheral \param[in] none \param[out] none \retval none */ void dma_config(void) { dma_single_data_parameter_struct dma_init_struct; /* configure SPI1 transmit dma */ dma_deinit(DMA1, DMA_CH4); dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI4); dma_init_struct.memory0_addr = (uint32_t)spi1_send_array; dma_init_struct.direction = DMA_MEMORY_TO_PERIPH; dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT; dma_init_struct.priority = DMA_PRIORITY_LOW; dma_init_struct.number = ARRAYSIZE; dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_DISABLE; dma_single_data_mode_init(DMA1, DMA_CH4, &dma_init_struct); dma_channel_subperipheral_select(DMA1, DMA_CH4, DMA_SUBPERI2); /* configure SPI1 receive dma */ dma_deinit(DMA1, DMA_CH3); dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI4); dma_init_struct.memory0_addr = (uint32_t)spi1_receive_array; dma_init_struct.direction = DMA_PERIPH_TO_MEMORY; dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT; dma_init_struct.priority = DMA_PRIORITY_HIGH; dma_init_struct.number = ARRAYSIZE; dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_DISABLE; dma_single_data_mode_init(DMA1, DMA_CH3, &dma_init_struct); dma_channel_subperipheral_select(DMA1, DMA_CH3, DMA_SUBPERI2); } /*! \brief configure the SPI peripheral \param[in] none \param[out] none \retval none */ void spi_config(void) { spi_parameter_struct spi_init_struct; spi_i2s_deinit(SPI4); /* configure SPI1 parameter */ spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_struct.device_mode = SPI_MASTER; spi_init_struct.frame_size = SPI_FRAMESIZE_16BIT; spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; spi_init_struct.nss = SPI_NSS_HARD; spi_init_struct.prescale = SPI_PSC_16; spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPI4, &spi_init_struct); spi_nss_output_enable(SPI4); spi_nss_internal_low(SPI4); #if SPI_CRC_ENABLE /* configure SPI CRC function */ spi_crc_polynomial_set(SPI1, 7); spi_crc_on(SPI1); #endif /* enable CRC function */ } 从机代码 #include "gd32a490.h" #include "SPI.h" #define SPI_CRC_ENABLE 0 #define ARRAYSIZE 16 uint16_t spi1_send_array[ARRAYSIZE] = {0}; uint16_t spi1_receive_array[ARRAYSIZE] = {0};; extern uint16_t i2s1_rxbuffer[ARRAYSIZE]; void spi_rcu_config(void); void spi_gpio_config(void); void dma_config(void); void spi_config(void); void SPI_Init(void) { /* configure RCU */ spi_rcu_config(); /* configure GPIO */ dma_config(); /* configure I2C */ spi_config(); / dma_interrupt_enable(DMA1, DMA_CH3,DMA_CHXCTL_FTFIE); nvic_priority_group_set(NVIC_PRIGROUP_PRE0_SUB4); nvic_irq_enable(DMA1_Channel3_IRQn, 0, 1); // /* enable SPI DMA */ spi_dma_enable(SPI4, SPI_DMA_RECEIVE); spi_dma_enable(SPI4, SPI_DMA_TRANSMIT); spi_enable(SPI4); dma_channel_enable(DMA1, DMA_CH4); dma_channel_enable(DMA1, DMA_CH3); // } void spi_rcu_config(void) { // rcu_periph_clock_enable(RCU_GPIOD); rcu_periph_clock_enable(RCU_GPIOE); rcu_periph_clock_enable(RCU_DMA1); rcu_periph_clock_enable(RCU_SPI4); } /*! \brief configure the GPIO peripheral \param[in] none \param[out] none \retval none */ void spi_gpio_config(void) { /* configure SPI1 GPIO */ gpio_af_set(GPIOE, GPIO_AF_6, GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14|GPIO_PIN_13); gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_NONE , GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14|GPIO_PIN_13); gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14|GPIO_PIN_13); } /*! \brief configure the DMA peripheral \param[in] none \param[out] none \retval none */ void dma_config(void) { dma_single_data_parameter_struct dma_init_struct; /* configure SPI1 transmit dma */ dma_deinit(DMA1, DMA_CH4); dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI4); dma_init_struct.memory0_addr = (uint32_t)spi1_send_array; dma_init_struct.direction = DMA_MEMORY_TO_PERIPH; dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT; dma_init_struct.priority = DMA_PRIORITY_LOW; dma_init_struct.number = ARRAYSIZE; dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_ENABLE; dma_single_data_mode_init(DMA1, DMA_CH4, &dma_init_struct); dma_channel_subperipheral_select(DMA1, DMA_CH4, DMA_SUBPERI2); /* configure SPI1 receive dma */ dma_deinit(DMA1, DMA_CH3); dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI4); dma_init_struct.memory0_addr = (uint32_t)spi1_receive_array; dma_init_struct.direction = DMA_PERIPH_TO_MEMORY; dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT; dma_init_struct.priority = DMA_PRIORITY_HIGH; dma_init_struct.number = ARRAYSIZE; dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_ENABLE; dma_single_data_mode_init(DMA1, DMA_CH3, &dma_init_struct); dma_channel_subperipheral_select(DMA1, DMA_CH3, DMA_SUBPERI2); } /*! \brief configure the SPI peripheral \param[in] none \param[out] none \retval none */ void spi_config(void) { spi_parameter_struct spi_init_struct; spi_i2s_deinit(SPI4); /* configure SPI1 parameter */ spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_struct.device_mode = SPI_SLAVE; spi_init_struct.frame_size = SPI_FRAMESIZE_16BIT; spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; spi_init_struct.nss = SPI_NSS_HARD; spi_init_struct.prescale = SPI_PSC_16; spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPI4, &spi_init_struct); #if SPI_CRC_ENABLE /* configure SPI CRC function */ spi_crc_polynomial_set(SPI1, 7); spi_crc_on(SPI1); #endif /* enable CRC function */ }

    单片机 GD32 spi DMA DA DMA通讯

    11浏览量 0回复量 关注量