新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2020-12-3
- 在线时间
- 6 小时
|
发表于 2022-8-23 22:18:00
|
显示全部楼层
HAL咋实现?
void SPI1_DMARX_BUF(u8 *buffer,u16 len)
{
u8 temp=0xff;
//使能spi的dma发送接收请求
SPI1_Handler.Instance->CR2 |= SPI_CR2_TXDMAEN;
SPI1_Handler.Instance->CR2 |= SPI_CR2_RXDMAEN;
SPI1_RXDMA_Handler.Instance->CNDTR=len; //设置传输的数据长度
SPI1_RXDMA_Handler.Instance->CMAR=(uint32_t)buffer; //设置内存缓冲区地址
SPI1_RXDMA_Handler.Instance->CPAR = (uint32_t)(&SPI1_Handler.Instance->DR);
/*SPI作为主机进行数据接收时必须要主动产生时钟,因此此处必须有DMA通道3的配合*/
SPI1_TXDMA_Handler.Instance->CNDTR=len;
SPI1_TXDMA_Handler.Instance->CMAR=(uint32_t)(&temp); //temp=0xff
SPI1_TXDMA_Handler.Instance->CCR&=~DMA_MINC_ENABLE; //内存地址非自增
SPI1_TXDMA_Handler.Instance->CPAR = (uint32_t)(&SPI1_Handler.Instance->DR);
//首先启动DMA通道3
//__HAL_DMA_ENABLE(&SPI1_RXDMA_Handler);
SPI1_TXDMA_Handler.Instance->CCR |= DMA_CCR_EN;
//再启动DMA通道2
//__HAL_DMA_ENABLE(&SPI1_TXDMA_Handler);
SPI1_RXDMA_Handler.Instance->CCR |= DMA_CCR_EN;
//等待DMA通道2接收数据完成
while(!__HAL_DMA_GET_FLAG(&SPI1_RXDMA_Handler,DMA_FLAG_TC2));
//清除DMA通道2与3的传输完成标志
__HAL_DMA_CLEAR_FLAG(&SPI1_TXDMA_Handler,DMA_FLAG_TC2);
__HAL_DMA_CLEAR_FLAG(&SPI1_RXDMA_Handler,DMA_FLAG_TC3);
//使DMA通道2与3停止工作
//__HAL_DMA_DISABLE(&SPI1_TXDMA_Handler);
//__HAL_DMA_DISABLE(&SPI1_RXDMA_Handler);
SPI1_TXDMA_Handler.Instance->CCR &= ~DMA_CCR_EN;
SPI1_RXDMA_Handler.Instance->CCR &= ~DMA_CCR_EN;
SPI1_TXDMA_Handler.Instance->CCR|=DMA_MINC_ENABLE; //将DMA通道3恢复为内存地址自增方式
}
读取函数改成这个样子不知道那里有问题,试了不行 |
|