打印
[研电赛技术支持]

GD32H7-SPI-DMA-SYNC

[复制链接]
1976|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GD32H7-SPI-DMA-SYNC
spi3 exit0 falling edge 触发同步;

void spi_dma_sync_config()
{
    /**SPI3: PE5--MISO,PE6--MOSI,PE2--SCK,PE4--NSS3 */
    rcu_periph_clock_enable(RCU_GPIOE);
    gpio_af_set(GPIOE, GPIO_AF_5, GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6);
    gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6);
    gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6);

    //spi config
    rcu_periph_clock_enable(RCU_SPI3);
    rcu_spi_clock_config(IDX_SPI3, RCU_SPISRC_APB2);
    spi_i2s_deinit(SPI3);
    spi_parameter_struct spi_init_struct;

    spi_struct_para_init(&spi_init_struct);
    spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode = SPI_MASTER;
    spi_init_struct.data_size = SPI_DATASIZE_8BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;
    spi_init_struct.nss = SPI_NSS_HARD;
    spi_init_struct.prescale = SPI_PSC_32;//300M/8=37.5MHZ,300M/16=18.75MHZ
    spi_init_struct.endian = SPI_ENDIAN_MSB;
    spi_init(SPI3, &spi_init_struct);
    // spi_master_receive_clock_delay_set(SPI3, 15);//0.5ns*20
    spi_byte_access_enable(SPI3);//使能按字节访问
    /* enable SPI NSS output ,is important for spi3*/

    spi_nss_output_enable(SPI3);
    // spi_current_data_num_config(SPI3, 1);
    spi_enable(SPI3);
    spi_dma_enable(SPI3, SPI_DMA_TRANSMIT);
    spi_master_transfer_start(SPI3, SPI_TRANS_START);

    //dma config
    rcu_periph_clock_enable(RCU_DMA0);
    rcu_periph_clock_enable(RCU_DMAMUX);

    dma_single_data_parameter_struct dma_init_struct;
    dma_single_data_para_struct_init(&dma_init_struct);
    dmamux_sync_parameter_struct dmamux_sync_init_struct;
    dmamux_sync_struct_para_init(&dmamux_sync_init_struct);
    dma_deinit(DMA0, DMA_CH6);
    dma_init_struct.request = DMA_REQUEST_SPI3_TX;
    dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
    dma_init_struct.memory0_addr = (uint32_t)ms1005_dma_txbuf;
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
    dma_init_struct.number = 5;
    dma_init_struct.periph_addr = (uint32_t)&SPI_TDATA(SPI3);
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
    dma_single_data_mode_init(DMA0, DMA_CH6, &dma_init_struct);
    dma_circulation_enable(DMA0, DMA_CH6);
    /* DMAMUX channle config */
    dmamux_sync_init_struct.sync_id = DMAMUX_SYNC_EXTI0;//PE3
    dmamux_sync_init_struct.sync_polarity = DMAMUX_SYNC_FALLING;
    dmamux_sync_init_struct.request_number = 2;
    dmamux_synchronization_init(DMAMUX_MUXCH6, &dmamux_sync_init_struct);
    dmamux_synchronization_enable(DMAMUX_MUXCH6);

    SCB_CleanDCache_by_Addr((uint32_t *)ms1005_dma_txbuf, 32);
    dma_channel_enable(DMA0, DMA_CH6);
}



注意这几个的dma配置的顺序,要先使能spi,再配置dma;



还需要打开中断,一定要使能中断才可以;

void exit_sync_config()
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_SYSCFG);
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
    syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);
    exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    nvic_irq_enable(EXTI0_IRQn, 2, 0);
}


main.c:

exit_sync_config();
spi_dma_sync_config();


之后,按下按键,就可以触发DMA传输,测试如下:



上面配置的同步请求数量request_number为2,也就是每次按键触发2次dma传输,每次传输1个字节;这里也可以用突发模式; 而上面配置的dma_init_struct.number = 5;则表示要发送的数组中只有前5个有效,当memory0_addr为+5时,会自动回到最初的地址;
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_43310175/article/details/144845387

使用特权

评论回复
沙发
caigang13| | 2025-2-5 11:20 | 只看该作者
GD32H7系列性能咋样啊?主频看起来还可以,但是FLASH不是零等待周期啊。

使用特权

评论回复
板凳
tpgf| | 2025-2-5 11:21 | 只看该作者
,在一些对时钟精度要求较高的应用中,如音频数据传输、高精度传感器数据采集等,时钟同步至关重要。

使用特权

评论回复
地板
磨砂| | 2025-2-5 18:38 | 只看该作者
GD32H7 的 SPI 支持全双工、半双工和单工模式的主从操作,在全双工模式下,主机通过 MOSI 线发送数据的同时,也在 MISO 线上接收数据,实现主从设备之间的双向数据交换

使用特权

评论回复
5
晓伍| | 2025-2-5 20:27 | 只看该作者
具备硬件 CRC 计算、发送和校验功能,可提高数据传输的可靠性,确保数据在传输过程中的准确性和完整性。

使用特权

评论回复
6
八层楼| | 2025-2-5 22:11 | 只看该作者
DMA 可以在不占用 CPU 资源的情况下,实现内存与外设或内存与内存之间的高速数据传输,大大提高了系统的运行效率,尤其适用于大量数据的传输场景。

使用特权

评论回复
7
观海| | 2025-2-6 15:47 | 只看该作者
GD32H7 的 DMA 具有多种可配置参数,如传输方向、数据宽度、优先级等,可根据具体的应用需求进行灵活设置。

使用特权

评论回复
8
guanjiaer| | 2025-2-6 17:51 | 只看该作者
通过 SYNC 功能,可以使 SPI 接口与其他外设或系统时钟进行同步,确保数据传输的稳定性和准确性。

使用特权

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

本版积分规则

27

主题

103

帖子

0

粉丝