完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的实施所需的最后一部分是 MCU 到 MCU 多从通信。
从硬件的角度来看,LTC6820 (isoSPI) 设备将用于连接到主机端的 STM32F4,最多 10 个 STM32F103 作为从设备。 LTC6820 将软件驱动为 CS 低电平,以允许从设备从睡眠中唤醒并设置它们的 SPI 端口(这在 EXti ISR 中完成)。 主 STM32F4 对 Xmit 和 Receive 使用 DMA 缓冲。 为了分析传入的 SPI 帧,我将 STM32F103 设置为使用中断接收并在“SPI_Direction_2Lines_RxOnly”模式下开始通信(即位 10 rxonly 为 1)。从设备仅在寻址(即:地址匹配)时发送响应,并且我想使用 TXDMA (DMA1Channel5)。出于这个原因,所有从站都相应地设置了 DMA,并且在接收到具有匹配地址的命令块后,无论哪一个被寻址都开始传输。 因此,在 8 字节的命令块之后,RX ISR 关闭位 10,我认为这会触发传输,但事实并非如此。 我还尝试禁用 SPI - 重置位 - 再次启用 SPI,进行全面重新初始化,重新初始化 DMA ... 没有任何帮助。 在第 743 页的 RM0008 中提到该位旨在用于多从应用程序,但我在这里做错了什么?SPI2 是功能性的,并且按预期接收字节,只有从属传输犹豫是否开始。哪个“踢”是开始传输所必需的? 谢谢,汤姆 编辑:所以问题是我的 DMA 配置(外围地址)。在知道地址匹配后的RXInterrupt中: SPI_Cmd( SPI2, 禁用 ); SPI2->CR1 &= ~SPI_Direction_2Lines_RxOnly; DMA_Cmd( SPI2_XMIT_DMA, ENABLE ); SPI2->CR2 |= 0x0002;// SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); SPI_Cmd( SPI2, ENABLE ); RDONLY 位被复位,从机开始响应下一个字符。 pinConfiguration spi2pinsMasterRole[] = { { GPIOB, { GPIO_Pin_12, GPIO_Speed_50MHz, GPIO_Mode_IPU } } // 来自 LTC6820 的 CR ,{ GPIOB, { GPIO_Pin_13, GPIO_Speed_50MHz, GPIO_Mode_AF_PP } } // SPI2 时钟 ,{ GPIOB, { GPIO_Pin_14, GPIO_Speed_50MHz, GPIO_Mode_AF_OD } } // SPI2 MISO ,{ GPIOB, { GPIO_Pin_15, GPIO_Speed_50MHz, GPIO_Mode_AF_PP } } // SPI2 MOSI }; pinConfiguration spi2pinsSlaveRole[] = { { GPIOB, { GPIO_Pin_12, GPIO_Speed_50MHz, GPIO_Mode_IPU } } // 来自 LTC6820 的 CS ,{ GPIOB, { GPIO_Pin_13, GPIO_Speed_50MHz, GPIO_Mode_AF_OD } } // SPI2 时钟 ,{ GPIOB, { GPIO_Pin_14, GPIO_Speed_50MHz, GPIO_Mode_AF_OD } } // SPI2 MISO ,{ GPIOB, { GPIO_Pin_15, GPIO_Speed_50MHz, GPIO_Mode_AF_OD } } // SPI2 MOSI }; SPI_StructInit( &SPI_InitStructure ); SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 如果(!isMaster){ initPins(spi2pinsSlaveRole, ARRAY_SIZE(spi2pinsSlaveRole)); SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly; SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE); SPI_I2S_DMACmd( SPI2, SPI_I2S_DMAReq_Tx, ENABLE ); NVIC_SetPriority(SPI2_IRQn, 1); // 非常高的优先级 NVIC_EnableIRQ( SPI2_IRQn ); } 别的 { initPins(spi2pinsMasterRole, ARRAY_SIZE(spi2pinsMasterRole)); SPI_InitStructure.SPI_BaudRatePrescaler = findSPIPrescaler( 36000, baudKHz ); // SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_I2S_DMACmd( SPI2, SPI_I2S_DMAReq_Tx, 禁用); SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, 禁用); NVIC_DisableIRQ( SPI2_IRQn ); } SPI_Init( SPI2, &SPI_InitStructure ); RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1, ENABLE ); DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2->DR; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init( SPI2_XMIT_DMA, &DMA_InitStructure ); ………… |
|
相关推荐
1个回答
|
|
所以在 8 字节的命令块之后,RX ISR 关闭位 10
你确定是吗?你如何调试这个?SPI/DMA 是否有效?如果您不摆弄 SPI_CR1.RXONLY 会怎样? 通常,从读取和检查/发布 SPI、DMA 和相关 GPIO 寄存器内容开始。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2344 浏览 1 评论
3097 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1665 浏览 1 评论
3482 浏览 6 评论
5835 浏览 21 评论
823浏览 4评论
1200浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
467浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1182浏览 3评论
1233浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-2 09:21 , Processed in 1.199320 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191