|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
/ @# x& B1 d8 R3 {/ Uinput mcasp_ahclkx,. Y+ ?; o M0 z+ D% b! d
input mcasp_aclkx,) P @/ [! z/ K, i, e
input axr0,
0 z: r- d+ t( {) ?9 y/ X3 _" ~( b! U4 y' D7 L6 Z7 B. } e
output mcasp_afsr,5 y( H: D" v& E3 @* I, S
output mcasp_ahclkr,- S" Y! w; M% n) _
output mcasp_aclkr,& _) q) Y) F$ `5 @* |) h# X$ [5 [. q, ~7 ?
output axr1,$ I! j# |; ]! m( V) W
assign mcasp_afsr = mcasp_afsx;
+ Y4 w5 f+ `! Lassign mcasp_aclkr = mcasp_aclkx;
0 X8 ?* O) B" u2 s5 Qassign mcasp_ahclkr = mcasp_ahclkx;
: O& j7 \3 p7 @ ~6 H! m# ~assign axr1 = axr0; ; c, N& U* B0 e
# X! I3 T) B: k6 T l0 M
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ L* e3 A1 J3 e5 ?static void McASPI2SConfigure(void)! N z9 a, }6 J3 B' s/ B2 ~4 A
{' s/ F) ]' b' p( f# f9 T
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! q' d' E# G) z6 z$ I* q" I/ h1 j, l! c
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 [- S) N5 i+ nMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- j& v2 c5 s% t' J
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */7 o( n# H* ~" X. o; \0 g6 g
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) R1 h: \+ @# H5 [) bMCASP_RX_MODE_DMA);6 O9 Z" r0 \$ m) }# t8 P( m. U
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ j: N# }0 C& j" u7 k2 `
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* ~, P, X* z8 i0 W5 X
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 k+ A: ~3 {4 ?$ s% K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ F2 F% l( F5 T SMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 0 Y! i& F) n ^* L2 J8 p2 ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */ D$ Q1 p2 D5 o: s: I9 p
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 V+ n3 I/ q8 Q: o# x) SMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 t; a* Q6 f$ I" V7 ]3 x6 w
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- Z" r& N2 f. v, _" m( W# T( D
0x00, 0xFF); /* configure the clock for transmitter */5 [7 l4 n* S6 H6 h
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
7 l- {& d4 R6 {1 Z9 jMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& v6 u0 A) R( IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* }" r; {( M3 p [& O1 ?3 n3 n
0x00, 0xFF);
* n' O6 E% h8 H
B, E. X/ r# ~$ Y/* Enable synchronization of RX and TX sections */
4 G0 W" v+ D& W2 |McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */' ~0 D B5 C1 x% l t
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- T' e% C* ?# Y3 P+ s4 V. C" dMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
/ P2 W* p1 z( t9 I2 N$ A/ g8 ]) G** Set the serializers, Currently only one serializer is set as, D5 ]$ B$ P9 h; I; ?9 L) Q
** transmitter and one serializer as receiver.
# U4 C6 f' q" o( J2 b! b*/+ f, A' E$ y* H5 m
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! _3 [# T9 F4 vMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ `+ f+ K) z" }% U1 a5 l) G1 L
** Configure the McASP pins
$ U. W5 V! M8 A! C/ E0 ~: G! ^** Input - Frame Sync, Clock and Serializer Rx
" E& b; c6 r }6 W4 L9 e. m** Output - Serializer Tx is connected to the input of the codec r2 y+ f7 m( C% b, m- O/ g. H
*/
9 u* R9 ?3 ^& D& r4 q" ^) ~4 h" }McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# f) c5 C% |/ f: [: G4 JMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 C, F+ [5 }0 b* sMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 c- m4 W$ E! \
| MCASP_PIN_ACLKX( z- R$ m0 R+ u: F9 A$ A
| MCASP_PIN_AHCLKX
% l3 Y+ m! K. Y# i$ U9 v# e| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' n. [; _6 d8 O3 C2 R
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& V$ Y& a8 C# C/ c| MCASP_TX_CLKFAIL
; w* D Y# Y/ a/ q: q4 f5 @! y! @7 Y| MCASP_TX_SYNCERROR$ _9 f% @: V+ k P7 a& p/ ] M* T; q8 k
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) \+ ?# f, `+ l+ R| MCASP_RX_CLKFAIL8 b) P0 S2 V2 r5 l9 U/ P4 L% R' n% {
| MCASP_RX_SYNCERROR 7 U* `7 M/ _2 ]
| MCASP_RX_OVERRUN);# U9 j$ ^. Z7 f
} static void I2SDataTxRxActivate(void)
# z2 X( O$ N, W5 p, o3 D{
5 K7 W$ l3 z) J, I: r8 E, r! j5 u/* Start the clocks */
0 `( ]! Q, [* p' p4 T NMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
7 k# v9 o- z! \" e/ {9 pMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */6 Y' R+ G: T7 [ T3 j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 M# U. j" v2 |- ZEDMA3_TRIG_MODE_EVENT);1 @' v9 v, f; l& c. ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : D: k9 P( m) m
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */7 L! Z% f# Q: ^# l+ n' @" A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, S8 A# c0 U6 s( U1 R- e& D' r: VMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 b$ q; }: m% Q$ a+ s0 xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
& L/ P2 J8 |0 C5 FMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);+ P. K! x- x6 O: _' k5 F
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 H( B& D5 T @} & x- B5 e3 s# W0 D' x* h9 S, I W
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ [7 w0 B. l0 q0 G |