打印
[研电赛技术支持]

GD32F4系列I2C+DMA中断模式

[复制链接]
711|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sweet蜘蛛侠|  楼主 | 2022-8-18 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助 GD32F4系列I2C+DMA中断模式I2C初始化配置代码

static void GD_I2C_Init(void)
{
    /* enable clock */
    rcu_periph_clock_enable(I2C_SCL_GPIO_CLK);
          rcu_periph_clock_enable(I2C_SDA_GPIO_CLK);
    /* enable I2C0 clock */
    rcu_periph_clock_enable(I2C_CLK);

    /* connect PB6 to I2C0_SCL */
    gpio_af_set(I2C_SCL_GPIO_PORT, GPIO_AF_4, I2C_SCL_PIN);
    /* connect PB7 to I2C0_SDA */
    gpio_af_set(I2C_SDA_GPIO_PORT, GPIO_AF_4, I2C_SDA_PIN);
    /* configure GPIO pins of I2C0 */
    gpio_mode_set(I2C_SCL_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SCL_PIN);
    gpio_output_options_set(I2C_SCL_GPIO_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN);
    gpio_mode_set(I2C_SDA_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SDA_PIN);
    gpio_output_options_set(I2C_SDA_GPIO_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SDA_PIN);       
       
    /* configure I2C clock */
    i2c_clock_config(I2C_PORT,I2C_SPEED,I2C_DTCY_2);
    /* configure I2C address */
    i2c_mode_addr_config(I2C_PORT,I2C_I2CMODE_ENABLE,I2C_ADDFORMAT_7BITS,I2C_SLAVE_ADDRESS7);
    /* enable I2C0 */
    i2c_enable(I2C_PORT);
    /* enable acknowledge */
    i2c_ack_config(I2C_PORT,I2C_ACK_ENABLE);

                nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
                nvic_irq_enable(I2C_EV_IRQn, 1, 0);
                i2c_interrupt_enable(I2C_PORT, I2C_INT_EV);                               
}


void GD_I2C_DMA_Init(void)
{
                /* enable DMA clock */
                rcu_periph_clock_enable(RCU_DMA0);       

                dma_single_data_parameter_struct dma_init_struct;       
                /* initialize DMA channel1 */
                dma_deinit(DMA0, DMA_CH7);       

                dma_single_data_para_struct_init(&dma_init_struct);
                dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
                dma_init_struct.memory0_addr = (uint32_t)I2CSentBuff;
                dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
                dma_init_struct.periph_memory_width = DMA_MEMORY_WIDTH_8BIT;
                dma_init_struct.number = I2CSentBuff_Size;
                dma_init_struct.periph_addr = (uint32_t)&I2C_DATA(I2C_PORT);//
                dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
                dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
                dma_single_data_mode_init(DMA0, DMA_CH7, &dma_init_struct);
                /* configure DMA mode */
                dma_circulation_disable(DMA0, DMA_CH7);
                dma_channel_subperipheral_select(DMA0, DMA_CH7, DMA_SUBPERI1);//选择DMA0~1,CH0~7,Pherien0~7       
               
                /* initialize DMA channel2 */
                dma_deinit(DMA0, DMA_CH0);
                dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
                dma_init_struct.memory0_addr = (uint32_t)I2CRecvBuff;
                dma_init_struct.periph_addr = (uint32_t)&I2C_DATA(I2C_PORT);//
                dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
                dma_single_data_mode_init(DMA0, DMA_CH0, &dma_init_struct);
                dma_circulation_disable(DMA0, DMA_CH0);       
                dma_channel_subperipheral_select(DMA0, DMA_CH0, DMA_SUBPERI1);//选择DMA0~1,CH0~7,Pherien0~7       

                nvic_irq_enable(DMA0_Channel0_IRQn, 1, 0);
                nvic_irq_enable(DMA0_Channel7_IRQn, 1, 0);       
                dma_interrupt_enable(DMA0, DMA_CH0, DMA_CHXCTL_FTFIE);
                dma_interrupt_enable(DMA0, DMA_CH7, DMA_CHXCTL_FTFIE);       
}

中断后的通讯流程不知道应该如何处理?

if(i2c_flag_get(i2c_periph, I2C_FLAG_ADDSEND))
    {
        if(ADDSEND_FLAG<2)
                                {
                                        ADDSEND_FLAG++;
                                }
        /* clear ADDSEND bit */
        i2c_flag_clear(i2c_periph, I2C_FLAG_ADDSEND);
                                i2c_dma_config(I2C0,I2C_DMA_ON);
                    i2c_dma_last_transfer_config(I2C0,I2C_DMALST_ON);               
                                /* enable DMA channel2 */
                                dma_channel_enable(DMA0, DMA_CH0);
                                /* enable DMA channel1 */
                                dma_channel_enable(DMA0, DMA_CH7);                               
    }

        if(i2c_flag_get(i2c_periph, I2C_FLAG_STPDET))
        {

                i2c_enable(i2c_periph);
                i2c_interrupt_disable(i2c_periph, I2C_INT_EV);
                i2c_dma_config(I2C0,I2C_DMA_OFF);
                i2c_dma_last_transfer_config(I2C0,I2C_DMALST_OFF);               
                /* enable DMA channel2 */
                dma_channel_disable(DMA0, DMA_CH0);
                /* enable DMA channel1 */
                dma_channel_disable(DMA0, DMA_CH7);                                                       
        }

使用特权

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

本版积分规则

3

主题

7

帖子

0

粉丝