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:在 TMS320F28335的 McBSP 模块中面临问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/697642/tms320f28335-facing-problem-in-mcbsp-module-of-tms320f28335

器件型号:TMS320F28335
主题中讨论的其他器件: C2000WARE

我将 McBSP-B 用于 TMS320F28335和 Intel FPGA 之间的串行通信(SPI)。

TMS320F28335配置为主器件。

 

目前,我正在发送和接收4个字的32位 (128位)单相数据。

我能够成功地将128位数据 从 DSP 传输到 FPGA、而 DSP 生成的数据的 CRC 也在 FPGA 端匹配

但是、当从 FPGA 接收128位数据时、某些数据包会丢失/或顺序不正确。

 

但接收到的数据(128位)与 FPGA 发送的顺序相同、并在 CRO 中进行验证。

 

当配置为32位数据时、程序工作正常。 传输和接收没有问题。

但是、当我增加数字时 每相位的字数、我在接收到的数据中遇到问题。

 

以下是 McBSP 配置以及发送和接收功能。  

 

void init_McBSP_SPI ()

{

EALLOW;

SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1;// McBSP-A

EDIS;



McbspbRegs.SPCR2.all=0x0000; //重置 FS 发生器、采样率发生器和发送器

McbspbRegs.SPCR1.all=0x0000; //重置接收器,右对齐字,数字回送中断

//McbspaRegs.pcr.all=0x0F08; //(CLKXM=CLKRM=FSXM=FSRM=1、FSXP=1)//需要检查

McbspbRegs.SPCR1.bit.DLB = 0; //数字环回模式

// McBSP 作为 SPI 主时钟

McbspbRegs.SPCR1.bit.CLKSTP= 2; //与 CLKXP/CLKRP 一起确定时钟方案

McbspbRegs.pcr.bit.CLKXP = 0; // MCLKX 引脚极性:MCLKX 引脚上的上升沿在 CLKG 和 FSG 上生成转换

McbspbRegs.pcr.bit.CLKRP = 0; // MCLKR 引脚极性:MCLKR 引脚上的下降沿会在 CLKG 和 FSG 上发生转换

McbspbRegs.pcr.bit.CLKXM = 1; //发送时钟模式:MCLKX 引脚是由 McBSP 的采样率发生器驱动的输出引脚。

McbspbRegs.pcr.bit.SCLKME = 0; //采样率发生器输入时钟模式位

McbspbRegs.SRGR2.bit.CLKSM = 1; //如果 SCLKME:0和 CLKSM:1 = I/p clk、则采样率发生器= LSPCLK



McbspbRegs.SRGR1.bit.CLKGDV = 0x24;

McbspbRegs.pcr.bit.FSXM = 1; //发送帧同步模式

McbspbRegs.SRGR2.bit.FSGM=0; //采样率发生器发送帧同步模式

McbspbRegs.pcr.bit.FSXP = 1; //发送帧同步极性

//

McbspbRegs.RCR2.bit.RPHASE = 0; //适用于双相帧

McbspbRegs.XCR2.bit.XPhase = 0; //适用于双相帧

McbspbRegs.RCR2.bit.RDATDLY=01; //接收数据延迟位。 1:1位数据延迟

McbspbRegs.XCR2.bit.XDATDLY=01; //发送数据延迟位。 1:1位数据延迟



McbspbRegs.RCR1.bit.RWDLEN1=5; // 0=8、5=32位字 2=16位字

McbspbRegs.XCR1.bit.XWDLEN1=5; // 0=8、5=32位字

McbspbRegs.RCR2.bit.RWDLEN2=5; // 0=8、5=32位字 2=16位字

McbspbRegs.XCR2.bit.XWDLEN2=5; // 0=8、5=32位字



McbspbRegs.XCR1.bit.XFRLEN1=3; //第1阶段中的四个字发送:一个字= 32位

McbspbRegs.RCR1.bit.RFRLEN1=3; //阶段1中的四个字接收:一个字= 32位



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; //帧同步发生器复位

}



无符号长整型 MCP2317_Write_U33 (uint32 uvdata、uint32 wdata)

