|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, B+ y0 k; j: {6 b
input mcasp_ahclkx,
& \$ G0 F$ v- Uinput mcasp_aclkx,- i& B" H9 O7 Q& h& W5 E
input axr0,
1 _/ B* l0 E6 } h
- k0 x! O7 `: y; `- Z7 c3 ?output mcasp_afsr,. N' L5 b* N3 f, X
output mcasp_ahclkr,
% E# V- n* i9 W: t1 Goutput mcasp_aclkr,
1 K5 g. d# W& L& ]output axr1,9 v* c$ j* I+ k) V
assign mcasp_afsr = mcasp_afsx;1 y2 j1 J6 I" a! V8 }: l) e
assign mcasp_aclkr = mcasp_aclkx;
. B, r1 A# F; r% Gassign mcasp_ahclkr = mcasp_ahclkx;
6 x$ R8 B1 A6 g) wassign axr1 = axr0; : J3 C. S6 z# q# X$ I6 ?
2 K2 f+ u* `+ U6 p# K A' Z在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 . O, ?$ G7 T6 f9 i6 ^6 K5 T5 b0 O
static void McASPI2SConfigure(void)
4 e" J' _3 B/ p# H{, m& i* J( [1 x) [4 s" T
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 M9 M% r! ]' c- n8 S6 lMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */, l( Q+ T8 H- N' j# @0 M) a
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! a" _. C! f% V2 g6 @+ g
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) X% ^* w7 @1 P* ~3 Q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 Q: x0 m; ]/ t' n" mMCASP_RX_MODE_DMA);: d/ l# L0 P, X( U9 X1 @- b& R- M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; B. S+ b& M$ y" a1 z2 z0 o3 qMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- R2 c( p z& Y1 K& i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
# b, U# ~& q7 z' k$ }MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 T5 N5 F7 v1 O: R4 l4 M, tMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ' u7 Q8 r4 ?4 L) r+ n' E/ J z
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */! k- g' C9 d+ _: _! w
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
. @6 P! n6 `* Z% g. F* S: YMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) s: Z' `% T9 `, H1 D: {. j
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. ]& Q8 M! V1 X) `7 J4 G% P0x00, 0xFF); /* configure the clock for transmitter */+ d8 L8 o) U/ k6 P, g
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; h! ?( \2 R/ V, j1 ?' F( U
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 H/ [4 j6 u; O) k+ x" x+ Y6 Z/ B
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- d0 H6 ]5 g# C$ B' o0x00, 0xFF);
+ R6 P0 a' |" E2 `. A$ Z; {% R0 y: S9 S3 F/ |& J
/* Enable synchronization of RX and TX sections */
* b1 Z1 ?9 u/ O: R9 m9 }; KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 X; ?4 `" Z$ Y+ PMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) J% j" A8 c+ N6 \2 x7 s. w4 qMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*6 S5 b- h/ X' G' h6 |2 J; r: u
** Set the serializers, Currently only one serializer is set as2 r ?9 q" b/ U; J; M
** transmitter and one serializer as receiver.
1 _% J8 \( J6 P* L/ M# K( t*/
' S0 f' y$ F$ U2 X# J5 u# S$ H$ V7 lMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
0 R3 o4 \( A2 j- _" ^McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
& R# K& ^2 [/ @) z. c0 }! I& D** Configure the McASP pins
+ d. I& k' f4 o' F; G8 W** Input - Frame Sync, Clock and Serializer Rx
* V% G: m7 J8 O( V/ ~# H- F** Output - Serializer Tx is connected to the input of the codec
0 B) C0 C# V) c2 `9 n ~*/. V# ? `) R s, Q
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
& h& @9 R8 P* PMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 c/ T) F! I: ?1 F' x
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# ~* l# V' {) J& o$ j- R5 }% V
| MCASP_PIN_ACLKX
+ ]6 x: D! T' w/ v% k# x1 X| MCASP_PIN_AHCLKX
W: r/ v; K8 K4 y' S# u+ }6 t| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 i$ U2 X0 V( f8 v' N& @ F
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , D5 T& W& e! u, t7 ]- b6 T
| MCASP_TX_CLKFAIL
% G1 C9 x; G1 L$ I' U; Y| MCASP_TX_SYNCERROR) n& U+ l: r' z5 A! b' a- z- H# [, c
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 Q6 A/ F# M0 s9 A* U
| MCASP_RX_CLKFAIL
; J$ g( c# N3 e0 O7 b6 E, I u| MCASP_RX_SYNCERROR
$ r/ {" K: Q/ A0 F| MCASP_RX_OVERRUN);7 |$ I8 @: _ l3 Z$ E6 ]0 X% l& R
} static void I2SDataTxRxActivate(void)/ Y6 |: @: L% N+ m& V8 n
{
& |- v# B, j0 ]1 Y% `3 c/* Start the clocks */9 G5 b" K! w' x% ]: h/ g
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 V4 V+ c/ O2 w- s* [! R K3 C
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! b% ~* U& P2 ~3 q* B5 h- HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 W0 M1 \& f; J. ?6 o
EDMA3_TRIG_MODE_EVENT);
2 e, M3 W+ q% W/ _1 K% O& X" h2 MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # Q, n+ g: |; G2 l3 y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ a# Z6 K5 M R, Q9 @8 [4 ?! R
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 k5 A5 y c. X# c6 r# g. ]
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
. M: S9 Z* X7 g6 ?, dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& a6 d. X8 ]6 n6 @; v: ?4 T
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
9 n7 ]0 ]( n* CMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);* O$ U, ]+ d1 l: S/ V5 @8 b k
} - j/ C3 B: i( [( ~) V; f0 G
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ p" e4 r5 Z6 L9 Z" R+ k } |