LL库_STM32F407_SPI_DMA
相关文件
stm32f4xx_ll_spi.h
stm32f4xx_ll_spi.c
相关函数
轮询读取W25Q128ID示例
1、使能SPI
2、读ID函数
/* USER CODE BEGIN 1 */
//读取芯片ID
//返回值如下:
//0XEF13,表示芯片型号为W25Q80
//0XEF14,表示芯片型号为W25Q16
//0XEF15,表示芯片型号为W25Q32
//0XEF16,表示芯片型号为W25Q64
//0XEF17,表示芯片型号为W25Q128
//0XEF18,表示芯片型号为W25Q256
uint16_t W25QXX_ReadID(void)
{
uint16_t Temp = 0;
LL_GPIO_ResetOutputPin(W_CS_GPIO_Port, W_CS_Pin);
while(!LL_SPI_IsActiveFlag_TXE(SPI1)){
}
LL_SPI_TransmitData8(SPI1,0x90);//发送读取ID命令
while(!LL_SPI_IsActiveFlag_TXE(SPI1)){
}
LL_SPI_TransmitData8(SPI1,0x00);
while(!LL_SPI_IsActiveFlag_TXE(SPI1)){
}
LL_SPI_TransmitData8(SPI1,0x00);
while(!LL_SPI_IsActiveFlag_TXE(SPI1)){
}
LL_SPI_TransmitData8(SPI1,0x00);
while(!LL_SPI_IsActiveFlag_TXE(SPI1)){
}
LL_SPI_TransmitData8(SPI1,0xFF);
while(!LL_SPI_IsActiveFlag_RXNE(SPI1)){
}
Temp|=LL_SPI_ReceiveData8(SPI1)<<8;
while(!LL_SPI_IsActiveFlag_TXE(SPI1)){
}
LL_SPI_TransmitData8(SPI1,0xFF);
while(!LL_SPI_IsActiveFlag_RXNE(SPI1)){
}
Temp|=LL_SPI_ReceiveData8(SPI1);
LL_GPIO_SetOutputPin(W_CS_GPIO_Port, W_CS_Pin);
return Temp;
}
/* USER CODE END 1 */
3、仿真效果
DMA收发读取W25Q128ID示例
1、cubemx配置
2、部分代码
spi.c
uint8_t rx_buf[6]={0};
uint8_t tx_buf[6]={0x90,0x00,0x00,0x00,0xff,0xff};
/*接收配置*/
LL_DMA_ConfigAddresses(DMA2, LL_DMA_STREAM_0, LL_SPI_DMA_GetRegAddr(SPI1),
(uint32_t)rx_buf,LL_DMA_GetDataTransferDirection(DMA2, LL_DMA_STREAM_0));
LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_0, sizeof(rx_buf));
//使能DMA传输完成中断
LL_DMA_EnableIT_TC(DMA2, LL_DMA_STREAM_0);
//使能DMA,SPI接收
LL_SPI_EnableDMAReq_RX(SPI1);
/*发送配置*/
LL_DMA_ConfigAddresses(DMA2, LL_DMA_STREAM_3, (uint32_t)tx_buf,LL_SPI_DMA_GetRegAddr(SPI1),
LL_DMA_GetDataTransferDirection(DMA2, LL_DMA_STREAM_3));
LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_3, sizeof(tx_buf));
//使能传输完成中断
LL_DMA_EnableIT_TC(DMA2, LL_DMA_STREAM_3);
//使能DMA,SPI发送
LL_SPI_EnableDMAReq_TX(SPI1);
LL_mDelay(1000);
//开始传输
LL_SPI_Enable(SPI1);
LL_GPIO_ResetOutputPin(W_CS_GPIO_Port, W_CS_Pin);
//使能接收的DMA2 STREAM_0
LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_0);
//使能发送的DMA2 STREAM_3
LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_3);
main.c
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
LL_mDelay(100);
LL_GPIO_ResetOutputPin(W_CS_GPIO_Port, W_CS_Pin);
//再次接收
LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_0);
LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_0,sizeof(rx_buf));//sizeof(rx_buf)
LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_0);
//再次发�??
LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_3);
LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_3, sizeof(tx_buf));
LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_3);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
it.c
void DMA2_Stream0_IRQHandler(void)
{
/* USER CODE BEGIN DMA2_Stream0_IRQn 0 */
//接收
if(LL_DMA_IsActiveFlag_TC0(DMA2)){
LL_DMA_ClearFlag_TC0(DMA2);
LL_USART_TransmitData8(USART1, rx_buf[0]);
LL_USART_TransmitData8(USART1, rx_buf[1]);
memset(rx_buf,0x00,sizeof(rx_buf));
LL_GPIO_SetOutputPin(W_CS_GPIO_Port, W_CS_Pin);
}
/* USER CODE END DMA2_Stream0_IRQn 0 */
/* USER CODE BEGIN DMA2_Stream0_IRQn 1 */
/* USER CODE END DMA2_Stream0_IRQn 1 */
}
/**
* @brief This function handles DMA2 stream3 global interrupt.
*/
void DMA2_Stream3_IRQHandler(void)
{
/* USER CODE BEGIN DMA2_Stream3_IRQn 0 */
//发�??
if(LL_DMA_IsActiveFlag_TC3(DMA2)){
LL_DMA_ClearFlag_TC3(DMA2);
}
/* USER CODE END DMA2_Stream3_IRQn 0 */
/* USER CODE BEGIN DMA2_Stream3_IRQn 1 */
/* USER CODE END DMA2_Stream3_IRQn 1 */
}
第一次接收完成数据