金牌会员
 
- 积分
- 2357
- 金钱
- 2357
- 注册时间
- 2019-10-29
- 在线时间
- 380 小时
|

楼主 |
发表于 2021-11-29 14:13:54
|
显示全部楼层
本帖最后由 chenyuan 于 2021-11-29 14:15 编辑
今天进行了进一步测试,采用SPI+DMA配置(cubemx生成),使用软件控制NSS引脚
修改拉低拉高的位置,在
HAL_SPI_TransmitReceive_DMA(&hspi1, pTxData,pRxData,Size)
- /* Check if the SPI is already enabled */
- if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
- {
- /* Enable SPI peripheral */
- __HAL_SPI_ENABLE(hspi);
- }
- /* Enable the SPI Error Interrupt Bit */
- __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
- /* Enable Tx DMA Request */
- SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);
- error :
- /* Process Unlocked */
- __HAL_UNLOCK(hspi);
- return errorcode;
复制代码
在SPI_DMA的读写函数里,将GPIOA_15(NSS控制引脚)拉低,然后在DMA的中断回调函数
- void DMA1_Channel2_3_IRQHandler(void)
- {
- /* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */
- /* USER CODE END DMA1_Channel2_3_IRQn 0 */
- HAL_DMA_IRQHandler(&hdma_spi1_rx);
- HAL_DMA_IRQHandler(&hdma_spi1_tx);
- /* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 */
- if(__HAL_DMA_GET_IT_SOURCE(&hdma_spi1_rx, DMA_IT_TC)){
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
- }
- /* USER CODE END DMA1_Channel2_3_IRQn 1 */
- }
复制代码
当判断DMA_RX通道是DMA完成中断,然后将NSS引脚拉高,这样可以达到下图的效果:
可以看到两个字节间的距离是变短了,而且读取出的数据和我不采用DMA的时候是一致的,同时也保证了数据传输在NSS拉低时快速传输;
但是拉低的操作是修改的库(尽量不修改库),有什么方法,可以直接判断DMA准备传输前拉低NSS,传输完成后拉高NSS(DMA的中断就:传输一半,传输完成,传输错误);
请问大家在使用HAL_SPI_TransmitReceive_DMA(&hspi1, pTxData,pRxData,Size)函数时,NSS是如何控制的呢??
谢谢啦!
|
-
|