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-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; }
Mark、您好!
McBSP 配置与 C2000Ware 中 McBSP SPI 的示例相匹配、但除外
McbspbRegs.XCR1.bit.XFRLEN1=3; //阶段1中的四个字发送:一个字= 32位
McbspbRegs.RCR1.bit.RFRLEN1=3; //阶段1中的四个字接收: 一个字= 32位
由于我的情况、我希望通过 McBSP 发送/接收128位数据。
是可能的错误原因。 亲切的导游。
-
Siddhartho