|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
$ V; M/ V; M$ j$ U3 K7 l+ X/ {# c1 ^# Vinput mcasp_ahclkx,4 _6 ], R. S2 {8 n5 y
input mcasp_aclkx,/ s# r! @7 ?. `) Q
input axr0,) E. L" e8 T1 y! t( `: i q; z
6 c( [; h; B5 u3 y! V2 Q: d6 E1 ^
output mcasp_afsr,. B3 m- e- q5 G) a/ q) R
output mcasp_ahclkr,
7 \: j% C" E1 R9 R* f% L( Woutput mcasp_aclkr,1 b0 @1 S0 }% {: A& K& G
output axr1,
2 Z# }- U- B& }1 U A$ W assign mcasp_afsr = mcasp_afsx;# n" i4 y0 P3 a) }' o- z9 v! } L( P
assign mcasp_aclkr = mcasp_aclkx;
- z% M! |8 q9 Qassign mcasp_ahclkr = mcasp_ahclkx;
5 j1 N# o' G. ^7 Q' A2 F9 z Wassign axr1 = axr0; 1 U$ M1 U; d1 ]+ ?; O7 w& |
9 ?9 q, w. x7 N j在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
8 p# f: ^0 J# Wstatic void McASPI2SConfigure(void)$ O/ g% ?- \: o! X# k: _
{ C& i+ l% d9 @: p/ V3 o3 k
McASPRxReset(SOC_MCASP_0_CTRL_REGS);( ]- c! C- W6 A: a9 J
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */& I+ h7 I% Y9 U P) Z6 y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; D; X- F7 \, f6 ^$ h
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 Y3 R) w8 M' l, C0 E
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 m' _9 T+ t( L3 s; Z. VMCASP_RX_MODE_DMA);
. v) X! S2 V+ zMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 M$ [- }9 S, F/ y
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
}, B* S- k; j+ W6 ?/ g" R/ gMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 r/ A7 j7 a! z* l% L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) s+ M, u5 ~5 n9 J2 J& r; z! D, B
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& k* Z4 u/ I) rMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
) q2 i4 m4 Y" FMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 N6 \# W; C$ b
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. b0 e0 m' R/ T& @' W+ QMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; ^5 o5 o4 S, ~; O& q0x00, 0xFF); /* configure the clock for transmitter */3 D" a; O" K- v% M8 i) l
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" N3 y9 _0 [( y% a
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 c2 w& i! _; I# L0 `: w1 J
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: j# f9 R8 v/ w5 H) U$ L0x00, 0xFF);
2 G: O4 f8 l. N, c& Q) Y: @) z9 E+ \
; A6 N+ ?2 v% i- ]/* Enable synchronization of RX and TX sections */ / P. l% Y7 ?6 r( b' D6 g$ }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
1 p, v% ]5 M! U% {' X+ [McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);5 Z% ~! J) V! r+ @; {% D
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*5 ^/ L9 E( [5 U* L* K
** Set the serializers, Currently only one serializer is set as1 z3 E7 I# p% z; v
** transmitter and one serializer as receiver.
- y/ I& |, [/ c: l; K- N; u9 Q j*/
, X+ }' T5 G8 GMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ R0 Q5 L% @: O. o# h. ^3 J7 o# tMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
! ?8 }" x! D8 Y$ ~3 ?( I& G0 [) k** Configure the McASP pins * s* g6 v" y! e% ^; @) ?! D, {
** Input - Frame Sync, Clock and Serializer Rx* U, b& Y, M; S" n8 V+ C
** Output - Serializer Tx is connected to the input of the codec
M, V$ n7 A0 O8 M! \; s7 R* Z*/; k U. z* {% v7 _3 m+ F1 r
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) k0 t9 }5 j4 o2 l6 B! f7 QMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ I% y6 u* [- }6 u' CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
, [7 E/ ~6 S9 U: u, u }6 |" o' P7 P| MCASP_PIN_ACLKX- A1 q" Z0 S. L; m0 {
| MCASP_PIN_AHCLKX
5 o# Q \/ |2 }- j+ `+ h5 C+ M' f4 E| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ ?# P7 }: o( |, X" }0 d
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR - H. f: b& \9 d) W
| MCASP_TX_CLKFAIL , U u" t9 @- y8 K1 R
| MCASP_TX_SYNCERROR! q/ ~% [2 B' _3 u' X
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # t; X% u+ n r* F2 f+ P$ t; B
| MCASP_RX_CLKFAIL! R6 \" w& Q; c7 R1 ?* i, f/ R5 [) T
| MCASP_RX_SYNCERROR
, ~ j# M1 V8 C- A6 U& ]| MCASP_RX_OVERRUN);+ ?# Y0 L$ Z. {$ m c9 u' a
} static void I2SDataTxRxActivate(void)
# @& k- V' g$ a" ~ \* P$ S& T+ e{
. l0 i& p* p& }( s# x/* Start the clocks */& C- `/ W' k- T) o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 d. E( l6 c' r+ X- z; \# H& m! D8 ]McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */* b' [7 s- n, Z1 E, o* e
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% {7 K4 b; R9 @7 Y4 F0 M2 c* qEDMA3_TRIG_MODE_EVENT);' h/ b4 q5 R( C- Y6 `. U
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ f' u" Y3 I4 c7 I& k7 R5 B
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */- m7 E5 n0 g' S9 R) e" h
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" {6 [ d8 f4 D( }# M
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */' O: _; s8 s! W9 ~
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 d0 ]0 c; x2 P7 w9 v$ a- pMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 S& K' K4 ~6 b. e6 n1 H$ f
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 `# W$ v3 g9 d4 L# m2 w0 ^} 0 I3 N; [! l% n, ~
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% k0 u: @4 m) D2 q8 N9 p, c& ]2 K |