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.

[参考译文] TMS320F2808:SPI 模式1或3计时问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1068238/tms320f2808-spi-mode-1-or-3-timing-issues

部件号:TMS320F2808

我的 F2808设备套件中有一个需要 SPI 模式3的设备。 (我有另一台 SPI 模式0的设备,工作正常。)

SPI 模式1或3存在相同的问题,因此我将重点关注 SPI 模式1,我确信 SPI 模式3的问题也将得到解决。

另一种设置是数据处于4位模式(SPICCR.bit.SPICHAR),因此考虑数据移动。 我将关注的数据是 F2808向外部设备发送0x901B4。

当处于 SPI 模式0或2时,数据会按预期移出。 请参阅 随附的 TMC262_SPI_Mode0图像。 但是,当 SPI 模式更改为1或3时, 第一 个 SPI 时钟恰好发生在第一个数据位从0x9 (1001b)的高转换到低转换时,因此被识别为0,然后其余数据被1位关闭。 请参阅 随附的 TMC262_SPI_Mode1图像。

当所有设备运行1MHz 时,时钟设置没有差异(SPIBRR = 0x0009, SysCtrlRegs.HISPC.All = 0x0005,SysCtrlRegs.LOSPC.ALL = 0x0005, SysCtrlRegs.XCLK.Bit.XCLKOUTDI=2)。

是否有我正在查看的设置? 端口的 GPIO 设置如下:

    GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0;   // Enable pull-up on GPIO20 (SPISIMOC)
    GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0;   // Enable pull-up on GPIO21 (SPISOMIC)                                                                                                             
    GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;   // Enable pull-up on GPIO22 (SPICLKC)                                                                                                             
    GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0;   // Enable pull-up on GPIO23 (SPISTEC)                                                                                                             
    
/* Set qualification for selected pins to asynch only */
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.

    GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 0;   // Sysclock sync GPIO20 (SPISIMOC)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 0;   // Sysclock sync GPIO21 (SPISOMIC)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 0;   // Sysclock sync GPIO22 (SPICLKC)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0;   // Sysclock sync GPIO23 (SPISTEC)

/* Configure SPI-C pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be SPI functional pins.
// Comment out other unwanted lines.

    GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 2;   // Configure GPIO20 as SPISIMOC
    GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 2;   // Configure GPIO21 as SPISOMIC     
    GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 2;   // Configure GPIO22 as SPICLKC    
    GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 2;   // Configure GPIO23 as SPISTEC  

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

    杰弗里:

    请描述您所指的 SPI 模式吗? 此外,两种模式之间的实际软件配置有何不同?

    此致,

    Marlyn

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

        switch(spimode)
        {
        /*
         *    Mode   CLKPOL   PHASE
         *      0       0       0   // All data transitions are during the rising edge,
         *                               non-delayed clock. Inactive level is low.
         *      1       0       1   // All data transitions are during the rising edge,
         *                               but delayed by half clock cycle. Inactive level is low
         *      3       1       0   // All data transitions are during the falling edge.
         *                               Inactive level is high
         *      2       1       1   // All data transitions are during the falling edge,
         *                               but delayed by half clock cycle. Inactive level is high
         *  SPICCR.bit.CLKPOLARITY (.6) 0 Data is output on rising edge and input on falling edge
         *  SPICCR.bit.CLKPOLARITY (.6) 1 Data is output on falling edge and input on rising edge
         *  SPICTL.bit.CLK_PHASE   (.3) 0 Normal SPI clocking scheme, depending on the CLOCK POLARITY bit (SPICCR.6)
         *  SPICTL.bit.CLK_PHASE   (.3) 1 SPICLK signal delayed by one half-cycle; polarity determined by the CLOCK POLARITY bit
         */
        default:
        case Mode0:
            // Setup for Mode 0
            spiregs->SPICCR.bit.CLKPOLARITY = 0;
            spiregs->SPICTL.bit.CLK_PHASE = 0;
            break;
        case Mode1:
            spiregs->SPICCR.bit.CLKPOLARITY = 0;
            spiregs->SPICTL.bit.CLK_PHASE = 1;
            break;
        case Mode2:
            spiregs->SPICCR.bit.CLKPOLARITY = 1;
            spiregs->SPICTL.bit.CLK_PHASE = 0;
            break;
        case Mode3:
            spiregs->SPICCR.bit.CLKPOLARITY = 1;
            spiregs->SPICTL.bit.CLK_PHASE = 1;
            break;
        }

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

    你好,杰弗里,

    感谢您提供上述信息。 我之所以提出这一要求,是因为 我们的设备和其他设备之间可能没有 SPI“模式”的标准化。 您是否已确认其他外部设备与我们的设备在时钟极性和相位方面的描述相同?

    供您参考:

    您是否也可以将这些图像与命名约定单独重新连接? 我们的系统无法跟踪这些信息。  

    此致,

    Marlyn

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

    我正在尝试与客户确认模式3对他们的意义,但我觉得他们可能需要以下格式:

    那么,是否有办法将 CPOL 设置为1,而将 CPHA 上升边缘设置为无延迟? (我认为您可能正在按照计划操作模式3对客户的意义不是模式3对 F2808的意义。)

    TMC262_SPI_Mode0 图像

    TMC262_SPI_Mode1图像

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

    你好,杰弗里,

    [引用 userid="352848" url="~/support/moncs/c2000-monca-group/c2f/c2000-monets" forum/1068238/TMS320F2808-SPI-mode-1-or-3计时问题/3955249#3955249"]我正在尝试与客户确认模式3是什么,但他们可能认为是以下格式:[引用以下内容]

    谢谢,这可能有助于澄清正在发生的事情。

    [引用 userid="352848" url="~/support/moncs/c2000-monca-group/c2f/c2000-monet-forum-forum/1068238/TMS320F2808-SPI-mode-1-or-3-time-issues/3955249#3955249"],那么是否有方法将 CPOL 设置为1,但 CPHA 上升边缘[不延迟]?

    不幸的是,没有 唯一可配置的选项是上一个答复中提供的表中的选项。 比较您提供的图和 F2808的图示,由于 F2808提供的延迟,模式3和模式1有所不同。

    此致,

    Marlyn

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

    谢谢你,这说明了这一点。 现在,我只需要看看客户是否只接受我提供的图像中的模式3,如果是,那么他们的产品将无法与 F2808兼容 SPI。