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.

[参考译文] AM625:PRU SPI 设置

Guru**** 2482225 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1441872/am625-pru-spi-settings

器件型号:AM625
主题中讨论的其他器件:SysConfig

工具与软件:

您好、

我尝试使用 sys_mcspi.h 将 M4 SPI 配置转换为 PRU

MCSPI_ChConfig gConfigMcspi0ChCfg[CONFIG_MCSPI0_NUM_CH] =
{
    {
        .chNum              = MCSPI_CHANNEL_0,
        .frameFormat        = MCSPI_FF_POL0_PHA0,
        .bitRate            = 12500000,
        .csPolarity         = MCSPI_CS_POL_LOW,
        .trMode             = MCSPI_TR_MODE_TX_RX,
        .inputSelect        = MCSPI_IS_D0,
        .dpe0               = MCSPI_DPE_DISABLE,
        .dpe1               = MCSPI_DPE_ENABLE,
        .slvCsSelect        = MCSPI_SLV_CS_SELECT_0,
        .startBitEnable     = FALSE,
        .startBitPolarity   = MCSPI_SB_POL_LOW,
        .csIdleTime         = MCSPI_TCS0_0_CLK,
        .defaultTxData      = 0x0U,
        .txFifoTrigLvl      = 16U,
        .rxFifoTrigLvl      = 16U,
    },
};

我就是这样将它转换成 PRU 的:映射正确吗?

	MCSPI0_CFG.CH0CONF = 0x0;
	MCSPI0_CFG.CH0CONF_bit.PHA = 0; //SPICLK phase
	MCSPI0_CFG.CH0CONF_bit.POL = 0; //SPICLK polarity
	MCSPI0_CFG.CH0CONF_bit.CLKD = 12500000; //Frequency divider for SPICLK
	MCSPI0_CFG.CH0CONF_bit.EPOL = 0; //SPIEN polarity
	MCSPI0_CFG.CH0CONF_bit.TRM = 2; //Transmit/Receive modes
	MCSPI0_CFG.CH0CONF_bit.IS = 0; //Input Select
	MCSPI0_CFG.CH0CONF_bit.DPE0 = 0; //Transmission Enable for data line 0 [SPIDATAGZEN[0]]
	MCSPI0_CFG.CH0CONF_bit.DPE1 = 1; //Transmission Enable for data line 1 [SPIDATAGZEN[1]]
	MCSPI0_CFG.CH0CONF_bit.SPIENSLV = 0; //Channel 0 only and target mode only
	MCSPI0_CFG.CH0CONF_bit.SBE = 0; //Start bit enable for SPI transfer

我不确定以下几点:

