|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,/ x: y# V F! s* }( J
input mcasp_ahclkx,
2 R' A3 {" V. `0 f& Kinput mcasp_aclkx,: o/ }" M& u% [( _
input axr0," M" C/ J( ~* y
! I& D* v z; J( @; B/ \output mcasp_afsr,9 O& N1 s' J) G) D/ M, j4 ?
output mcasp_ahclkr,5 D: d7 n$ d% C6 z5 ~* f
output mcasp_aclkr,
7 S* d+ `# I h0 e* L, }output axr1,
, j* ], d7 H1 e9 s assign mcasp_afsr = mcasp_afsx;+ B" d( G; p' g# W& w: O
assign mcasp_aclkr = mcasp_aclkx;
. z7 u. w( K" Oassign mcasp_ahclkr = mcasp_ahclkx;. o0 J/ `" c" E
assign axr1 = axr0;
8 F2 @. q& I( Y6 V) G) C2 n2 t$ S8 N
0 ]3 n. ^; x3 n1 O6 K5 b! z在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
8 R% h6 [& _8 ^ V9 u* N- ?0 ^static void McASPI2SConfigure(void)
1 v( S, [, b' E: V% A$ P: p{, H* j& m% {# O: e r
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
% Y! W% @# ]" D9 G- Q: SMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 j8 y0 o" A, JMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
) T" ~. u H5 x9 Q% |7 LMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */7 K9 w# w7 g. `+ Q* K4 d' e
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% `+ V0 G3 @* h; v' sMCASP_RX_MODE_DMA);
! `# W: p; p( k& e/ IMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; ? j: q3 j* x9 s7 {; W7 Z. n! E
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" R8 }9 e2 }! }2 n* L7 y( K. KMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, \8 |7 K; _( k* m! ~. z
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 x i* Y: I; o: D4 ]. ]McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ( e; j- y. ]& S
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
: E( A8 t' Q- F. p. y4 O7 a. }0 R7 cMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) |; E/ L a2 |/ `1 [McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& B' A) i e7 P, kMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) O) A& l/ v, u2 n. K$ ^
0x00, 0xFF); /* configure the clock for transmitter */
h9 i5 b& x" b- pMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' A; u/ b) ]1 { w$ `McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : F2 p0 J' y! R* q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' m/ r! W Z$ Q7 M# A7 q6 ` N1 ^, D0x00, 0xFF);3 ~$ J0 H3 V8 e/ b& B5 E
3 S, r+ h( |3 U6 j/ b- @% H" n: O* ^0 Q/* Enable synchronization of RX and TX sections */ * D7 u& i8 x" [9 m6 y2 F
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */6 @1 y& \* Z: R s8 [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 e( e7 d' c+ H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 T: `1 e: A1 E% d! B
** Set the serializers, Currently only one serializer is set as4 g8 V, p2 ~ v9 C8 E9 p4 o+ L
** transmitter and one serializer as receiver.
! a- Z, C; a: w- |# j T*/6 A0 B* ~- } H9 L+ v
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. a% i6 L' c7 y# A5 P9 F6 NMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
& f1 p- d- z: T/ K0 \; K** Configure the McASP pins
/ e& T8 b- `9 g. C' z" k" n1 n** Input - Frame Sync, Clock and Serializer Rx% N# A _5 S7 r8 O3 g
** Output - Serializer Tx is connected to the input of the codec
* x$ U9 d% |7 D0 ~! }*/- ^1 d8 E' I) B2 C+ f
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);2 m! D. v. b6 J( v; k. s+ K8 _! ?
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 k- [1 q% L$ t( ^% o2 R% X0 T5 o
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) \& p5 W6 q8 m- F2 d' ~" h: ?| MCASP_PIN_ACLKX, _5 u6 \) Y" E9 Y& d
| MCASP_PIN_AHCLKX f8 ~7 g( u# a) a; ^
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */; J+ g# v% |0 q& ?* m/ \
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # W+ J+ Q) B7 S/ K3 D4 a7 s
| MCASP_TX_CLKFAIL 1 L: l, O, \ W# u
| MCASP_TX_SYNCERROR
# U5 J$ S5 D8 l$ V| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 l7 \6 z* b5 ?( h9 }; ~0 s( Z| MCASP_RX_CLKFAIL0 g4 ^( i N6 H. c
| MCASP_RX_SYNCERROR + x. N, P& A- M: ?' h% O% V+ l% W
| MCASP_RX_OVERRUN);4 ] O9 @8 j7 _
} static void I2SDataTxRxActivate(void), c1 ?8 G% @7 _" E7 C g2 S
{
9 P4 f, w/ [5 M6 J7 R4 Y* K/* Start the clocks */
+ f% ~* m) L/ r) h N! ZMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# n% X4 n6 Q! B+ V
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
5 U1 e* p( o- k* F W7 lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( G# r1 l: G7 C0 }9 _6 QEDMA3_TRIG_MODE_EVENT);0 x- J5 t7 Z* f& _. D' Y J% P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, r- Q% W o2 h! Z \9 }
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */9 \$ {, y# K. b, f4 N
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; `7 F$ j; N9 m& C: I! i9 `McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
, R1 R+ z3 k! A1 v5 w8 G; dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
# J; o& L8 \/ \- n CMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: O# K) W! j5 B8 {McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' y! R8 {+ W1 ^, j
}
7 ^" V2 c4 a, R请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 5 O. D7 [* v8 S% y
|