最近在学习McBSP模块,需要用到两块开发板之间通过McBSP进行通信,程序需要实现:开发板A发数据,开发板B收数据,开发板B收到数据之后再将数据发送给开发板A,最后开发板A校验收到的数据是否和其发送的数据一致。
拿官方自回环例程改的,如下是官方自回环例程模块初始化程序:
McbspaRegs.SPCR2.all=0x0000; // Reset FS generator, sample rate // generator & transmitter McbspaRegs.SPCR1.all=0x0000; // Reset Receiver, Right justify word McbspaRegs.SPCR1.bit.DLB = 1; // Enable DLB mode. Comment out for // non-DLB mode. McbspaRegs.RCR2.bit.RDATDLY = 1; // RX data delay is 1 bit McbspaRegs.XCR2.bit.XDATDLY = 1; // TX data delay is 1 bit McbspaRegs.SRGR2.bit.GSYNC = 0; // No clock sync for CLKG McbspaRegs.SRGR2.bit.FPER = 320; // Frame-synchronization period McbspaRegs.SRGR2.bit.FSGM = 1; // Frame-synchronization pulses from // the sample rate generator McbspaRegs.SRGR2.bit.CLKSM = 1; // Sample rate generator input clock // is LSPCLK McbspaRegs.PCR.bit.SCLKME = 0; McbspaRegs.SRGR1.bit.CLKGDV = 1; // Divide-down value for CLKG delay_loop(); McbspaRegs.SRGR1.bit.FWID = 1; // Frame-synchronization pulse width McbspaRegs.PCR.bit.CLKXM = 1; // CLKX generated internally, CLKR // derived from an external source McbspaRegs.PCR.bit.FSXM = 1; // FSX generated internally, FSR // derived from an external source // // Initialize McBSP Data Length // if(data_size == 8) // Run a loopback test in 8-bit mode { InitMcbspa8bit(); } if(data_size == 16) // Run a loopback test in 16-bit mode { InitMcbspa16bit(); } if(data_size == 32) // Run a loopback test in 32-bit mode { InitMcbspa32bit(); } // // Enable Sample rate generator and // wait at least 2 CLKG clock cycles // McbspaRegs.SPCR2.bit.GRST = 1; delay_loop(); // // Release from reset // RX, TX and frame sync generator // McbspaRegs.SPCR2.bit.XRST = 1; McbspaRegs.SPCR1.bit.RRST = 1; McbspaRegs.SPCR2.bit.FRST = 1;
我只更改了下面两个地方:McbspaRegs.SPCR1.bit.DLB = 0; McbspaRegs.SRGR2.bit.FSGM = 0;,更改之后发现两个板子之间传的数全是错的,也没找到啥规律,
两块开发板MCbsp模块初始化是一样的,
如下是开发板A中的发送和接收程序
while(McbspaRegs.SPCR2.bit.XRDY == 0 ) { }
McbspaRegs.DXR1.all=txdata1A;
while(McbspaRegs.SPCR1.bit.RRDY == 0 ) { } // Check for receive
rdata1A= McbspaRegs.DRR1.all;
如下是开发板B中的接收和发送程序:
while(McbspbRegs.SPCR1.bit.RRDY == 0 ) { } // Check for receive
rdata1B= McbspbRegs.DRR1.all;
while(McbspbRegs.SPCR2.bit.XRDY == 0 ) { }
txData1B=rdata1B;
McbspbRegs.DXR1.all=txdata1A;
有没有前辈用过这个模块,给点意见或者相应程序也行,谢谢啦