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.

[参考译文] TMS320F28069M:SPI SCLKA 上不存在时钟信号

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/689215/tms320f28069m-clock-signal-not-present-on-spi-sclka

器件型号:TMS320F28069M

大家好、

我尝试使用 F28069M LaunchPad 通过 SPI_A 从 ADC 读取数据 我已使用控制套件示例作为起点来设置模块、并根据数据表进行更改。 我还没有尝试解释输入的数据、我只是尝试使用示波器检查是否正在生成时钟。 我希望时钟在其上可见的引脚永久处于逻辑高电平、而我希望看到一个大约1.6MHz 的时钟。

我的 GPIO 初始化代码如下:

//---组 B 引脚
GpioCtrlRegs.GPBCTRL.ALL = 0x00000000;// QUALPRD= SYSCLKOUT (对于所有组 B) GPIO
GpioCtrlRegs.GPBQSEL1.ALL = 0x00000000;//对于所有组 B GPIO 无限定条件32-44 GpioCtrlRegs.GPBQ0000.ALL
= 0x00000000;//无限定条件= 0x0000.GPIOL.CMP458L = 0x00000000
//所有组 B GPIO 都是输入
GpioCtrlRegs.GPBPUD.ALL = 0x00000000;//所有组 B 上拉被启用

GpioCtrlRegs.GPBDIR.bit.GPIO56=1; //将 GPIO56设置为输出方向

GpioCtrlRegs.GPBMUX1.bit.GPIO32=0;// 0=GPIO 1= SDAA 2=EPWMSYNCI 3=ADCSOCAO
GpioCtrlRegs.GPBMUX1.bit.GPIO33=0;// 0=GPIO 1=SCLA 2=EPWMSYNCO 3=ADCSOCBO
GpioCtrlRegs.GPBMUX1.bit.GPIO34=0;// 0=GPIO 1=COMP2OUT 2=rsvd 3=COMP3OUT
GpioCtrlRegs.GPBMUX1.bit.GPIO35=0;// 0=GPIO (TDI) 1=rsvd 2=rsvd 3=rsvd
GpioCtrlRegs.GPBMUX1.bit.GPIO36=0;// 0=GPIO (TMS) 1=rsvd 2=rsvd 3=rsvd
GpioCtrlRegs.GPBMUX1.bit.GPIO37=0;// 0=GPIO (TDO) 1=rsvd 2=rsvd 3=rsvd
GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0;// 0=GPIO/XCLKIN (TCK) 1=rsvd 2=rsvd 3=rsvd
GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 0;// 0=GPIO 1=rsvd 2=rsvd 3=rsvd
GpioCtrlRegs.GPBMUX1.bit.GPIO40=0;// 0=GPIO 1=EPWM7A 2=SCITXDB 3=rsvd
GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 0;// 0=GPIO 1=EPWM7B 2=SCIRXDB 3=rsvd
GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 0;// 0=GPIO 1=EPWM8A 2=TZ1 3=COMP1OUT
GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 0;// 0=GPIO 1=EPWM8B 2=TZ2 3=COMP2OUT
GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0;// 0=GPIO 1=MFSRA 2=SCIRXDB 3=EPWM7B

GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;// 0=GPIO 1=EQEP1A 2=MDXA 3=TZ1
GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0;// 0=GPIO 1=EQEP1B 2=MDRA 3=TZ2
GpioCtrlRegs.GPBMUX2.bit.GPIO52=0;// 0=GPIO 1=EQEP1S 2=MCLKXA 3=TZ3
GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0;// 0=GPIO 1=EQEP1I 2=MFSXA 3=rsvd
GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0;// 0=GPIO 1=SPISIMOA 2=EQEP2A 3=HRCAP1
GpioCtrlRegs.GPBMUX2.bit.GPIO55=0;// 0=GPIO 1=SPISOMIA 2=EQEP2B 3=HRCAP2
GpioCtrlRegs.GPBMUX2.bit.GPIO56=1;// 0=GPIO 1=SPICLKA 2=EQEP2I 3=HRCAP3
GpioCtrlRegs.GPBMUX2.bit.GPIO57=0;// 0=GPIO 1=SPISTEA 2=EQEP2S 3=HRCAP4
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 0;// 0=GPIO 1=MCLKRA 2=SCITXDB 3=EPWM7A 

和我的 SPI 模块初始化代码...

