|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
8 t. w* Z" S+ \9 Uinput mcasp_ahclkx,
# b$ l7 _8 ` r+ D( {# Pinput mcasp_aclkx," C( \2 p9 p: q" q8 s
input axr0,
" j, `. L. x3 \) L6 t9 ~$ y q0 U8 ?: x9 S' `6 g+ `
output mcasp_afsr,- C& F+ O+ N) c! n$ w
output mcasp_ahclkr,4 V7 [0 `* |3 d
output mcasp_aclkr,
9 ]" ?5 _' C0 }- v* k7 Soutput axr1,6 l) N' f- ~% l$ E/ ~: H
assign mcasp_afsr = mcasp_afsx;
8 l: ?4 p% K8 x' d6 Bassign mcasp_aclkr = mcasp_aclkx;
4 z" }( u0 S4 I, bassign mcasp_ahclkr = mcasp_ahclkx;
3 z0 J$ ~ e5 X) G ^- passign axr1 = axr0; 7 K& e- |! E) ?( |
4 t4 U4 ^) Q6 s8 `; E5 D
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ( D4 [/ R8 @9 [# y% \- d7 u; J
static void McASPI2SConfigure(void)% ~0 x0 H9 _5 M
{
! r! H! X% @% n+ n* Z: t6 u2 U! _McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 U V- B% r4 pMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
. C& I$ ^4 r U k/ C. f, gMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" Y5 Z) C- U2 d: ? z" W
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */, z* q' W( L: D. [" j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: }/ d$ ]# b/ w2 j, @! R* SMCASP_RX_MODE_DMA);
% i+ ^9 Y7 |. p' V B7 pMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 Z& [7 `# V% N6 M
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" Q# L; W, u ~6 bMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' B3 K* v, P9 C* p1 U3 ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( t3 Z4 A( a4 A+ o4 \$ ~. Y) o
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ r: T R, L" r5 o& X& WMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
1 B5 }7 E+ J+ W# ?0 g6 p$ |, UMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);+ U. n# i3 J5 \- z) n# J
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 i! z& Q1 S# O$ c @& l, E
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 o4 l1 e. W6 F7 I0x00, 0xFF); /* configure the clock for transmitter */9 K8 q4 ~4 e8 N, e7 Y# u4 b Y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 ]% }8 j0 v* K7 H- w. S) I' Q' s
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( M6 f5 I$ }, b. \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# M) J L9 `+ m0x00, 0xFF);- k3 M- v$ `2 M' [2 Q* |
/ s& W$ c- \* G- s/* Enable synchronization of RX and TX sections */ ) }3 R% R% E2 A$ y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ W" @' k7 [1 L8 ], Z4 BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 P9 s& [" Y C: p# F4 n1 Q
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
: {! p$ h; [( A q** Set the serializers, Currently only one serializer is set as
* n4 e3 |/ ^4 P' S, E9 i. D7 `/ h** transmitter and one serializer as receiver.
. B4 B+ u2 _7 w5 n% V7 ]2 g7 @*/6 x4 Y. g' ?$ k( @; t" D
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ Z$ w: H8 F& ?
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*: h# Q; S* c, N: C' H0 |3 Z
** Configure the McASP pins
! }* ^4 H) U3 a! g** Input - Frame Sync, Clock and Serializer Rx* ^5 }! ?8 J/ t" a& _/ M$ I4 M7 L! h
** Output - Serializer Tx is connected to the input of the codec
; x& p7 P* L" w. s+ O; D; b*/3 r: |$ ^6 \+ ?0 _ K
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; G b! f( v0 X# C5 H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); J$ c6 t/ ]5 _
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 `" n& D7 d1 s
| MCASP_PIN_ACLKX
7 S8 R2 R' g$ @" j$ P| MCASP_PIN_AHCLKX, K% |* a* K( i/ d
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 l, h5 S# r0 y- k( q9 QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) v+ z( A+ O8 b& G6 q
| MCASP_TX_CLKFAIL % F! I$ _. ^: f7 N2 a
| MCASP_TX_SYNCERROR0 F7 m6 I0 ~5 i9 r+ |8 R: |9 H
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' G8 J- ]1 c5 V, ]| MCASP_RX_CLKFAIL7 Y# Z8 v2 }6 L3 U" }9 o/ r8 m
| MCASP_RX_SYNCERROR
1 A2 f" O+ x+ h5 @) G% p/ a| MCASP_RX_OVERRUN);% a: ~8 `. I! w& B$ Y1 X. W
} static void I2SDataTxRxActivate(void)
4 l( I: ~" u6 v{9 J5 }: | H* k N0 T& r
/* Start the clocks */6 E3 U5 G9 [+ g9 b U
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
( ]1 q! |5 J2 J# }) L [+ lMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 _4 g3 J. ^) ?4 j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 D$ H) h* `% m% a) xEDMA3_TRIG_MODE_EVENT);& s/ W" ]. Y& A& _ ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 v5 G) p' \ w Y6 @* ?
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */& {! }" @* ?5 Q# @9 o5 _
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- n ?& x+ ~( Q( ^. l% d7 y
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */2 v5 C3 y+ H9 ~: y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
v$ Y4 i3 T" u0 e9 lMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 o, }/ b m5 k3 r5 |
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& f. O: M9 o5 R0 B. c9 f1 ~: |}
! G+ ?. e. O& t请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ( P3 _) i; C0 f/ k/ Y, z, L4 ?
|