This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
你(们)好
我正在尝试通过 DMA 通道6、7操作 SPI_B2 (P3.5-3.7)、但它不起作用我启动 SPI_B2并在没有 DMA 通道的情况下对其进行测试、它工作正常、 但是当我使用 DMA 通道时、通道的启动是正确的、并且 DMA 表中的控制字也是正确的、但是 DMA 不会移动、并且控制字显示它不会减少剩余要发送的字节数。
SPI2已正确启动、因为我可以手动写入 EUSCI_B2的 UCBTXBUF、并使用 P3.5-P3.6上的逻辑分析仪查看字节和时钟。
我要附上代码的相关部分(仅 TX DMA):
DMA_DATA_STRURT DMACONTRO表[16]; //8 DMA 通道* 2 (ALT 通道)= 16*4*4字节
#pragma DATA_ALIGN (DMAcontrolTable、256)
UC TestArray[10]={1、2、3、4、5、6、7、8、9、10};
//设置 SPI2外设
///---------------------- =
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7、GPIO_PRIMARY_MODULE_FUNCTION);
EUSCI_B2->CTLW0 |= EUSCI_B_CTLW0_SWRST;//将 eUSCI 状态机置位
EUSCI_B2->CTLW0 = EUSCI_B_CTLW0_SWRST | //保持 eUSCI 状态机处于复位状态
EUSCI_B_CTLW0_CKPL | //将时钟极性设置为高电平、CKPH=0。 在时钟的上升沿采样的数据。
EUSCI_B_CTLW0_MSB | // MSB 优先、8位
EUSCI_B_CTLW0_MST | //设置为 SPI 主设备
EUSCI_B_CTLW0_MODE_0 |// 3线模式00
EUSCI_B_CTLW0_SYNC | //设置为同步模式
EUSCI_B_CTLW0_ssel_SMCLK | //使用 SMCLK
EUSCI_B_CTLW0_STEM; //在3线制模式中忽略,在4线制模式中激活从器件使能信号。
EUSCI_B2->BRW =(US)(SMClock / 1000000);// fBitClock = fBRCLK/(UCBRx+1)。
EUSCI_B2->CTLW0 &=~EUSCI_B_CTLW0_SWRST; //初始化 USCI 状态机
MAP_SPI_enableModule (EUSCI_B2_base);
/*配置 DMA 模块*/
//----------------------------------
map_dma_enableModule();
MAP_DMA_setControlBase (DMAcontrolTable);
//将通道6分配给 EUSCIB2TX
//--------------------------------------------------
MAP_DMA_赋 值通道(DMA_CH6_EUSCIB2TX1);
/*为主缓冲区设置*/
MAP_DMA_setChannelControl (DMA_CH6_EUSCIB2TX1 | UDMA_PRI_SELECT、UDMA_SIZE 8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
/*为备用*/设置缓冲区
MAP_DMA_setChannelControl (DMA_CH6_EUSCIB2TX1 | UDMA_ALT_SELECT、UDMA_SIZE 8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
//清除该通道的高优先级位。
// dma_Control->PRIOCLR = 1 << 6; //无效
/*为 DMA 通道分配中断*/
MAP_DMA_assignInterrupt (DMA_INT0、DMA_CHANNEL); //分配给通用 DMA0
/*为 DMA 通道启用中断*/
// NVIC->ISER[1]= 1 <<(DMA_INT0_IRQn-32)& 31);
MAP_Interrupt_enableInterrupt (DMA_INT0);
//设置6字节长度的传输
///--------------------------------
MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH6_EUSCIB2TX1 、UDMA_MODE_BASIC、&TestArray[0]、
(void*) map_spi_getTransmitBufferAddressForDMA (EUSCI_B2_base)、6);
/*启用 DMA 通道*/
map_dma_enableChannel (dma_channel_6);
/*现在 DMA 已启动并已设置,从而启用通道。 EUSCI
*硬件应接管并传输/接收所有字节*/
您好 Chris。
我想过它、但它不能唯一起作用的方法是、如果我在 SPI2和 SPI0引脚(P3.4-7和 P1.4-7)之间切换、我不确定我是否完全理解 PMAP 寄存器机制... 如果有一种方法来切换引脚,它将解决问题...有什么想法吗?
此致、
Shai。