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.

[参考译文] EK-TM4C123GXL:SSI 配置

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/617870/ek-tm4c123gxl-ssi-configuration

器件型号:EK-TM4C123GXL

您好!

我目前正在尝试设置 SSI 模块的 SPI 功能、以便一次从外部闪存中抓取8个位。 我还以所需的66.66MHz 时钟运行以实现计时器功能。 我在下面的代码中包含了一个片段、这些片段是我迄今为止为 SSI 初始化的代码:

//启用使用的外设

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3);

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);

//////////////////////////////////////////////////////////////////// 引脚配置////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//计时器3A

ROM_GPIOPinConfigure (GPIO_PB2_T3CCP0);//配置 GPIO 引脚的函数(_P#_fucnion)

ROM_GPIOPinTypeTimer (GPIO_PORTB_BASE、GPIO_PIN_2);//配置引脚以供计时器使用

//音频放大器

ROM_GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_3);//使用板载 AMP CTL*

ROM_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、0);//必须移动电阻器才能使用 AMP CTL (PA4)

//SSI

ROM_GPIOPinTypeSSI (GPIO_PORTB_BASE、SSI_CLK | SSI_CS | SSI_RX | SSI_TX);//配置 SSI 引脚

ROM_GPIOPinConfigure (GPIO_PB4_SSI2CLK);

ROM_GPIOPinConfigure (GPIO_PB5_SSI2FSS);

ROM_GPIOPinConfigure (GPIO_PB6_SSI2RX);

ROM_GPIOPinConfigure (GPIO_PB7_SSI2TX);

//ROM_GPIODirModeSet (GPIO_PORTB_BASE、SSI_CLK、GPIO_DIR_MODE_OUT);//PB4为输出

//ROM_GPIODirModeSet (GPIO_PORTB_BASE、SSI_CS、GPIO_DIR_MODE_OUT);//PB5为输出

//ROM_GPIODirModeSet (GPIO_PORTB_BASE、SSI_TX、GPIO_DIR_MODE_OUT);//PB7为输出(发送)

//ROM_GPIODirModeSet (GPIO_PORTB_BASE、SSI_RX、GPIO_DIR_MODE_IN);//PB6为输入(接收)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////// SSI 配置//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

sysClock = ROM_SysCtlClockGet ();

SSIConfigSetExpClk (SSI2_base、sysClock、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、3333、 8);

SSIAdvModeSet (SSI2_base、SSI_ADV_MODE_READ_WRITE);//从从器件写入/读取数据的模式

SSIAdvFrameHoldEnable (SSI2);//启用帧保持功能

SSIEnable (SSI2_base);//启用 SPI 模块

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

我主要关注的是"SSIConfigSetExpClk() 函数、因为我觉得它的功能不是完全理解的。 尤其是位速率和时钟输入。  


 

我希望我能够了解到我是否在 SSI 模块的初始化过程中遗漏了任何东西。 我还希望在如何为该函数确定输入时钟和位速率值方面获得一定的指导。 系统时钟是否会自动将时钟馈送到 SSI 模块? 它是否有任何划分? 如何确定所需的比特率?

 

谢谢、

Garrett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    发送到 SSI 模块的默认时钟是系统时钟。 它可被设定为运行在 PIOSC 之外。 函数 SSIConfigSetExpClk 使用参数 ui32SSICLK 和 ui32BitRate 来确定要使用的预分频值。 通常、很难配置的是模式。 您需要仔细考虑外部闪存的时序图要求、并将其与数据表中所示的 TM4C 生成的不同时序进行比较。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:

    在考虑预分频值时、在选择时序图时、是否有一个特定的目标您尝试预分频至以下、或者这些目标是否完全独立?

    让我们以我的代码为例。 我的 SSICLK = sysClock = 66.66MHz、假设比特率为3333。 我希望从闪存一次采样8个位。 这些输入对我来说意味着什么?

    非常感谢您的帮助。

    最棒的
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的系统时钟为66.66MHz、您请求的波特率为333.3KHz。 这意味着 SPI 波特率是系统时钟的1/200。 SSICR0和 SSICPSR 寄存器负责对该分频。 传输8位的时间为24uS 加上开销。 (8/33333333Hz)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您将其清除。

    最后一个考虑因素是系统时钟(66.66MHz)必须至少是 SSIClk 正确速度的两倍? 如果这是真的、那么如何将 sysClock 用作 SSIClk 的输入?

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在主机模式下、SSI 模块的时钟频率必须至少是 SSI 波特率(SSICLK 管脚的频率)的两倍。 在您的情况下、它的速度快200倍、因此满足了此要求。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我所期待的,但只是想仔细检查一下。 在考虑比特率时、它是否可以是任意值、它是否必须是 SSICLK 的某种倍数?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    存在一些限制。 比特率为:
    BR=SYSCLK/(CPSDVSR *(1 + SCR))
    其中、CPSDVSR 是在 SSICPSR 寄存器中设置的2-254之间的一个偶数值、SCR 是在 SSICR0寄存器中设置的0-255之间的一个值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bob Crosby"]... 其中、CPSDVSR 为2-254之间的一个偶数值、在 SSICPSR 寄存器中编程[/引用]

    您是否可以澄清(仅)接受"偶数值"?    (意味着"奇值" (3、5、7...255)证明不正确!)    

    我认为您"打算"写入"积分值"(而不是偶数值)-但(现在)怀疑"时钟触发器的级联"(每个除以2)会导致这种"偶数值"限制。    您可以确认-谢谢...

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

    是的、CPSDVSR 分频值必须是偶数。 将1写入最低有效位将被忽略。  这是必需 的、因此 SPICLK 引脚可以是50%占空比。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您-感激不尽-这种50%的占空比长期以来一直是由于(一个或多个)在 MCU 的内部信号路径中放置了触发器...