配置后无法正常使用
#define SPI_LCD_Tx_DMA_Channel LL_DMA_CHANNEL_4
#define BufferSize 256
uint8_t SPI_LCD_Buffer_Tx[BufferSize];
void SPI_Screen_Config(void)
{
LL_SPI_InitTypeDef SPI_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOD);
/**SPI1 GPIO Configuration
PB3 ------> SPI1_SCK
PB5 ------> SPI1_SDI
NONE ------> SPI1_MISO 无
PB8 ------> LCD_BL 背光
PD3 ------> LCD_DC 写控制
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_3; // SCK
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_5; // SDI
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_4; // CS
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_8; // BL
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_3; // DC
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOD, &GPIO_InitStruct);
#if 1
/* SPI1 DMA Init */
LL_DMA_DeInit(DMA1,LL_DMA_CHANNEL_4);
LL_DMA_DeInit(DMA1,LL_DMA_CHANNEL_5);
/* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */
LL_DMA_ConfigTransfer(DMA1, SPI_LCD_Tx_DMA_Channel,
LL_DMA_DIRECTION_PERIPH_TO_MEMORY | \
LL_DMA_PRIORITY_VERYHIGH | \
LL_DMA_MODE_NORMAL | \
LL_DMA_PERIPH_NOINCREMENT | \
LL_DMA_MEMORY_INCREMENT | \
LL_DMA_PDATAALIGN_BYTE | \
LL_DMA_MDATAALIGN_BYTE);
//外设地址
LL_DMA_SetPeriphAddress(DMA1,SPI_LCD_Tx_DMA_Channel,LL_SPI_DMA_GetRegAddr(SPI1));
//外设请求DMA
LL_DMA_SetPeriphRequest(DMA1, SPI_LCD_Tx_DMA_Channel, LL_DMAMUX_REQ_SPI1_TX);
LL_DMA_SetMemoryAddress(DMA1, SPI_LCD_Tx_DMA_Channel, (u32)SPI_LCD_Buffer_Tx);//配置DMA传输内存区地址(寄存器配置)
LL_DMA_SetDataLength(DMA1,SPI_LCD_Tx_DMA_Channel,256);//配置DMA传输数据长度(寄存器配置)
//NVIC_SetPriority(DMA1_Ch4_5_DMAMUX1_OVR_IRQn, 1);
//NVIC_EnableIRQ(DMA1_Ch4_5_DMAMUX1_OVR_IRQn);
//LL_DMA_EnableIT_TC(DMA1, SPI_LCD_Tx_DMA_Channel);//使能DMA通道4完成中断
#if 0
/* SPI1_TX Init */
LL_DMA_SetPeriphRequest(DMA1, SPI_LCD_Tx_DMA_Channel, LL_DMAMUX_REQ_SPI1_TX);
// DMA传输方向 内存->外设
LL_DMA_SetDataTransferDirection(DMA1, SPI_LCD_Tx_DMA_Channel, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
// 通道优先级 低
LL_DMA_SetChannelPriorityLevel(DMA1, SPI_LCD_Tx_DMA_Channel, LL_DMA_PRIORITY_VERYHIGH);
// DMA模式 正常
LL_DMA_SetMode(DMA1, SPI_LCD_Tx_DMA_Channel, LL_DMA_MODE_NORMAL);
// 外设地址递增模式 失能
LL_DMA_SetPeriphIncMode(DMA1, SPI_LCD_Tx_DMA_Channel, LL_DMA_PERIPH_NOINCREMENT);
// 内存地址递增模式 使能
LL_DMA_SetMemoryIncMode(DMA1, SPI_LCD_Tx_DMA_Channel, LL_DMA_MEMORY_INCREMENT);
// 外设传输大小 字节
LL_DMA_SetPeriphSize(DMA1, SPI_LCD_Tx_DMA_Channel, LL_DMA_PDATAALIGN_BYTE);
// 内存传输大小 字节
LL_DMA_SetMemorySize(DMA1, SPI_LCD_Tx_DMA_Channel, LL_DMA_MDATAALIGN_BYTE);
//外设地址
LL_DMA_SetPeriphAddress(DMA1,SPI_LCD_Tx_DMA_Channel,LL_SPI_DMA_GetRegAddr(SPI1));
#endif
#endif
// SPI参数配置
SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX; // 全双工
SPI_InitStruct.Mode = LL_SPI_MODE_MASTER; // SPI Master
SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT; // SPI传送宽度 8bit
SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_HIGH; // 极性 Low
SPI_InitStruct.ClockPhase = LL_SPI_PHASE_2EDGE; // 相位 1EDGE
SPI_InitStruct.NSS = LL_SPI_NSS_SOFT; // 软件NSS 软件自动控制SPI的片选信号
SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2; // SPI波特率8分频 8Mbits/S
SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST; // 高位前导
SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; // 禁用crc
SPI_InitStruct.CRCPoly = 7;
LL_SPI_Init(SPI1, &SPI_InitStruct);
LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA); // SPI帧格式 MOTOROLA(use) / TI
LL_SPI_EnableNSSPulseMgt(SPI1); // NSS pulse management
LL_SPI_SetRxFIFOThreshold(SPI1, LL_SPI_RX_FIFO_TH_QUARTER);//设置RX非空事件产生的FIFO阈值,根据通信时最小数据的大小设置,我这边最小为8位,所以设置为四分之一
LL_SPI_Enable(SPI1);
LL_SPI_EnableDMAReq_TX(SPI1);
//LL_I2S_EnableDMAReq_TX(SPI1);
//使能DMA
LL_DMA_DisableChannel(DMA1, SPI_LCD_Tx_DMA_Channel); //使能DMA
LCD_CS(0);
}
//DMA 发送应用代码
void LCD_DMA_WriteData(u8 *buffer,u32 SizeLen)
{
LL_SPI_DisableDMAReq_TX (SPI1);
LL_DMA_DisableChannel(DMA1, SPI_LCD_Tx_DMA_Channel);//关闭DMA发送
LL_DMA_SetMemoryAddress(DMA1, SPI_LCD_Tx_DMA_Channel, (u32)buffer);//配置DMA传输内存区地址(寄存器配置)
LL_DMA_SetDataLength(DMA1,SPI_LCD_Tx_DMA_Channel,SizeLen);//配置DMA传输数据长度(寄存器配置)
LL_DMA_ClearFlag_GI4(DMA1);
LL_SPI_EnableDMAReq_TX(SPI1);
LCD_CS(0);
LCD_DC(1);
LL_DMA_EnableChannel(DMA1, SPI_LCD_Tx_DMA_Channel);//开始DMA发送
while(!LL_DMA_IsActiveFlag_TC4(DMA1));
LL_DMA_ClearFlag_GI4(DMA1);
//while(!LL_SPI_IsEnabledDMAReq_TX(SPI1));
}
不懂怎么改