本帖最后由 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
{}
}
|