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.

[参考译文] MSP432P401R:eUSCI -在SPI模式下传输大于8位的字宽

Guru**** 2595805 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/641485/msp432p401r-eusci---transferring-greater-than-8-bit-word-width-in-spi-mode

部件号:MSP432P401R

MSP432 Team,

客户需要使用  eUSCI在SPI模式下执行16位,24位和32位字传输。  即,他们需要UCxSTE在两个字传输之间处于非活动状态。  但是,eUSCI只允许7或8位的数据宽度。  我已使用EVM确认,如果您在TX移位寄存器为空的情况下保持UCxTXBUF已填充,UCxSTE位将在两次传输之间保持活动状态(这需要记录)。  因此,CPU可用于使用来自eUSCI的中断执行多字节传输。  如果使用CPU,另一种方法是使用GPIO代替UCxSTE信号。  然后CPU可以完全手动控制STE信号。

但是,我认为DMA在这里不能有效地使用。  我想您只能设置DMA以传输单个字(例如,16,24或32位字)所需的字节数。  之后,您需要暂停,以便eUSCI停止传输,而UCxSTE信号变为非活动状态。  CPU随后可以重新启动DMA以显示下一个单词。

我在这里错过了诀窍吗?  是否有任何方法可以让DMA处理 多个16,24或32位字的缓冲区 到eUSCI,而无需CPU干预?  具体来说,UCxSTE信号在字之间必须处于非活动状态。

谢谢!

David

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    David,
    我想您已经准确地描述了DMA。 唯一的诀窍是使用散点-收集功能并创建支持传输的任务列表,前提是传输大小和功能始终相同。

    发送的多个字数是否始终相同且相对较小(<50)? 我们认为,有些任务将处理GPIO,而另一些任务将加载eUSCI缓冲区。 您可以在从外围设备触发eUSCI任务时自动触发GPIO任务。

    从概念上讲,24位示例可能如下所示:

    DMA_ControlTable SPI_24_Seq[TX_tasks]=

    /* Task1,虚拟读取RX缓冲区以清除IFG */
    DMA_TaskStruct Entry (1,UDMA_Size_8,
    UDMA_SRC_INC_NONE,&EUSCI_B1_SPI->RXBUF,
    UDMA_DST_INC_NONE,&dummyRX,
    UDMA_ARB_1,(UDMA_MODE_MEM_satter_Gather),
    /* Task2,清除芯片选择WFP 6.2 */
    DMA_TaskStruct Entry (1,UDMA_Size_8,
    UDMA_SRC_INC_NONE,输出低电平(&O),
    UDMA_DST_INC_NONE,&P6->OUT,
    UDMA_ARB_1,(UDMA_MODE_MEM_satter_Gather),
    /* Task3,加载TX缓冲区以启动SPI */
    DMA_TaskStruct Entry (2,UDMA_Size_8,
    UDMA_SRC_INC_8,&txBuffer[0],
    UDMA_DST_INC_NONE,&EUSCI_B1_SPI->TXBUF,
    UDMA_ARB_2,(UDMA_MODE_per分散_收集),
    /* Task4,虚拟读取RX缓冲区以清除IFG,等待RXIFG触发器*/
    DMA_TaskStruct Entry (1,UDMA_Size_8,
    UDMA_SRC_INC_NONE,&EUSCI_B1_SPI->RXBUF,
    UDMA_DST_INC_NONE,&dummyRX,
    UDMA_ARB_1,(UDMA_MODE_MEM_satter_Gather),
    /*任务5,加载TX缓冲区以启动SPI */
    DMA_TaskStruct Entry (1,UDMA_Size_8,
    UDMA_SRC_INC_NONE,&txBuffer[2],
    UDMA_DST_INC_NONE,&EUSCI_B1_SPI->TXBUF,
    UDMA_ARB_1,(UDMA_MODE_Per分散收集),
    /*
    *任务6,清除IFG的虚拟读取RX缓冲区
    *此延迟可确保在传输最后一个字节后进行芯片选择
    */
    DMA_TaskStruct Entry (2,UDMA_Size_8,
    UDMA_SRC_INC_NONE,&EUSCI_B1_SPI->RXBUF,
    UDMA_DST_INC_NONE,&dummyRX,
    UDMA_ARB_2,(UDMA_MODE_MEM_satscating_Gather),
    /*任务7,设置GPIO,芯片选择*/
    DMA_TaskStruct Entry (1,UDMA_Size_8,
    UDMA_SRC_INC_NONE,&DAC_CS,
    UDMA_DST_INC_NONE,&P6->OUT,
    UDMA_ARB_4,UDMA_MODE_MEM_STICATE_GICT)
    //复制(重复)任务2-7次


    //对于最后一个,它需要像这样

    /*
    *任务6,清除IFG的虚拟读取RX缓冲区
    *此延迟可确保在传输最后一个字节后进行芯片选择
    */
    DMA_TaskStruct Entry (2,UDMA_Size_8,
    UDMA_SRC_INC_NONE,&EUSCI_B1_SPI->RXBUF,
    UDMA_DST_INC_NONE,&dummyRX,
    UDMA_ARB_2,(UDMA_MODE_MEM_satscating_Gather),
    /*任务7,设置GPIO,芯片选择*/
    DMA_TaskStruct Entry (1,UDMA_Size_8,
    UDMA_SRC_INC_NONE,&DAC_CS,
    UDMA_DST_INC_NONE,&P6->OUT,
    UDMA_ARB_4,UDMA_MODE_BASIC)


    };

    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >我已使用EVM确认,如果您在TX移位寄存器为空的情况下保持UCxTXBUF已填充,那么UCxSTE位将在两次传输之间保持活动状态(这需要记录)。

    这是UCSTEM (=1)的行为吗? 这似乎与SLAU356G图23-4相矛盾(有时也是如此)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [报价用户="Bruce McKenney4.7378万"]>  
    这是UCSTEM (=1)的行为吗? 这似乎与SLAU356G图23-4相矛盾(有时也是如此)。

    [/引述]
    是,UCSTEM = 1。  我认为图23-4仅适用于单字节传输。
    David