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.

[参考译文] MSP432E401Y:驱动 PA2 SPICLK 引脚时出现故障

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1367009/msp432e401y-trouble-driving-pa2-spiclk-pin

器件型号:MSP432E401Y

工具与软件:

您好!

我正在使用的电路板具有带 SPI 接口的光隔离式 ADC 7038。  如果我在没有光隔离器的情况下直接与7038进行通信、那就没问题、但当我尝试通过光隔离器和逆变器与7038进行通信时、它是不能正常工作的。

我要做的第一件事是清理 SSICLK 信号、为此、我要在该引脚 PA2上生成一个方波、并将其用于改进硬件。  但是,我没有太多的运气。  

现在、我要做的就是将 PA2从低电平切换到高电平。  我在做什么:

1.观察 RCGCGPIO 是否为 FF 7F -门控时钟已启用

2.观察 PRGPIO 是否为 FF 7F - GPIO 模块已就绪

3.将 SSICR1设置为0 -禁用 QSSI0

4.将 RCGSSI 设置为0 -禁用 SSI 模块

5.将端口 A GPIODIR 设置为04 -将 PA2设置为输出

6.将端口 A GPIODEN 设置为0xFF -数字使能端口 A  

然后我将04写入 GPIODATA (以及0x400583FC)、但没有发生任何情况。 PA2应该变为高电平、但它不会。

有人能看到我在这里做错了什么吗?

谢谢你。

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

    您好、Brad、

    我使用的电路板具有带 SPI 接口的光隔离式 ADC 7038。  如果我直接在没有光隔离器的情况下与7038对话、它就可以正常工作、但当我尝试通过光隔离器和逆变器与7038对话时、它就无法工作了。

    在您没有光隔离器的情况下、PA2是否可以工作?

    现在、我要做的就是将 PA2从低电平切换到高电平。  我在做什么:

    1.观察 RCGCGPIO 是否为 FF 7F -门控时钟已启用

    2.观察 PRGPIO 是否为 FF 7F - GPIO 模块已就绪

    3.将 SSICR1设置为0 -禁用 QSSI0

    4.将 RCGSSI 设置为0 -禁用 SSI 模块

    5.将端口 A GPIODIR 设置为04 -将 PA2设置为输出

    6.将端口 A GPIODEN 设置为0xFF -数字使能端口 A  

    然后我将04写入 GPIODATA (以及0x400583FC)、但没有发生任何情况。 PA2应该变为高电平、但它不会。

    [/报价]

    如果您使用 TivaWare API 进行相同的操作、它是否会产生任何差异?

    您是否认为没有光隔离器、上述代码序列将起作用?  

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

    您好 Charles、

    感谢您的答复。

    我想我的帖子不清楚。 光隔离器在此时不涉及到这个问题、我刚才提到了它们来解释我的最终目标。 我现在使用的电路板没有光隔离器。 我只是想获取 PA2引脚的控制权以便开始进行一些测试。

    我不熟悉 TivaWare API、因此我不愿意开始使用高级语言解决方案。 一旦初始化完成、我的项目几乎全部使用汇编语言运行、我认为可能需要编写一些汇编代码、以便可靠地从 ADC7038获取数据、因为当我尝试使用 SPI 端口读取数据时、我在尝试通过光隔离器获取数据时遇到了一些问题。

    我意识到我可能只是其中的一小部分、但我认为汇编代码比高级语言更易于使用。

    在采取上述步骤1-6之后、PA2不会变为高电平必须有一些简单的原因、但我知道的一切都会告诉我它应该变为高电平。 很显然、我在这里遗漏了一个重要的步骤。

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

    您好、Brad、

     也许是少数我知道完全用汇编语言编写软件的人之一、也可能是唯一一个这样的人。 这对我们来说是极其困难的。 我强烈建议您试用 TivaWare SDK。 它非常易于使用。 如果您坚持使用汇编语言、则  至少请尝试使用 TivaWare 并遵循编译器生成的反汇编代码。 然后、您可以将其与自己的代码序列进行比较。  

    使用 API、将 PA2设置为高电平可以像 以下代码一样简单。  

        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA))
        {
        }
        
    
        GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2);
    
        GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2, GPIO_PIN_2);
    }

    运行上述代码后、可使用以下寄存器进行设置。 可以将其与输出进行比较。  

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

    您好 Charles、

    正在工作! 正如您建议的那样、我能够将您发布的 TivaWare 代码与反汇编器配合使用、以了解如何切换 PA2、该器件现已开始工作。 非常感谢。

    我意识到可能只有我一个人仍然在使用汇编语言代码、但是在微处理器发明前几年、我就接受了工程学的培训、而在第一次出现汇编语言代码时、我只能选择汇编语言。 我从不想开始使用更高级的语言、因为对我来说、这些语言给最终设计增加了不必要的复杂性。 我仍然使用 C 代码进行初始化、但之后几乎全部用汇编语言完成。

    尽管我需要一点翻译、但您对我的问题的回答对我来说非常有价值、如果没有您的回答、我不知道我会如何解决其中的一些问题。

    最后一期。 PA2引脚连接到300欧姆电阻器以驱动光隔离器、因此至少需要10mA 的电流。 在发送的代码之后有一个命令"GPIOPadConfigSet (ui32Port、ui8Pins、GPIO_strength_2mA、GPIO_PIN_TYPE_STD)"、它将 PA2配置为2mA。

    是否有办法修改您发送的 TivaWare 代码、告诉它配置 PA2以驱动12mA? 看起来这是最高驱动电流选项。

    谢谢你。

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

    您好、Brad、

     很高兴它现在对您有用。 正如您所看到的、一旦了解了这一点、就可以轻松地处理 TivaWare API。  

    我意识到我可能是唯一一个仍然使用汇编代码的人,但我在工程教育完成了几年前的微处理器发明,而汇编代码是第一次出现时的唯一选择。 我从不想开始使用更高级的语言、因为对我来说、这些语言给最终设计增加了不必要的复杂性。 我仍然使用 C 代码进行初始化、但之后几乎全部用汇编代码完成。

    不用担心。 我从 Motorola 68000装配开始。 :-)

    最后一个问题。 PA2引脚连接到300欧姆电阻器以驱动光隔离器、因此至少需要10mA 的电流。 在发送的代码之后有一个命令"GPIOPadConfigSet (ui32Port、ui8Pins、GPIO_strength_2mA、GPIO_PIN_TYPE_STD)"、它将 PA2配置为2mA。[/引号]

    如您所见、 GPIOPinTypeGPIOOutput 的源代码是调用 GPIOPadConfigSet。  

    void
    GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins)
    {
        //
        // Check the arguments.
        //
        ASSERT(_GPIOBaseValid(ui32Port));
    
        //
        // Set the pad(s) for standard push-pull operation.
        //
        GPIOPadConfigSet(ui32Port, ui8Pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
    
        //
        // Make the pin(s) be outputs.
        //
        GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_OUT);
    }

    默认情况下、它会将焊盘配置为2mA 强度。 可以通过 使用12mA 调用 GPIOPadConfigSet 来覆盖它。 请参见下方的。  

       SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA))
        {
        }
        
    
        GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2);
    
        GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_12MA, GPIO_PIN_TYPE_STD);
    
        GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2, GPIO_PIN_2);
    }

    这里是寄存器设置。  

    请注意、会有多个寄存器用于配置12mA 驱动强度。 请参阅 d/s 中的表。 API 将为您轻松完成配置。 如果您想使用装配体、则必须仔细遵循 d/s、了解如何使用。 如果您要使用汇编语言编写代码、请再次参考反汇编代码。