OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6020|回复: 9

新手stm32f1 spi1 dma无反应,不知道啥原因

[复制链接]

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-9-5
在线时间
3 小时
发表于 2021-9-5 14:23:07 | 显示全部楼层 |阅读模式
1金钱
使用CubeMx V6.3 FW_F1 V1.8.4 SPI1配置成DMA模式接收发送。
使用 HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)&dataTx, (uint8_t *)&dataRx, 6, 10000);可以正常操作,
使用HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t *)&dataTx, (uint8_t *)&dataRx, 6);就检测不到时钟,数据。
但是会进入DMA发送中断。
void DMA1_Channel3_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Channel3_IRQn 0 */

  /* USER CODE END DMA1_Channel3_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_spi1_tx);
  /* USER CODE BEGIN DMA1_Channel3_IRQn 1 */
        setCS(HIGH);
  /* USER CODE END DMA1_Channel3_IRQn 1 */
}


  • static void MX_DMA_Init(void)
  • {
  •   /* DMA controller clock enable */
  •   __HAL_RCC_DMA1_CLK_ENABLE();
  •   /* DMA interrupt init */
  •   /* DMA1_Channel2_IRQn interrupt configuration */
  •   HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 2, 0);
  •   HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
  •   /* DMA1_Channel3_IRQn interrupt configuration */
  •   HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 1, 0);
  •   HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
  • }
  • static void MX_SPI1_Init(void)
  • {
  •   /* USER CODE BEGIN SPI1_Init 0 */
  •   /* USER CODE END SPI1_Init 0 */
  •   /* USER CODE BEGIN SPI1_Init 1 */
  •   /* USER CODE END SPI1_Init 1 */
  •   /* SPI1 parameter configuration*/
  •   hspi1.Instance = SPI1;
  •   hspi1.Init.Mode = SPI_MODE_MASTER;
  •   hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  •   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  •   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  •   hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  •   hspi1.Init.NSS = SPI_NSS_SOFT;
  •   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  •   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  •   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  •   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  •   hspi1.Init.CRCPolynomial = 10;
  •   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN SPI1_Init 2 */
  •   /* USER CODE END SPI1_Init 2 */
  • }
  • void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
  • {
  •   GPIO_InitTypeDef GPIO_InitStruct = {0};
  •   if(hspi->Instance==SPI1)
  •   {
  •   /* USER CODE BEGIN SPI1_MspInit 0 */
  •   /* USER CODE END SPI1_MspInit 0 */
  •     /* Peripheral clock enable */
  •     __HAL_RCC_SPI1_CLK_ENABLE();
  •     __HAL_RCC_GPIOA_CLK_ENABLE();
  •     /**SPI1 GPIO Configuration
  •     PA5     ------> SPI1_SCK
  •     PA6     ------> SPI1_MISO
  •     PA7     ------> SPI1_MOSI
  •     */
  •     GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
  •     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  •     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  •     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  •     GPIO_InitStruct.Pin = GPIO_PIN_6;
  •     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  •     GPIO_InitStruct.Pull = GPIO_NOPULL;
  •     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  •     /* SPI1 DMA Init */
  •     /* SPI1_TX Init */
  •     hdma_spi1_tx.Instance = DMA1_Channel3;
  •     hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  •     hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  •     hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
  •     hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  •     hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  •     hdma_spi1_tx.Init.Mode = DMA_NORMAL;
  •     hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
  •     if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
  •     {
  •       Error_Handler();
  •     }
  •     __HAL_LINKDMA(hspi,hdmatx,hdma_spi1_tx);
  •     /* SPI1_RX Init */
  •     hdma_spi1_rx.Instance = DMA1_Channel2;
  •     hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  •     hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  •     hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;
  •     hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  •     hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  •     hdma_spi1_rx.Init.Mode = DMA_NORMAL;
  •     hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW;
  •     if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)
  •     {
  •       Error_Handler();
  •     }
  •     __HAL_LINKDMA(hspi,hdmarx,hdma_spi1_rx);
  •     /* SPI1 interrupt Init */
  •     HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);
  •     HAL_NVIC_EnableIRQ(SPI1_IRQn);
  •   /* USER CODE BEGIN SPI1_MspInit 1 */
  •   /* USER CODE END SPI1_MspInit 1 */
  •   }
  •   else if(hspi->Instance==SPI2)
  •   {
  •   /* USER CODE BEGIN SPI2_MspInit 0 */
  •   /* USER CODE END SPI2_MspInit 0 */
  •     /* Peripheral clock enable */
  •     __HAL_RCC_SPI2_CLK_ENABLE();
  •     __HAL_RCC_GPIOB_CLK_ENABLE();
  •     /**SPI2 GPIO Configuration
  •     PB13     ------> SPI2_SCK
  •     PB14     ------> SPI2_MISO
  •     PB15     ------> SPI2_MOSI
  •     */
  •     GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
  •     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  •     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  •     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  •     GPIO_InitStruct.Pin = GPIO_PIN_14;
  •     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  •     GPIO_InitStruct.Pull = GPIO_NOPULL;
  •     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  •   /* USER CODE BEGIN SPI2_MspInit 1 */
  •   /* USER CODE END SPI2_MspInit 1 */
  •   }
  • }
  • int main(void)
  • {
  •   /* USER CODE BEGIN 1 */
  •   /* USER CODE END 1 */
  •   /* MCU Configuration--------------------------------------------------------*/
  •   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  •   HAL_Init();
  •   /* USER CODE BEGIN Init */
  •   /* USER CODE END Init */
  •   /* Configure the system clock */
  •   SystemClock_Config();
  •   /* USER CODE BEGIN SysInit */
  •   /* USER CODE END SysInit */
  •   /* Initialize all configured peripherals */
  •   MX_GPIO_Init();
  •   MX_SPI1_Init();
  •   MX_SPI2_Init();
  •   MX_USART1_UART_Init();
  •   MX_DMA_Init();
  •   MX_USART2_UART_Init();
  •   /* USER CODE BEGIN 2 */
  •         WriteData(REG_SOFTWARE_RESET,0,0);//DAC¸′λ
  •         WriteData(REG_WRITE_UPDATE_DAC_CHANNEL,DAC_A,16384);//μ÷êÔéèò»¸öDAC
  •         WriteData(REG_WRITE_UPDATE_DAC_CHANNEL,DAC_B,16384);//μ÷êÔéèò»¸öDAC
  •         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);
  •         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
  •         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
  •         setCS(LOW);
  •         //HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)&dataTx, (uint8_t *)&dataRx, 6, 10000);
  •         HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t *)&dataTx, (uint8_t *)&dataRx, 6);
  • //        hspi1->Instance->CR3 |= USART_CR3_DMAT;//ê1Äü′®¿úDMA·¢Ëí
  • //setCS(HIGH);
  • //        adcStartup();
  • //        adc_channel_data         ADCtemp;
  •   /* USER CODE END 2 */
  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)