.txFifoTrigLevel = 16u、
.rxFifoTrigLevel = 16u、
您能告诉我、我应该使用 sys_mcspi.h 中的哪个位字段或数据结构吗? 或者、您是否有任何使用 sys_mcspi.h 的示例代码可供我用作参考?
此致、
John

 

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

    John、您好!

    我们有一些通过按位拆裂 PRU 内核来实现 SPI 协议的 PRU 示例代码、但我不确定 PRU 是否有任何控制 SPI 外设的示例代码。 让我问一下。

    我不是 RTOS 开发人员、因此我不能准确回答如何编写适用于 SPI 的 M4F 驱动程序。 您正在查看的数据结构可能包含用于多个不同寄存器的值、或由函数使用但实际上未编程到 SPI 寄存器中的值。 最好的办法是通读驱动程序函数本身、了解如何使用数据结构。

    您可能需要查看 AM62x 技术参考手册(TRM)一节外设> MCSPI > MCSPI 编程指南、以仔细检查 PRU 代码中的寄存器读写情况、并确保您在 M4F 驱动程序中阅读的信息有意义。

    此致、

    Nick

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

    尊敬的 Nick / PRU 专家团队:

    我需要你的帮助。 我能够使用 PRU 中的系统 SPI 并能够传输数据。

    我将我的代码设置为仅传输模式。

    以下是我的步骤(根据 AM62X 技术参考手册):

    第1步:

    表12-58. MCSPI 全局初始化
    StepRegister/Bit 字段/编程 ModelValue
    执行软件复位。 MCSPI_SYSCONG[1] SOFTRESET1
    是否等待重置完成? MCSPI_SYSSTATUS[0] RESETDONE=1
    配置静态设置(例如 SPI 控制器或
    外设)。 MCSPI_MODULCTRL[8-0]0x-
    写入 MCSPI_SYSCONFIGMCSPI_SYSCONFIG0x-


    页数:1166.

    第2步:

    表12-60. MCSPI 发送模式初始化
    StepRegister/Bit 字段/编程 ModelValue
    为通道设置传输模式。 MCSPI_CHCONF_0/1/2/3[13-12] TRM0x2
    配置 SPI 时钟极性/相位、时钟分频器、字 MCSPI_CHCONF_0/1/2/3
    等参数将更难预测。
    复位状态位。 MCSPI_IRQSTATUS0x0

    12.2.3.5.2.1.9.3仅发送过程–轮询方法
    表12-84列出了采用轮询方式时的仅传输过程。
    表12-84. 仅发送过程–轮询方法
    StepRegister/Bit 字段/编程模型根据模式配置通道。 请参阅表12-60。
    电流
    启动通道。 MCSPI_CHCTRL_0/1/2/3[0] EN1
    向发送器寄存器写入数据。 MCSPI_TX_0/1/2/30x-
    等待传输结束? MCSPI_CHSTAT_0/1/2/3[2] EOT=1
    停止通道。 MCSPI_CHCTRL_0/1/2/3[0] EN0

    第1179页

    下面是我创建的简单代码。 我正在发送常量数据(0x80)、但当我尝试通过 SALEA 捕获 MOSI 引脚时、数据不正确。

    //Step 1
    	MCSPI0_CFG.SYSCONFIG_bit.SoftReset = 1;
    	MCSPI0_CFG.SYSCONFIG_bit.AutoIdle = 1;
    	while (MCSPI0_CFG.SYSSTATUS_bit.ResetDone != 1);
    
    	MCSPI0_CFG.MODULCTRL = 0;
    	MCSPI0_CFG.SYSCONFIG = 0;
    	MCSPI0_CFG.CH0CONF = 0;
    
    	MCSPI0_CFG.CH0CONF_bit.TRM = 2; //Transmit/Receive modes
    
    	MCSPI0_CFG.CH0CONF_bit.PHA = 0; //SPICLK phase
    	MCSPI0_CFG.CH0CONF_bit.POL = 0; //SPICLK polarity
    	MCSPI0_CFG.CH0CONF_bit.CLKD = 4; //Clock rate 12.5 Mhz
    	MCSPI0_CFG.CH0CONF_bit.DPE0 = 1; 
    	MCSPI0_CFG.CH0CONF_bit.DPE1 = 0; 
    	MCSPI0_CFG.CH0CONF_bit.SPIENSLV = 0;
    	MCSPI0_CFG.CH0CONF_bit.WL = 8; //SPI word length
    
    	MCSPI0_CFG.IRQSTATUS = 0;
    	MCSPI0_CFG.CH0CTRL_bit.En = 1;
    
    	while (1)
        {
    		while (MCSPI0_CFG.CH0STAT_bit.TXFFE != 0);
    		MCSPI0_CFG.TX0 = (uint8_t) 128;
    		while (MCSPI0_CFG.CH0STAT_bit.EOT != 1);
        }



    这是如何对 SPI 引脚进行引脚多路复用(DTS):
    pinctrl-single,pins = <
                AM62X_IOPAD(0x01bc, PIN_INPUT, 0) /* (A14) SPI0_CLK */
    			AM62X_IOPAD(0x01c0, PIN_INPUT, 0) /* (B13) SPI0_D0 - MISO */
    			AM62X_IOPAD(0x01c4, PIN_INPUT, 0) /* (B14) SPI0_D1 - MOSI */
    			AM62X_IOPAD(0x01b4, PIN_INPUT, 0) /* (A13) SPI0_CS0 */
    		>;

    我想知道我缺少什么以及为什么要采集不正确的数据?

    此致、

    John

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

    John、您好!

    看起来我们没有任何 PRU 内部项目来控制片上 SPI、只有 PRU 位挂起 SPI 协议的项目。

    我今天和一周的其余时间都在度假、所以我最早要等到下周才能浏览您的代码和设置。 请记住、您超出了我可以提供帮助的范围-我可以回答有关 PRU 开发的基本问题、但一旦您开始了解定制 PRU 固件/系统 配置的详细信息、这些都超出了我的帮助范围。

    如果您能够将请求范围缩小到特定问题(即有关 SPI 编程序列的该 TRM 部分不清楚-我是先设置寄存器 A 还是寄存器 B?)、我们将能够提供更多支持。

    此致、

    Nick

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

    您好、Nick。

     

    在 MCU SDK 中有一个命令"DebugP_LOG"、PRU 软件支持包中是否有任何类似的函数 我可以调用以转储串行中的数据?

    此致、

    John

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

    John、您好!

    MCU+内核的日志消息

    对于 MCU+ SDK 内核、我们可以使用 DebugP_LOG 命令将消息输出到 UART、如果您希望从 Linux 终端查看、也可以输出到 Linux 跟踪日志中。 有关该内容的更多信息、请访问 AM62x Academy 的多核模块、此处:  
    启用存储器日志: https://dev.ti.com/tirex/explore/node?node=A__AQMKos1SKJja6J0lslySwA__AM62-ACADEMY__uiYMDcq__LATEST
    读取存储器日志: https://dev.ti.com/tirex/explore/node?node=A__AZqjpHTODW8cdA5DOw7mrQ__AM62-ACADEMY__uiYMDcq__LATEST

    PRU 内核的日志消息  

    遗憾的是、我们没有类似的 PRU 内核基础架构。 通常我会最终写入已知的存储器位置并在 CCS 中或通过 Linux 终端使用 devmem2检查存储器。 如需了解更多详情、请访问: https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/10_00_07_04/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab5.html

    此致、

    Nick