我们正在尝试使用 DMA 且 无中断在 STM32G070 MCU 上实现 SPI 接口。MOSI MISO 和 SCLK 都工作正常,但 NSS 信号的行为不符合我们的预期。我们需要的是从 1 到 0 的精确变化,表示传输开始,并且在传输完成后我们需要立即从 0 到 1。我们需要做什么才能获得这种行为?
SPI1 寄存器:
CR1:0x0105
CR2:0x1704
SPI 和 DMA 初始化:
- 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_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
- LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
- LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
- /** SPI1 GPIO Configuration +**/
- GPIO_InitStruct.Pin = SPI_SCK_PIN;
- 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(SPI_SCK_GPIO_Port, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = SPI_MOSI_PIN;
- 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(SPI_MOSI_GPIO_Port, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = SPI_MISO_PIN;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
- GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
- LL_GPIO_Init(SPI_MISO_GPIO_Port, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = SPI_NSS_PIN;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
- GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
- LL_GPIO_Init(SPI_NSS_GPIO_Port, &GPIO_InitStruct);
- LL_GPIO_SetOutputPin(SPI_NSS_GPIO_Port, SPI_NSS_PIN);
- /* SPI1 DMA Init */
- /* SPI1_RX Init */
- LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_SPI1_RX);
- LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
- LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_LOW);
- LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_NORMAL);
- LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);
- LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);
- LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_BYTE);
- LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_BYTE);
- /* SPI1_TX Init */
- LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_2, LL_DMAMUX_REQ_SPI1_TX);
- LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_2, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
- LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_2, LL_DMA_PRIORITY_LOW);
- LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MODE_NORMAL);
- LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_PERIPH_NOINCREMENT);
- LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MEMORY_INCREMENT);
- LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_2, LL_DMA_PDATAALIGN_BYTE);
- LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MDATAALIGN_BYTE);
- /* SPI1 parameter configuration*/
- SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
- SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
- SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
- SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
- SPI_InitStruct.ClockPhase = LL_SPI_PHASE_2EDGE;
- SPI_InitStruct.NSS = LL_SPI_NSS_HARD_OUTPUT;
- SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2;
- SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
- SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
- SPI_InitStruct.CRCPoly = 7;
- LL_SPI_Init(SPI1, &SPI_InitStruct);
- LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA);
- LL_SPI_DisableNSSPulseMgt(SPI1);
0
|
1个回答
|
|
|