打印

求助:GDA490 spi dma通讯求助(主从模式 两个单片机之前SPI)

[复制链接]
34|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sweet蜘蛛侠|  楼主 | 2025-2-12 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 */
}


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

10

帖子

0

粉丝