你好!
我的环境:
MSP430FR6043
LaunchPad CC1352R1
CCS: 10.1.
MSP SDK: 3.80.10.09
CC SDK: 4.40.04.04
问题:
我打算在 MSP430FR6043上使用具有 DMA 的 SPI 来获得更高的发射频率。 MSP 连接到主器件 CC1352R1。 在我将 SPI 频率设置为1MHz 或更高之前、一切都正常工作、在 MSP (MISO)上传输数据开始被移位/延迟(类似于这样)。 因此、并非所有数据都被传输、我永远不会从 DMA 中获得中断。
示例设置:SPI 设置为2MHz、DMA 发送和接收通道设置为6字节长度。 数据是6字节:0x2、0x0、0x09、0x0、0xF6、 0xFF。 您可以看到、SPI 传输了两次相同的字节。
这是我的 SPI 和 DMA 配置、开始时我设置了所有内容:
EUSCI_A_SPI_initSlaveParam spiParam ={0}; spiparam.msbFirst = EUSCI_A_SPI_MSB_FIRST; spiparam.clockPhase = EUSCI_A_SPI_PHASE_DATA_COLOCKE_ONFIRST_CHANGE_ON_NEXT; spiparam.Polarity = EUSCI_A_SPI_SPI_LOCK_POCLPULL.SP_POLY_LOPON_POLIT_UST_SP_USCI_UST_SPICE ;spi_POLIT_POLIT_USCI_SP EUSCI_A_SPI_initSlave (EUSCI_A0_BASE、&spiParam); EUSCI_A_SPI_select4引脚功能(EUSCI_A0_BASE、EUSCI_A_SPI_ENABLE_SIGNAL for _4WIRE_SLAVE); DMA_initParam dmaRxParam ={ 通道选择= dma_channel_0、 .transfermodeSelect = dma_transfer_single、 triggerSourceSelect = DMA_TRIGGERSOURCE_14、 transferSize = SPI_FRAME_SIZE、// 6. .transferUnitSelect = DMA_SIZE SRCBYTE_DSTBYTE、 triggerTypeSelect = dma_trigger_RISINGEDGE }; dma_initParam dmaTxParam ={ 通道选择= dma_channel_1、 .transfermodeSelect = dma_transfer_single、 triggerSourceSelect = DMA_TRIGGERSOURCE_15、 transferSize = SPI_FRAME_SIZE、// 6. .transferUnitSelect = DMA_SIZE SRCBYTE_DSTBYTE、 triggerTypeSelect = dma_trigger_RISINGEDGE }; dma_init (&dmaRxParam); dma_init (&dmaTxParam);
在每次传输之前、我都会重新配置设置、传输大小和缓冲区可在程序生命周期内更改:
dma_setTransferSize (dma_channel_0、6);//例如6字节 dma_setTransferSize (dma_channel_1、6);//例如6字节 dma_setSrcAddress (dma_channel_0、eUSCI_A_spi_getReceiveBufferAddress (eUSCI_A0_BASE)、dma_direction、dma_setrdcAddress (dma_data_rt_r32)、unchanged dma_tdma_tdma_r&tdma_r&tdma_r dma_direction 增量); dma_setSrcAddress (dma_channel_1、(uint32_t)&txFram.data、dma_direction 增量); dma_setDstAddress (dma_channel_1、 EUSCI_A_SPI_getTransmitBufferAddress (EUSCI_A0_BASE)、DMA_DIRECTION 不变); EUSCI_A_SPI_ENABLE (EUSCI_A0_BASE); DMA_clearInterrupt (DMA_CHANGE_0); DMA_enableInterrupt (DMA_CHANGE_0); dma_enableTransfers (dma_channel_0); dma_enableTransfers (dma_channel_1);
在每次传输完成后、我会禁用 DMA 和 SPI:
dma_disableInterrupt (dma_channel_0); dma_disableTransfers (dma_channel_0); dma_disableTransfers (dma_channel_1); eUSCI_A_spi_disable (eUSCI_A0_BASE);
我是否错过或配置错误? 直到我不将频率设置为1MHz 或更高、所有东西看起来都很有魅力、但我希望至少使用4MHz。