{

Data1 = uvdata;

uvdata >=16;

Data2 = uvdata;



Data3 = wdata;

wdata >=16;

Data4 = wdata;





//发送127 - 96位数据

while (McbspbRegs.SPCR2.bit.XRDY=0){}

McbspbRegs.DXR2.All= sdata4; //127-112

McbspbRegs.DXR1.All= SDATA3; //111-96



//接收127 -96位数据

while (McbspbRegs.SPCR1.bit.RRDY = 0){}

rdata22= McbspbRegs.DRR2.all 和0xFFFF; // 127-112:

rdata11= McbspbRegs.DRR1.all 和0xFFFF; //111-96:



//发送95 - 64位数据

while (McbspbRegs.SPCR2.bit.XRDY=0){}

McbspbRegs.DXR2.All= SDATA2; //95-80

McbspbRegs.DXR1.All= SDATA1; //79-64



//接收95 - 64位数据

while (McbspbRegs.SPCR1.bit.RRDY = 0){}

rdata44= McbspbRegs.DRR2.all 和0xFFFF; // 95-80:

rdata33= McbspbRegs.DRR1.all 和0xFFFF; // 79-64:



//发送63 - 32位数据

while (McbspbRegs.SPCR2.bit.XRDY=0){}

McbspbRegs.DXR2.All= data2; //63-48

McbspbRegs.DXR1.all= data1; //47-32.



//接收63 - 32位数据

while (McbspbRegs.SPCR1.bit.RRDY = 0){}

rdata2= McbspbRegs.DRR2.all 和0xFFFF; //63-48:五

rdata1= McbspbRegs.DRR1.ALL & 0xFFFF; //47-32:u



//发送31 - 0位数据

while (McbspbRegs.SPCR2.bit.XRDY=0){}

McbspbRegs.DXR2.All= data4; //31-16.

McbspbRegs.DXR1.All= data3; //15-0



//接收31 - 0位数据

while (McbspbRegs.SPCR1.bit.RRDY = 0){}

rdata4= McbspbRegs.DRR2.all 和0xFFFF; //31-16:宽

rdata3= McbspbRegs.DRR1.all 和0xFFFF; // 15-0:CRC +故障数据



//接收到的数据127-64位

r_data_new = rdata22;

R_DATA_NEW <<<= 16;

r_data_new = r_data_new | rdata11;

R_DATA_NEW <<<= 16;

r_data_new = r_data_new | rdata44;

R_DATA_NEW <<<= 16;

r_data_new = r_data_new | rdata33;



//接收数据63-0位

R_data = rdata2;

R_data <<= 16;

R_data = r_data | rdata1;

R_data <<= 16;

R_data = r_data | rdata4;

R_data <<= 16;

R_data = r_data | rdata3;

} 

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

    在 SPI 模式下、FSX 引脚将在每次传输之间切换。 当接收到超过32位时、这是否可能会导致问题?

    请验证/确认您的 McBSP 配置也与适用于 McBSP SPI 模式的 C2000Ware 中找到的示例相匹配。

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

    Mark、您好!

    McBSP 配置与 C2000Ware 中 McBSP SPI 的示例相匹配、但除外  

          McbspbRegs.XCR1.bit.XFRLEN1=3;                //阶段1中的四个字发送:一个字= 32位

          McbspbRegs.RCR1.bit.RFRLEN1=3;                //阶段1中的四个字接收: 一个字= 32位

    由于我的情况、我希望通过 McBSP 发送/接收128位数据。

    是可能的错误原因。 亲切的导游。

    -

    Siddhartho  

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

    此外、我还检查了 C2000Ware 中 McBSP SPI (环回)的示例代码。
    它在32位模式下工作良好、即接收到的数据包与传输的数据包匹配。
    但是、当我将 XFRLEN1和 RFRLEN1更改为1以发送和接收64位数据时。
    接收到的数据包与发送的数据包不匹配。

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

    SPI 模式中的 McBSP 只能在1个串行字的帧长度下运行。 (XFRLEN1/RFRLEN1 = 0)。 如果需要传输其他数据、只需发送多个传输即可。
    请注意、FSX 引脚将在每个字(最大32位)之间转换。 如果芯片选择必须在数据包的整个持续时间(例如128位)内保持低电平、则需要使用 GPIO 手动驱动芯片选择。

    一些整理说明:将来在发布代码时、请使用 RTF 编辑器中的代码导入器。 它保留已发布代码的语法。 以这种方式读取和导航会更容易。 我已编辑您的原始帖子以显示差异。

    -Mark