void InitSPI (void)//初始化 F2806x 上的 SPI 模块
{
SpiaRegs.SPICCR.bit.SPISWRESET=0;//重置 SPI
SpiaRegs.SPICCR.All=0x004F; //低电平有效时钟,16位字符
SpiaRegs.SPICTL.All=0x0007; // SPI 主模式、使能传输、使能中断
SpiaRegs.SPISTS.All=0x0000; //清除状态寄存器,复位所有标志。
SpiaRegs.SPIBRR=0x001B; //将波特率设置为大约1.6Mbps

SpiaRegs.SPIFFTX.bit.SPIFFENA=0;//禁用 Tx FIFO 增强功能
SpiaRegs.SPIFFRX.bit.RXFFIENA=0;//禁用 Rx FIFO 中断
SpiaRegs.SPIFFCT.All=0x00;
SpiaRegs.SPIPRI.bit.TRIWIRE=0; //禁用标准4线 SPI 的三线模式

SpiaRegs.SPICCR.bit.SPISWRESET=1;//启用 SPI
} 

我在 CCS 上使用了调试器来验证这两段代码都在执行、但引脚上仍然没有时钟信号的迹象。

有什么想法有什么问题吗?

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

    只需检查一下、在更改 SPI 引脚的 GPIO 控制寄存器之前是否直接存在 EALLOW?
    另请注意、如果随后将引脚设置为外设功能、则设置 GPIO 方向无关紧要。 外设功能优先、因此 GPIO 方向(由 GPxDIR 设置)无关紧要。

    请告诉我以下假设是否不正确:
    您希望在设置 GPIO 多路复用器设置(如第一个代码片段中所示)并执行 InitSPI 函数后、SPICLK 将立即开始切换。 这种情况不会发生、因为 SPI 仅在有活动传输的情况下切换其时钟。 要查看时钟切换、您需要传输一些数据。 现在、如果我认为您的假设是正确的、那么我认为这是正确的。 如果没有、请告诉我。

    您是否还验证了 SPI 实际上是否已设置? 您是否启用了外设时钟? 如果您使用的是 TI 提供的示例代码,我认为您可能会调用 InitSysCtrl()函数,该函数会初始化所有外设时钟,但请验证也会发生这种情况。

    请告诉我这些帮助中是否有任何一个。

    谢谢、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    回答您的问题:
    1) 1)我正在使用 TI 的示例代码来初始化 GPIO 引脚、我可以确认在我发布的代码片段上方使用了 EALLOW。
    2) 2)我在未设置引脚方向的情况下尝试了代码。 我认为它不会产生影响、所以我先尝试了代码而没有它。 我只添加了它来查看它是否发生了任何变化。
    3) 3)我确实希望在我调用 InitSPI 函数后立即开始切换时钟。 我使用 F28069作为主设备、从 AD7476 ADC 接收测量值。 一旦应用时钟并且"芯片选择"被拉至低电平、这个芯片就返回其转换结果。 因此、我无需从主器件向从器件传输任何数据、但我确实需要主器件生成时钟信号、以便 ADC 能够以正确的波特率移出其数据。
    4) 4)正确的是,我正在调用 InitSysCtrl()函数,该函数默认启用 SPIA 的时钟。 我没有以任何方式更改此文件。

    我在这里的总体逻辑是 SPI 时钟将一直运行、我将通过使用 GPIO 将 CS 拉为低电平来触发 ADC 启动转换、然后通过转换结果的第16位的到达触发 SPI Rx 中断。 也许您可以建议这种方法是否存在缺陷?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Euan、

    感谢您的澄清。 然后、您的配置似乎是正确的、但您对 SPI 的理解有细微的缺陷。 正如我提到过的、SPICLK 在一个有效传输发生前不会切换。 一个主器件一直启动一个传输、只有这样、时钟才会切换。 请阅读 F28069 TRM 的 SPI 一章。 具体而言、请参阅操作简介部分以及主模式部分。 这涵盖了 SPI 模块在基本级别上的运行预期。 通常、对于 SPI、您也可以参考 SPI 协议的 Wikipedia 页面。 相当不错  

    在任何情况下、为了帮助您解决问题、您都需要主设备启动传输。 为了实现这一点、主器件通过传输一个假字以及您从从从器件读取的字的长度来实现。 您提到它是16位、因此您可以"发送"一个16位字、并在字完成发送后从 SPIRXBUF 读取结果。 如果不使用 FIFO、则可以通过 SPIINT 标志或 RXFIFO 中断来检测。 您可以将其视为主器件"计时"从器件字。  

    此致、
    标记

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复 Mark。 我将回顾 TRM 的 SPI 部分、看看我能否更好地了解它的工作原理。 我没有想过传输一个假字来触发转换、但我将对此进行研究。