嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,7 u3 E6 q! {, }
input mcasp_ahclkx,. O# A( w: `! {
input mcasp_aclkx,2 ?. A* f4 g! d" o# A8 C
input axr0,* W, z) v- a+ s8 V& \2 B, H
4 f, H1 c( d; P# N# j2 a# x
output mcasp_afsr,0 P) x; W) @' p: H  c) ~# ~
output mcasp_ahclkr,
) m  c9 ^8 n1 n  e( @output mcasp_aclkr,! Z. S4 K4 b' B. [- x, b
output axr1,* Q! y4 q; S- X0 x
assign mcasp_afsr = mcasp_afsx;
. G) S. {* w' `' x+ ]5 dassign mcasp_aclkr = mcasp_aclkx;
. J0 V4 @1 a/ rassign mcasp_ahclkr = mcasp_ahclkx;
3 l+ j' G) B! z. m2 x0 \3 L6 Eassign axr1 = axr0;

* i; F5 j, u; ~4 N- v. l* X1 @
1 e0 j9 V( ?' V% j6 V2 P. e- `- M
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

; ]; P# ]: C# i' b, v; S2 \
static void McASPI2SConfigure(void)9 _" q8 V. I" M( r& W
{& W% m1 Z8 x6 Y4 ]3 H8 n+ _! b
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! O& P3 |/ \( l3 X
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */! b$ f6 i: ^3 `6 m" s. `
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% l) ?& z& ~2 k  l3 j, b
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */. {1 i2 ^7 |# h/ D5 U, |+ X2 C4 J
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 ?' p4 ~2 n8 o( ?+ ~
MCASP_RX_MODE_DMA);8 I- q' B* l6 K$ H3 L
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 \8 o8 X! Z7 q& W  m" ~MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */  O, w0 ^: |$ `; y7 w) p" N
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. ~/ D8 @, N; e& s! K& wMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: y6 y3 r) C# I" F- zMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 F" g8 s. Y0 Q' T9 c' [
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */" k0 ?, [' p$ \. e& Y% G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 L+ Y/ a5 ?$ @. GMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' e& l7 n( ~. t4 T' n6 O
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- B/ s5 h( @8 I: o9 h0 S
0x00, 0xFF);
/* configure the clock for transmitter */5 p) l  @" W& e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- M, u$ C9 H* c, D& U, b$ zMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 {& z% ~, n: L3 z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,; Y: z/ }9 x& t9 a, l0 ?1 C2 N7 E8 A
0x00, 0xFF);1 Z% [) o& L4 O8 O
  I  [- Y' I2 {8 {1 T/ |: S+ P
/* Enable synchronization of RX and TX sections */
6 t3 G6 T. F% Z/ Z0 DMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
! J/ v6 s: u0 Q" eMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 q8 P$ i- i7 n. @* z  H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*: |9 y. g7 E; i; q
** Set the serializers, Currently only one serializer is set as
8 Y+ W7 n) ]0 [3 f, c: z** transmitter and one serializer as receiver./ ~; @3 x7 r+ g2 Q# \
*/
5 ^* k; M& N* e1 B8 NMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
0 ~. {0 ~: S" h/ H$ NMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*' X* @7 N! o! E
** Configure the McASP pins * f6 q* Y  S6 d5 f3 H
** Input - Frame Sync, Clock and Serializer Rx
% `* X; T- ]3 n. [6 x** Output - Serializer Tx is connected to the input of the codec
- L+ O" J2 I; C8 w*/( a  P& m1 z0 h$ g3 I5 r: O% ~
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" |, E7 j2 p# p, C2 ^1 [/ \
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 M0 q. D+ {; g' CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: P; S1 g# o# N3 b& `* _
| MCASP_PIN_ACLKX$ D( f- q% t) E' k' d, A
| MCASP_PIN_AHCLKX2 a6 V6 |( f* F7 J% ?
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
9 q! N! a' B9 B$ ~& X% Q6 b9 }6 kMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! J, Q4 r5 _( I# ]" Q$ w8 h| MCASP_TX_CLKFAIL
; s8 l% R1 j' ]/ j  e+ @* c0 p| MCASP_TX_SYNCERROR7 }9 u, E$ O& `) i' P! S
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . U+ M" Z2 T  _- l
| MCASP_RX_CLKFAIL
/ e  G1 U! U. e3 g$ Y| MCASP_RX_SYNCERROR
+ h7 l' Y6 R8 ?0 p+ D; A| MCASP_RX_OVERRUN);* F( m8 y2 J( i8 H8 h1 p
}
static void I2SDataTxRxActivate(void)
6 O9 [. I6 H) y( Y  ]{% f, a# ^- [  ]; ?0 M/ c& X: u! j
/* Start the clocks */
$ ~) x; B" ~" ]* `$ z/ M# t0 N8 S/ AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' j; k0 B/ {5 Q& E' jMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
4 R. w4 N% {- R4 J/ q- @2 rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ I% Q- s- C- j: B+ ^: V- C" P
EDMA3_TRIG_MODE_EVENT);
) V) d: D5 `+ |; ~. k2 j1 c% n: WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, * t$ [) X  W/ j8 K2 f9 O; ]. [
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */4 \" s5 y8 v' V+ N
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ K2 p6 ]3 R# r% F/ h/ \. `
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero *// a$ L1 W5 ?/ y2 o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
; @' e% [* Y/ x6 `6 G( ~2 L  _McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 T$ u0 S- m+ W6 z. n! BMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* b9 \3 \/ ]5 @}

4 x2 k. L* |* G1 j' n1 Z8 B5 [
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

( B5 [% c5 a, F




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4