完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在尝试将 SPI 通信发送到由 DMA 处理的外围设备。我已经查看了 STM32L0 参考手册和 LL 库,以及关闭示例。我能够让 Tx 操作正常工作。但是,我无法让 Rx 工作。Rx 变量始终显示为空。
我一直在环回模式下尝试这个操作,在 MISO 和 MOSI 之间有一个外部连接。无论我发送什么,都应该在接收者变量位置结束。但是,这不会发生。相反,Rx 数据变量永远不会改变。 我可以在这里获得一些见解吗? 而 (1) { mdsendBuffer[0] = i; 配置_DMA(); 激活_SPI(); WaitAndCheckEndOfTransfer(); } void Configure_DMA(void) { /* DMA1 用于 SPI1 传输 * DMA1 用于 SPI1 接收 */ uint8_t 温度 = 0; /* (1) 使能DMA1和DMA1的时钟 */ LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); /* (2) 为 DMA 传输完成/错误中断配置 NVIC */ NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0); NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0); // NVIC_SetPriority(DMA1_Channel3_IRQn, 0); NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); /* (3) 配置DMA1_Channel2功能参数,Receive Channel */ LL_DMA_ConfigTransfer(DMA1,LL_DMA_CHANNEL_2,LL_DMA_DIRECtiON_PERIPH_TO_MEMORY | LL_DMA_PRIORITY_HIGH | LL_DMA_MODE_NORMAL | LL_DMA_PERIPH_NOINCREMENT | LL_DMA_MEMORY_INCREMENT | LL_DMA_PDATAALIGN_BYTE | LL_DMA_MDATAALIGN_BYTE); LL_DMA_ConfigAddresses(DMA1, LL_DMA_CHANNEL_2, LL_SPI_DMA_GetRegAddr(SPI1), (uint32_t)&mdrcvBuffer, LL_DMA_DIRECTION_PERIPH_TO_MEMORY); LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_2, sizeof(mdsendBuffer)); //LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_2, LL_DMA_REQUEST_0); //////////////// /* (4) 配置DMA1_Channel3功能参数,即Transmit Channel */ LL_DMA_ConfigTransfer(DMA1,LL_DMA_CHANNEL_3,LL_DMA_DIRECTION_MEMORY_TO_PERIPH | LL_DMA_PRIORITY_HIGH | LL_DMA_MODE_NORMAL | LL_DMA_PERIPH_NOINCREMENT | LL_DMA_MEMORY_INCREMENT | LL_DMA_PDATAALIGN_BYTE | LL_DMA_MDATAALIGN_BYTE); LL_DMA_ConfigAddresses(DMA1, LL_DMA_CHANNEL_3, (uint32_t)&mdsendBuffer, LL_SPI_DMA_GetRegAddr(SPI1), LL_DMA_DIRECTION_MEMORY_TO_PERIPH); LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_3, sizeof(mdsendBuffer)); //LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_3, LL_DMA_REQUEST_0); ///////////////// /* (5) 启用 DMA 中断完成/错误 */ LL_DMA_DisableIT_HT(DMA1, LL_DMA_CHANNEL_2); LL_DMA_EnableIT_TC (DMA1, LL_DMA_CHANNEL_2); LL_DMA_EnableIT_TE (DMA1, LL_DMA_CHANNEL_2); LL_DMA_DisableIT_HT(DMA1, LL_DMA_CHANNEL_3); LL_DMA_EnableIT_TC (DMA1, LL_DMA_CHANNEL_3); LL_DMA_EnableIT_TE (DMA1, LL_DMA_CHANNEL_3); } void Activate_SPI(void) { /* 启用 SPI1 */ CS_MSA_ON; LL_SPI_Enable(SPI1); NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0); NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0); NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); /* 启用 DMA 通道 */ LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_2); LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_3); } 静态无效 MX_SPI1_Init(无效) { /* 用户代码开始 SPI1_Init 0 */ /* 用户代码结束 SPI1_Init 0 */ LL_SPI_InitTypeDef SPI_InitStruct = {0}; LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 外设时钟使能 */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); /**SPI1 GPIO 配置 PA5 ------> SPI1_SCK PA6 ------> SPI1_MISO PA7 ------> SPI1_MOSI */ GPIO_InitStruct.Pin = LL_GPIO_PIN_5; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_0; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_6; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_0; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_7; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF_0; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* SPI1 DMA 初始化 */ /* SPI1_TX 初始化 */ LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_3, LL_DMA_REQUEST_1); LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_3, LL_DMA_DIRECTION_MEMORY_TO_PERIPH); LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PRIORITY_LOW); LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MODE_NORMAL); LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PERIPH_NOINCREMENT); LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MEMORY_INCREMENT); LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PDATAALIGN_BYTE); LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MDATAALIGN_BYTE); /* 用户代码开始 SPI1_Init 1 */ /* 用户代码结束 SPI1_Init 1 */ /* SPI1参数配置*/ SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX; SPI_InitStruct.Mode = LL_SPI_MODE_MASTER; SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT; SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW; SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE; SPI_InitStruct.NSS = LL_SPI_NSS_SOFT; SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2; SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST; SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; SPI_InitStruct.CRCPoly = 7; LL_SPI_Init(SPI1, &SPI_InitStruct); LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA); /* 用户代码开始 SPI1_Init 2 */ GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT; LL_SPI_Enable(SPI1); LL_SPI_EnableDMAReq_RX(SPI1); /* 启用 DMA TX 中断 */ LL_SPI_EnableDMAReq_TX(SPI1); /* 用户代码结束 SPI1_Init 2 */ } |
|
相关推荐
1个回答
|
|
发现问题:TIM2_UP 与 DMA 通道 2 中的 SPI1_RX 冲突。没有注意到冲突,因为它延伸到打印输出的背面。
|
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2648 浏览 1 评论
3213 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1787 浏览 1 评论
3616 浏览 6 评论
5996 浏览 21 评论
944浏览 4评论
1318浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
588浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1307浏览 3评论
1367浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 13:09 , Processed in 1.147231 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号