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.

[参考译文] TMS320F28377S:SPI 的多字 McBSP 帧

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/734221/tms320f28377s-multi-word-mcbsp-frames-for-spi

器件型号:TMS320F28377S

您好!

我看到您提到过、如果我们希望发送多字帧、可以使用外部 GPIO 作为芯片选择引脚。 如何设置 McBSP 以忽略 FSX?

Rohit。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 McBSP 是 SPI 从器件、则需要 FSX 上的芯片选择输入。

    如果 McBSP 是 SPI 主器件、则只需使用 GPIO 并在传输前后在软件中驱动它。 您不必在配置中多路复用 FSX 引脚。

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

    // McBSP 寄存器设置
    pmcbsp->reg->SPCR2.all =
    0x0000;//重置 fs 发生器、采样率发生器和发送
    器 pmcbsp->reg->SPCR1.all =
    0x0000;//复位接收器、右对齐字、数字回路中断。
    
    //发送帧同步是由//
    采样率发生器
    pmcbsp->reg->pcr.bit.fsxM = 1在内部生成的;
    //接收帧同步是由采样率发生器
    pmcbsp->reg->pcr.bit.fSRM = 1提供的;
    //内部 MCLKR 是由 Mcpcmbbspr 的采样率发生器驱动
    的;pcmbcmbbspr = 1;
    //内部 CLKX 由 McBSP
    pmcbsp->reg->pcr.bit.CLKXM = 1的采样率发生
    
    器驱动;// SCLKME 与 CLKSM 位一起用于选择输入//时钟。
    pmcbsp->reg->pcr.bit.SCLKME= 0;
    pmcbsp->reg->RCR2.bit.RDATDLY =
    1;// FSX 设置时间1在主控模式中。 0表示从机模式(接收)
    pmcbsp->reg->XCR2.bit.XDATDLY=
    1;// FSX 设置时间1在主控模式中。 0对于从机模式(发送)
    
    pmcbsp->reg->SPCR1.bit.CLKSTP= 2;// SPI 模式,无延迟
    pmcbsp->reg.bit.CLKXP= 0;//低非活动状态,上升沿上的 xmit pmcbbsp->pcr.bit.clk.clksp=0;pmrbrrrrrrrrbrrfr.rbrfp0
    
    
    
    
    
    = 1 = rmrrmrrrrrbrrrrrbrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrbrrrrrrbp1;pbrmcrbrrrrrrrbrrrrrrrrrbrrrrrrrrbrbrrrrrrrrbr
    
    
    //设置读取字长
    pmcbsp->rcr1.bit.rWDLEN1 = 2;
    //设置写入字长
    pmcbsp->reg->xcr1.bit.XrgleN1 = 2;
    
    pmcbsp->SRGR2.bit.CLKSM = 1;//将 rmrrrrrrbst=rrrrrrg1
    
    
    
    ;pmrrrrrrrbprgr2 = rmrrrrrrrrgrgr2 =
    
    
    
    1;// prmrrmrrrrrrmrrrrrrrrrrrrrrrrrrrrrrrrgrgrgr2 = 1 = rmrmrmrmrmrgrgrrrmrgrgrgr1 = 1 = 1 = 1;// prmrrmrrrrrrrmrrrrrr
    //从重置
    pmcbsp->reg->SPCR2.bit.frst 释放 RX;//帧同步发生器复位
    
    延迟()
    
    
    

    您好!

    不确定这是属于这个帖子还是应该被移动、但我正在尝试在一个芯片选择周期内发送16位数据、但 McBSP 似乎每次将其分解为32位。 您能不能建议会出现什么问题?

    Rohit。

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

    您的逻辑分析仪图像不清晰。 请放大以显示一个完整的传输。

    您的传输代码是什么样的? 我怀疑您正在写入 DXR2和 DXR1 8次。 在 SPI 模式下、McBSP 并不像一个 FIFO 那样运行。 您只想使用 DXR1寄存器。

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

     Mark、

    当我尝试仅写入 DXR1寄存器时。 总消息计数为32而不是16、但 SPI 帧长度仍然为32、如逻辑分析仪图像所示。

    if (txcnt[McBSP_index]< numtx){
    pmcbsp->reg->DXR1.all =*pmcbsp->ptxbuff;
    pmcbsp->ptxbuff++;
    txcnt[McBSP_index]++;
    } 

    Rohit。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否将 McBSP 寄存器配置转储到 McBSP SPI 回送示例中并尝试简单回送?

    我在配置中看到的唯一未与所需配置匹配的设置是将 FSXP 设置为1。 但这不应对您当前的问题产生任何影响。

    写入 DXR1后、是否有其它代码可确保字在传输另外16位前被传输?
    -Mark
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    写入 DXR1后、我等待读取 DRR、然后发送下一个字。 我认为这就是问题所在。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    听起来您是按照正确的步骤操作的。

    您是否能够测试我的建议?
    您能否确保 XFRLEN2和 RFRLEN2都为0?

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

    Mark、您好!

    我将示例程序与我的配置一起使用、它按预期工作。 请参阅屏幕截图。 我很困惑可能会发生什么情况。

    Rohit。

    McbspbRegs.SPCR2.all = 0x0000; //重置 FS 发生器,采样率
    //发生器和发送器
    McbspbRegs.SPCR1.all = 0x0000; //重置接收器,右对齐字,
    
    //发送帧同步由内部生成
    //采样率发生器
    McbspbRegs.pcr.bit.FSXM = 1;
    //接收帧同步由采样率发生器提供
    McbspbRegs.pcr.bit.FSRM = 1;
    //内部 MCLKR 由 McBSP 的采样率发生器驱动
    McbspbRegs.pcr.bit.CLKRM = 1;
    //内部 CLKX 由 McBSP 的采样率发生器驱动
    McbspbRegs.pcr.bit.CLKXM = 1;
    // SCLKME 与 CLKSM 位结合使用以选择输入
    //时钟。
    McbspbRegs.pcr.bit.SCLKME = 0;
    
    //McbspbRegs.pcr.bit.FSXP = 1;
    
    McbspbRegs.RCR2.bit.RDATDLY =
    1;// FSX 设置时间1在主控模式中。 0表示从机模式(接收)
    McbspbRegs.XCR2.bit.XDATDLY =
    1;// FSX 设置时间1在主控模式中。 0表示从机模式(发送)
    
    McbspbRegs.SPCR1.bit.CLKSTP= 2;// SPI 模式、无延迟
    McbspbRegs.pcr.bit.CLKXP=
    0;//低非活动状态,在上升沿上发送
    McbspbRegs.pcr.bit.CLKRP = 0;// rcv 下降沿
    
    McbspbRegs.RCR1.bit.RWDLEN1 = 2; // 32位字
    McbspbRegs.XCR1.bit.XWDLEN1 = 2; // 32位字
    
    McbspbRegs.SRGR2.bit.CLKSM = 1;// CLKSM=1
    McbspbRegs.SRGR1.all =(uint16)(((200/2)+ 0.5f);
    McbspbRegs.SPCR2.bit.GRST = 1; //启用采样率发生器
    delay_loop(); //等待至少2个 SRG 时钟周期
    McbspbRegs.SPCR2.bit.XRST = 1; //从复位中释放 TX
    McbspbRegs.SPCR1.bit.RRST = 1; //从复位中释放 RX
    McbspbRegs.SPCR2.bit.frst = 1; //帧同步发生器复位 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为您的下一步是开始逐行比较两个程序的 McBSP 部分。
    在您的应用中开始传输之前、您是否无意中重新配置了 McBSP 模块?

    -Mark
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、我将我在最后一条消息中发送给您的配置复制到了我的固件中、它可以正常工作。 配置顺序是否重要?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我做了更多挖掘、
    当我使用示例固件配置以下寄存器时:
    SPCR2 = 195
    SPCR1 = 4097
    PCR = 3840
    RCR2 = 1
    XCR2 = 1
    RCR1 = 64
    XCR1 = 64
    SRGR2 = 8192
    SRGR1 = 100

    当我使用固件进行配置时:
    SPCR2 = 195
    SPCR1 = 4097
    PCR = 3840
    RCR2 = 1
    XCR2 = 1
    RCR1 = 64
    XCR1 = 64
    SRGR2 = 8192
    SRGR1 = 100

    这似乎是因为长度一直是这里的问题。 非常感谢您的支持。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rohit、

    我很高兴你能找到它。 但我看不到您共享的配置的区别。

    问题的长度是多少? 根据原始代码、McBSP 具有正确的字长...

    -Mark
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、您必须输入错误信息。 第二个应该具有 RCR1 = 160、XCR1 = 160和 SRGR1 = 1