打印
[GW低功耗蓝牙MCU]

GW3323的SPI DMA发送

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

GW3323的DMA发送,无SPI发送完成中断,使用的引脚为PA3/PA4,SPI时钟为6MHz:
/*******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);
}

发送函数通过DMA将数据发送出去,可通过读取SPI的标志位来判断数据是否发送完成,此处可进行while等待,等待发送完成后,在进行下次的发送,故会浪费时间在等待发送完成处
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发送完成中断:
此出打开了SPI的发送完成中断,可以不用死等SPI发送完成,留出时间给主循环干其它事情,当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发送完成中断**/
此中断为SPI发送和接收共同的中断,为0时为发送完成中断,为1时为接收完成中断,此处为热敏打印机的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
    {}
}

使用特权

评论回复
沙发
永恒的一瞥| | 2025-5-20 19:23 | 只看该作者
要先配置DMA,再使能。

使用特权

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

本版积分规则

12

主题

14

帖子

0

粉丝