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.
我将 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以完成数据接收