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.

[参考译文] TMS320F28335:McBSP 作为 SPI 主器件...

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1305830/tms320f28335-mcbsp-as-spi-master

器件型号:TMS320F28335

我将 McBSP 用作时钟停止模式下的 SPI 主器件。  我按照 Example_2833xMcBSP_SPI_DLB.c 所述设置外设、而不是以回送和8位数据的方式进行设置。 出于某种原因、我继承的代码设置为使用 GPIO 作为片选、但它仅连接到单个器件、因此我可以始终将其设置为低电平有效。

问题是、我在序列开始和结束时看到的时钟信号小于8。  我加入了示波器图以供回顾。 谢谢


// McBSP-A 寄存器设置
McbspaRegs.SPCR2.all=0x0000;//复位 FS 发生器、采样频率发生器和发送器
McbspaRegs.SPCR1.All=0x0000;//复位接收器、右对齐字、数字环回断开
McbspaRegs.pcr.all=0x0F08;//(CLKxM=CLKRM=FSXM=FSRM= 1、FSXP = 1)
//McbspaRegs.SPCR1.bit.DLB = 1;
McbspaRegs.SPCR1.bit.CLKSTP = 2;//与 CLKXP/CLKRP 一起确定计时方案
McbspaRegs.pcr.bit.CLKXP = 0;// CPOL = 0、CPHA = 0上升沿无延迟
McbspaRegs.pcr.bit.CLKRP = 0;
McbspaRegs.RCR2.bit.RDATDLY=01;//主模式下的 FSX 设置时间1。 0表示从机模式(接收)
McbspaRegs.XCR2.bit.XDATDLY=01;//主模式下的 FSX 设置时间1。 0表示从机模式(发送)

McbspaRegs.RCR1.bit.RWDLEN1=0;// 8位字
McbspaRegs.XCR1.bit.XWDLEN1=0;// 8位字

McbspaRegs.SRGR2.all=0x2000;// CLKSM=1、FPER = 1 CLKG 周期
// McbspaRegs.SRGR1.all= 0x000F;//帧宽度= 1个100MHz 周期,CLKGDV=16,CLKGDV/16= 6.25MHz
// McbspaRegs.SRGR1.all= 0x000A;//帧宽度= 1个100MHz 周期,CLKGDV=8,CLKGDV/8 = 12.5MHz
McbspaRegs.SRGR1.all= 0x00040;//帧宽度= 1个100MHz 周期、CLKGDV=64、CLKGDV/64 = 1.5MHz 6.5us
// McbspaRegs.RCR2.bit.RFIG = 1;//忽略帧同步信号
// McbspaRegs.XCR2.bit.Xconfig = 1;//忽略帧同步信号

McbspaRegs.SPCR2.bit.GRST=1;//启用采样频率发生器
delay_loop ();//等待至少2个 SRG 时钟周期
McbspaRegs.SPCR2.bit.XRST=1;//从复位中释放 TX
McbspaRegs.SPCR1.bit.RRST=1;//从复位中释放 RX
McbspaRegs.SPCR2.bit.frst=1;//帧同步发生器复位

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

    Mark、您好!

    此主题的专家不在办公室。 请延迟。

    非常感谢、

    奥普斯

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

    谢谢、我想我已经弄清楚了、我有没有办法解决一个问题?  谢谢

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

    太好了、我很高兴听到您想出来!  如果您认为您的调查结果对其他人有帮助、请随时将其发布在此处。  无论哪种方法、我都可以关闭该线程。

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

    这是一个好主意、或许你可以帮助我了解修复方法。

    我发现、写入数据字节后、我必须执行虚拟读取、否则传输看起来不正确-请参阅上面的示波器图。  我不知道为什么写入数据帧是正确的、但在我这么做后。  我曾查看过示例代码 Example_2833xMcBSP_SPI_DLB.c、我想我看不到它。  我意识到这个问题的唯一原因是、我使用的代码库中有它。

    McbspaRegs.DXR1.all=数据;                   //写入数据

    while (McbspaRegs.SPCR1.bit.RRDY == 0){}     //主设备等待 RX 数据就绪

    // 我不知道为什么我需要这样做???

    空= McbspaRegs.DRR1.all;                //然后读取 DRR1以完成数据接收