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.

[参考译文] TM4C1294NCPDT:启用 GPIO 上拉电阻时出现 SSI 配置问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1459583/tm4c1294ncpdt-ssi-configuration-issue-faced-with-enabling-gpio-pull-up

器件型号:TM4C1294NCPDT

工具与软件:

Im 尝试遵循数据表中的此注释、

如果通过 SSICR0寄存器的 SPO 位将 SSIClk 信号设置为稳态高电平、软件还必须将与 SSInClk 信号相对应的 GPIO 端口管脚配置为 GPIO 上拉选择寄存器(GPIOPUR)中的上拉电阻。

这些行没有给我所需的结果、GPIOPUR 寄存器设置了位0、并在接下来的代码行中复位为0。
GPIOUnlockPin (GPIO_PORTQ_BASE、GPIO_PIN_0);//针对提交寄存器的写入访问解锁该引脚

GPIOPadConfigSet (GPIO_PORTQ_BASE、GPIO_PIN_0、GPIO_STENCE_2mA、GPIO_PIN_TYPE_STD_WPU);

我还尝试了直接操作寄存器、

HWREG (GPIO_PORTQ_BASE + GPIO_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTQ_BASE + GPIO_CR)|= GPIO_PIN_0;

HWREG (GPIO_PORTQ_BASE + GPIO_PUR)|= GPIO_PIN_0;

这是 SPI 模块初始化的一个片段、该模块配置为模式3、SPO = 1、SPH = 1。

完整代码、

void clock_init (){
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_CFG_VCO_160)、40000000);
}

void spi_init (){
/*
* 360 NW 使用 TM4CNCPDT 控制器的 SSI3模块
*默认情况下、只有 SPI 模式可以在 SST26VF032B SPI 闪存中使用
* SST26VF032B/SST26VF032BA ->最大时钟104 MHz / 80 MHz
*/
clock_init();
SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOQ);
while (! SysCtlPeripheralReady (SYSCTL_PERIPH_GPIOQ));//等待启用
GPIOPinConfigure (GPIO_PQ0_SSI3CLK);
GPIOPinConfigure (GPIO_PQ1_SSI3FSS);
GPIOPinConfigure (GPIO_P2_SSI3XDAT0);//Tx
GPIOPinConfigure (GPIO_PQ3_SSI3XDAT1);//GPIOPinConfigure Rx
SysCtlPeripheralEnable (SYSCTL_PERIPH_SSI3);
while (! SysCtlPeripheralReady (SYSCTL_PERIPH_SSI3));//等待启用
GPIOUnlockPin (GPIO_PORTQ_BASE、GPIO_PIN_0);//针对提交寄存器的写入访问解锁该引脚
//使用设备锁定密钥解锁端口
//
// HWREG (GPIO_PORTQ_BASE + GPIO_LOCK)= GPIO_LOCK_KEY;
//
////
//提交引脚以保持 GPIO 模式
////
// HWREG (GPIO_PORTQ_BASE + GPIO_CR)|= GPIO_PIN_0;
//
// HWREG (GPIO_PORTQ_BASE + GPIO_PUR)|= GPIO_PIN_0;
//以确保下降沿的时钟是尖锐的、因为在 SPI 闪存中上拉了 SCK
GPIOPadConfigSet (GPIO_PORTQ_BASE、GPIO_PIN_0、GPIO_STENCE_2mA、GPIO_PIN_TYPE_STD_WPU);
GPIOPinTypeSSI (GPIO_PORTQ_BASE、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
SSIConfigSetExpClk (SSI3_BASE、ui32SysClock、SSI_FRF_MOTO_MODE_3、SSI_MODE_MASTER、10000000、 8);
SSIEnable (SSI3_BASE);
}

如何解决该问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    ]这些行没有给我带来所需的结果、GPIOPUR 寄存器设置了位0、并在下一行代码上将其重置为0。
    [报价]

    我想 你在调用 GPIOPadConfigSet 之后调用 GPIOPinTypeSSI 。 在 GPIOPinTypeSSI 中、它将覆盖为您的 GPIO_PIN_TYPE_STD_WPU 设置、并将其覆盖为 GPIO_PIN_TYPE_STD。  请参见下文。 您应该交换这两条线。

    void
    GPIOPinTypeSSI(uint32_t ui32Port, uint8_t ui8Pins)
    {
    //
    // Check the arguments.
    //
    ASSERT(_GPIOBaseValid(ui32Port));

    //
    // Make the pin(s) be peripheral controlled.
    //
    GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_HW);

    //
    // Set the pad(s) for standard push-pull operation.
    //
    GPIOPadConfigSet(ui32Port, ui8Pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);

    GPIOUnlockPin (GPIO_PORTQ_BASE、GPIO_PIN_0);//针对提交寄存器的写入访问解锁该引脚

    [报价]

    GPIOQ0引脚不是特殊引脚。 无需执行解锁操作。

    Unknown 说:
    这是 SPI 模块初始化代码片段、该代码片段配置为模式3、SPO =1、SPH = 1.
    [/quote]

    通常、当您针对  SSI_FRF_MOTO_MODE_3进行配置时、即使您为 GPIO_PIN_TYPE_STD_WPU 配置 IO 焊盘、SSI 模块也会在空闲时将 SSICLK 置为高电平 、但我想您所做的一切都是正常的。  

    [/quote][/quote]