金牌会员
 
- 积分
- 2357
- 金钱
- 2357
- 注册时间
- 2019-10-29
- 在线时间
- 380 小时
|
1金钱
本帖最后由 chenyuan 于 2020-8-21 11:33 编辑
前段时间在弄 SPI+DMA 配置好后,(刚开始是软件控制片选)我直接在读写数据前后加上拉低/拉高电平,但是出现这个现象,如图1/2。然后我就在读写函数后加上了等待,然后出现如图3/4现象。在片选拉低后,要等比较长时间才能开始读写数据。所以我就想通过控制硬件片选来读写数据,但是每读写一个数据,片选就自动拉高了,那么有什么方法可以拉低硬件片选,读写完多个字节再拉高吗?下面代码是 硬件片选和SPI+DMA的配置
- /* SPI1 init function */
- void MX_SPI1_Init(void)
- {
- hspi1.Instance = SPI1;
- hspi1.Init.Mode = SPI_MODE_MASTER; //设置SPI工作模式,设置为主模式
- hspi1.Init.Direction = SPI_DIRECTION_2LINES; //设置SPI单向或者双向的数据模式:SPI设置为双线模式
- hspi1.Init.DataSize = SPI_DATASIZE_8BIT; //设置SPI的数据大小:SPI发送接收8位帧结构
- hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; //串行同步时钟的空闲状态为低电平
- hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
- hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; //NSS信号由软件控制 SPI_NSS_HARD_OUTPUT SPI_NSS_SOFT
- hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; //定义波特率预分频的值:波特率预分频值为4
- hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
- hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //关闭TI模式
- hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; //关闭硬件CRC校验
- hspi1.Init.CRCPolynomial = 7; //CRC值计算的多项式
- hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
- hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;//SPI_NSS_PULSE_DISABLE; //
-
- if (HAL_SPI_Init(&hspi1) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- }
- void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- if(spiHandle->Instance==SPI1)
- {
- /* USER CODE BEGIN SPI1_MspInit 0 */
- /* USER CODE END SPI1_MspInit 0 */
- /* SPI1 clock enable */
- __HAL_RCC_SPI1_CLK_ENABLE();
-
- /**SPI1 GPIO Configuration
- PB3 ------> SPI1_SCK
- PB4 ------> SPI1_MISO
- PB5 ------> SPI1_MOSI
- */
- GPIO_InitStruct.Pin = GPIO_PIN_15;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- GPIO_InitStruct.Pin = A7106_SCK_Pin|A7106_MISO_Pin|A7106_MOSI_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
- HAL_GPIO_Init(GPIOB, &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; //外设数据长度:8位
- hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
- hdma_spi1_tx.Init.Mode = DMA_NORMAL; //DMA普通模式
- hdma_spi1_tx.Init.Priority = DMA_PRIORITY_HIGH;
- if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- __HAL_LINKDMA(spiHandle,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_HIGH;
- if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx);
- /* USER CODE BEGIN SPI1_MspInit 1 */
- /* USER CODE END SPI1_MspInit 1 */
- }
- }
复制代码
|
最佳答案
查看完整内容[请看2#楼]
问题已解决,见:http://www.openedv.com/forum.php?mod=viewthread&tid=331756
|