• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

S-P-I问题

drepa 2017-08-29 浏览量:994

void SPI1_Init()
{
  __HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
  HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);

__HAL_RCC_SPI1_CLK_ENABLE();
SPI1_Handler.Instance = SPI1;
  SPI1_Handler.Init.Mode = SPI_MODE_MASTER;
//SPI主模式
  SPI1_Handler.Init.Direction = SPI_DIRECTION_2LINES;
//SPI双线模式
  SPI1_Handler.Init.DataSize = SPI_DATASIZE_8BIT;
//8位帧模式
  SPI1_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH;
//空闲时为高电平
  SPI1_Handler.Init.CLKPhase = SPI_PHASE_2EDGE;
//第二个跳变沿开始采样
  SPI1_Handler.Init.NSS = SPI_NSS_SOFT;
//内部NSS信号由软件控制
  SPI1_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;
//2分频
  SPI1_Handler.Init.FirstBit = SPI_FIRSTBIT_MSB;
//数据传输由高位开始
  SPI1_Handler.Init.TIMode = SPI_TIMODE_DISABLE;
//关闭TI模式
__HAL_SPI_ENABLE(&SPI1_Handler);
  HAL_SPI_Init(&SPI1_Handler); 
SPI1_ReadWriteByte(0xff); 
__HAL_RCC_DMA2_CLK_ENABLE();
DMA2_SPI1_RX.Instance = DMA2_Channel3;
DMA2_SPI1_RX.Init.Request = DMA_REQUEST_4;
DMA2_SPI1_RX.Init.Direction = DMA_PERIPH_TO_MEMORY;
  DMA2_SPI1_RX.Init.PeriphInc = DMA_PINC_DISABLE;
  DMA2_SPI1_RX.Init.MemInc = DMA_MINC_ENABLE;
  DMA2_SPI1_RX.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  DMA2_SPI1_RX.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  DMA2_SPI1_RX.Init.Mode = DMA_CIRCULAR;
  DMA2_SPI1_RX.Init.Priority = DMA_PRIORITY_LOW;
  HAL_DMA_Init(&DMA2_SPI1_RX);
__HAL_LINKDMA(&SPI1_Handler,hdmarx,DMA2_SPI1_RX);
DMA2_SPI1_TX.Instance = DMA2_Channel4;
  DMA2_SPI1_TX.Init.Request = DMA_REQUEST_4;
  DMA2_SPI1_TX.Init.Direction = DMA_MEMORY_TO_PERIPH;
  DMA2_SPI1_TX.Init.PeriphInc = DMA_PINC_DISABLE;
  DMA2_SPI1_TX.Init.MemInc = DMA_MINC_ENABLE;
  DMA2_SPI1_TX.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  DMA2_SPI1_TX.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  DMA2_SPI1_TX.Init.Mode = DMA_CIRCULAR;
  DMA2_SPI1_TX.Init.Priority = DMA_PRIORITY_LOW;
  HAL_DMA_Init(&DMA2_SPI1_TX);
  __HAL_LINKDMA(&SPI1_Handler,hdmatx,DMA2_SPI1_TX);
}
如题,使用SPI1挂载DMA,HAL_SPI_Transmit()函数能用,但是HAL_SPI_Transmit_DMA()函数却不能用,这是什么情况?

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案

其他答案 数量:4
  • HAL_SPI_Transmit()函数的发送是不通过DMA的,可以发送的话,你的SPI配置是对的。

    HAL_SPI_Transmit_DMA()此函数使用DMA进行发送。不行的话,是你DMA配置问题。



    • 发布于2017-08-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 您看看DMA配置和中斷有沒有設置正確

    可以用CubeMX輔助設置


    • 发布于2017-08-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个只是程序的一部分,很难看出原因。

    HAL_SPI_Transmit_DMA() 直接调用这个库函数,按道理是可以用的。

    要么是初始化出现了问题。

    你要通过单步调试等方法来找原因。

    • 发布于2017-08-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个只是程序的一部分,很难看出原因。
    HAL_SPI_Transmit_DMA() 直接调用这个库函数,按道理是可以用的。
    要么是初始化出现了问题。
    你要通过单步调试等方法来找原因。

    • 发布于2017-08-31
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

S-P-I问题