最佳答案

查看完整内容[请看2#楼]

终于找到问题了,不知道算不算CUBE的BUG, MX_GPIO_Init(); MX_SPI1_Init(); MX_SPI2_Init(); MX_USART1_UART_Init(); MX_DMA_Init(); MX_USART2_UART_Init(); 这段程序先配置SPI1的DMA,再打开DMA的时钟。实际上DMA未开时钟,写操作是无效的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-9-5
在线时间
3 小时
 楼主| 发表于 2021-9-5 14:23:08 | 显示全部楼层
volnic 发表于 2021-9-6 19:17
发现  HAL_DMA_Init 里的 hdma->Instance->CCR = tmp 赋值出错,不能正确赋值。不知道怎么解决这个问题?顺 ...

终于找到问题了,不知道算不算CUBE的BUG,
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_USART1_UART_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
这段程序先配置SPI1的DMA,再打开DMA的时钟。实际上DMA未开时钟,写操作是无效的。
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-9-6 12:10:28 | 显示全部楼层
cube?建议先学标准库吧
回复

使用道具 举报

0

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2019-12-31
在线时间
29 小时
发表于 2021-9-6 13:30:54 | 显示全部楼层
lpwithv 发表于 2021-9-6 12:10
cube?建议先学标准库吧

用cube的基本就废了,以后找工作都找不到。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-9-5
在线时间
3 小时
 楼主| 发表于 2021-9-6 19:12:43 | 显示全部楼层
发现DMA初始化赋值不成功,
  hdma->Instance->CCR = tmp;这句话无效,造成CCR配置不成功,
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-9-5
在线时间
3 小时
 楼主| 发表于 2021-9-6 19:17:19 | 显示全部楼层
本帖最后由 volnic 于 2021-9-6 19:19 编辑

发现  HAL_DMA_Init 里的 hdma->Instance->CCR = tmp 赋值出错,不能正确赋值。不知道怎么解决这个问题?顺便问一下新人是不是无法上传图片


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-9-7 01:34:23 | 显示全部楼层
volnic 发表于 2021-9-6 19:17
发现  HAL_DMA_Init 里的 hdma->Instance->CCR = tmp 赋值出错,不能正确赋值。不知道怎么解决这个问题?顺 ...

直接操作寄存器。。。试试看
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-9-7 01:57:02 | 显示全部楼层
volnic 发表于 2021-9-6 19:17
发现  HAL_DMA_Init 里的 hdma->Instance->CCR = tmp 赋值出错,不能正确赋值。不知道怎么解决这个问题?顺 ...

直接操作寄存器试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2021-9-7 08:46:09 | 显示全部楼层
caoenq 发表于 2021-9-6 13:30
用cube的基本就废了,以后找工作都找不到。

我工作就是用cube的。 掌握了调试技巧基本上问题不大。
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2021-9-7 08:58:09 | 显示全部楼层
不要调用receive,调用transreceive
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 20:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表