打印
[GW低功耗蓝牙MCU]

GW3323的SPI DMA发送

[复制链接]
69|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LIZARD925|  楼主 | 2025-5-15 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 LIZARD925 于 2025-5-15 23:17 编辑

DMA发送,无发送完成中断:
/*******SPI******/
#define TPH_SPI_GPIO    GPIOA_REG
#define TPH_SPI_CLK     GPIO_PIN_3
#define TPH_SPI_DAT     GPIO_PIN_4
#define TPH_SPI_MHZ     6
/*********************/


/******打印头-SPI1*****/
extern const u32 sys_clk_geehy[];
void spi_tph_init(void)
{
    u32 sysclk;
    gpio_init_typedef gpio_init_structure;
    spi_init_typedef spi_init_structure;

    clock_gate1_cmd(CLOCK_GATE1_SPI1, ENABLE);

    gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
    gpio_init_structure.gpio_fen = GPIO_FEN_PER;
    gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
    gpio_init_structure.gpio_pupd = GPIO_PUPD_UP;

    gpio_init_structure.gpio_pin = GPIO_PIN_3;          //CLK
    gpio_init(GPIOA_REG, &gpio_init_structure);

    gpio_init_structure.gpio_pin = GPIO_PIN_4;          //DIO
    gpio_init(GPIOA_REG, &gpio_init_structure);
    gpio_func_mapping(SPI1_MAP_G1);

    sysclk = get_cur_sysclk();
    printf("sysclk = %d MHz",sys_clk_geehy[sysclk]);
    spi_init_structure.baud = sys_clk_geehy[sysclk]/(TPH_SPI_MHZ) - 1;   //

    spi_init_structure.bus_mode = SPI_2WIRE_MODE;
    spi_init_structure.clk_mode = SPI_CLK_LOW;     //时钟空闲时为低
    spi_init_structure.spi_sm = 0;      //Slave mode select bit.0: master mode
    spi_init_structure.spi_oss = 0;     //SPI sample data is at the same clock edge with output data.0:difference,1:same
    spi_init_structure.spi_smps = 0;    //SPI output edge select bit.0: output data at the falling edge;
    spi_init(SPI1, &spi_init_structure);

    spi_cmd(SPI1, ENABLE);
}

unsigned char TphSpiDmaFinish=0;    //spi发送是否完成
AT(.com_text.isr)
void tph_spi_send(unsigned char buf[],unsigned short len)
{
    spi_set_dma_addr(SPI1, (u32)buf);
    spi_set_dma_cnt(SPI1, len);
    TphSpiDmaFinish=0;
}

AT(.com_text.isr)
unsigned char tph_transmit_is_over(void)
{
    if(spi_get_flag(SPI1, SPI_FLAG_PENDING))
    {
        TphSpiDmaFinish=1;
    }
    else
    {
        return 0;
    }
    return TphSpiDmaFinish;
}
/**************************/



DMA+SPI发送完成中断:
/******打印头-SPI1*****/
void spi_irq_init(void) //spidma中断初始化
{
    SPI1CPND |= BIT(16);                    // 清除挂起
    register_isr(IRQ_SPI_VECTOR, spi1_isr); // 设置spi1中断向量入口
    PICPR &= ~BIT(IRQ_SPI_VECTOR);          // 设置spi中断优先级, 0=低优先级中断
    PICEN |= BIT(IRQ_SPI_VECTOR);           // 设置spi中断使能, 1 = enable
}
extern const u32 sys_clk_geehy[];
void spi_tph_init(void)
{
    u32 sysclk;
    gpio_init_typedef gpio_init_structure;
    spi_init_typedef spi_init_structure;

    clock_gate1_cmd(CLOCK_GATE1_SPI1, ENABLE);

    gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
    gpio_init_structure.gpio_fen = GPIO_FEN_PER;
    gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
    gpio_init_structure.gpio_pupd = GPIO_PUPD_UP;

    gpio_init_structure.gpio_pin = GPIO_PIN_3;          //CLK
    gpio_init(GPIOA_REG, &gpio_init_structure);

    gpio_init_structure.gpio_pin = GPIO_PIN_4;          //DIO
    gpio_init(GPIOA_REG, &gpio_init_structure);
    gpio_func_mapping(SPI1_MAP_G1);

    sysclk = get_cur_sysclk();
    printf("sysclk = %d MHz\n",sys_clk_geehy[sysclk]);
    spi_init_structure.baud = sys_clk_geehy[sysclk]/(TPH_SPI_MHZ) - 1;   //

    spi_init_structure.bus_mode = SPI_2WIRE_MODE;
    spi_init_structure.clk_mode = SPI_CLK_LOW;     //时钟空闲时为低
    spi_init_structure.spi_sm = 0;      //Slave mode select bit.0: master mode
    spi_init_structure.spi_oss = 0;     //SPI sample data is at the same clock edge with output data.0:difference,1:same
    spi_init_structure.spi_smps = 0;    //SPI output edge select bit.0: output data at the falling edge;
    spi_init(SPI1, &spi_init_structure);

    spi_irq_init();                 //SPI 中断初始化
    SPI1CON |= (BIT(0) | BIT(7));   //打开中断
    spi_cmd(SPI1, ENABLE);
}

AT(.com_text.isr)
void tph_spi_send(unsigned char buf[],unsigned short len)
{
    SPI1CON &= ~BIT(4);                     // TX
    SPI1DMAADR = DMA_ADR(buf);
    SPI1DMACNT = len;
}
/**************************/
/**SPI发送完成中断**/
AT(.com_text.isr)
void spi1_isr(void)
{
    SPI1CPND |= BIT(16);
    if ((SPI1CON & BIT(4)) == 0) // 0, Tx done; 1, Rx done
    {
//        printk(str_2);
    }
    else
    {}
}

使用特权

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

本版积分规则

11

主题

13

帖子

0

粉丝