|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
$ |, b. N: r1 F: G; Finput mcasp_ahclkx,3 @0 z' \8 A, s% T
input mcasp_aclkx,9 @' X C: ~, \. ^4 j' f
input axr0,
4 [9 L8 G' M$ O* T' g* C0 |$ J; v7 u2 x+ Y# }- E
output mcasp_afsr,
+ f; [4 ~6 B M4 w& F, H3 eoutput mcasp_ahclkr,2 Q4 C E1 k! Z$ w0 [
output mcasp_aclkr,9 ^2 J$ {3 |: `4 }# E2 L: n
output axr1,
}! g' e( U% g' u9 K! n assign mcasp_afsr = mcasp_afsx;
# Z# I* v9 ?% r* ?* gassign mcasp_aclkr = mcasp_aclkx;
/ w1 s; C. v4 A# Oassign mcasp_ahclkr = mcasp_ahclkx;# g5 S+ y( @- ^* Z7 y) u' o/ c
assign axr1 = axr0; " K7 `! s/ t' V7 Q
! T' X/ h, e. Z0 Q' y1 s% f在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 * S: D4 }3 n/ l6 m# @& }$ m
static void McASPI2SConfigure(void)
1 F8 t0 j6 G. i{8 J% N* s2 {8 s# k$ s! ?
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 L" B, z& e; | L! ]( j$ M, f" MMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
* ^; z4 B# R# M. rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 T" U! G. @: i
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */. i0 p, l9 G: @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; Y1 i9 h! L% M
MCASP_RX_MODE_DMA);) i0 n: {2 b5 C6 ]. M) J
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( e/ x5 Q5 S6 U- R: B9 O4 C
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* S; T) J. y( M, \! zMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 Y) N6 x4 @( I0 S" l. n& U" f
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
~! b9 J. q! L& C! J3 T! yMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 n0 o) C y2 e6 i( L! KMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */ w% [5 V+ m& z; h/ h- G" I
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& o1 ?0 p) z. N9 j7 x5 t
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& {& S5 J* p: a2 K- NMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 ^, Q6 q1 r7 k0x00, 0xFF); /* configure the clock for transmitter */
/ D( S8 v( a9 _! wMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; n9 `( Y: q+ ~. n( N7 \McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 W7 K B7 L& }+ y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, ^' j, ]* Q3 }: O/ o0x00, 0xFF);$ a4 N$ M5 \* k3 z2 I" [+ p
& p- B, d9 q- f; o) ]) B% K! F. \/* Enable synchronization of RX and TX sections */
/ S2 H8 H% U8 ?! O4 t: X' z* PMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */ [8 x* d7 @1 f- G2 Q' Y( H
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ V* {! Z8 D! L' c! ?
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 e: r' B& X9 v& K9 b$ t* {
** Set the serializers, Currently only one serializer is set as7 {7 G/ ?" w. v: D2 X% z- w" y0 a S
** transmitter and one serializer as receiver.5 d6 X8 p/ p% M0 L N0 {& j
*/
# K0 \/ V; T, \! ?0 d) rMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" a" E2 L0 T% @% T# _' f3 Y) E
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
, m( e& I5 k* G% |2 C' {* E** Configure the McASP pins $ u. l! W3 S9 ], z; r& f! X3 t" H9 T
** Input - Frame Sync, Clock and Serializer Rx
! `# |1 @4 l9 e$ J5 T. k0 V4 [** Output - Serializer Tx is connected to the input of the codec * S4 C" u1 ]4 C& f
*/
- C- C) s# M0 Z8 e5 W$ m f( t2 MMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- G" M6 S* x' p' i+ e3 o; K
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
7 U3 U, o) ?5 P$ Z! B6 zMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. G6 o( k: L+ @: f! J0 O9 o& Y h| MCASP_PIN_ACLKX: _; ~- k9 b% F% g, m/ y: q
| MCASP_PIN_AHCLKX
* s( \5 h* M& I7 r2 L3 z| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 l6 m+ M4 U6 R3 L' O- U
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- v( W, h) ]& |3 q6 r| MCASP_TX_CLKFAIL
- _& T! F1 k% n| MCASP_TX_SYNCERROR0 S6 v7 e$ l1 `+ R1 g% V5 T
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' E# P' f1 J. R9 u1 P4 R Q) N4 @8 v
| MCASP_RX_CLKFAIL
) d% J6 @ P# B- h: ~8 R| MCASP_RX_SYNCERROR ' t# o; s$ |/ Q7 z# y0 W% V
| MCASP_RX_OVERRUN);
]+ f( ~8 u3 F& ^% X) G} static void I2SDataTxRxActivate(void)
$ v- N& F, N2 k6 z+ ~, O{
) X4 G% R9 l- _ ? }" Q/* Start the clocks */
3 ]- M! N$ P* N; B0 xMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ z" O# a+ {! f- Q: c1 X/ EMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) p& V/ S8 U3 n: BEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 P# |" Q8 l8 [+ H
EDMA3_TRIG_MODE_EVENT);
6 T% Y s9 U U6 q; BEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 v1 T8 H& Z& e, F, W6 m" O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */( i, P8 [/ L; @. R
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' I& L- U( T4 N) F" ]4 P- m# ~
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
3 S. y% @6 C5 ]while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */+ Q% {; N/ ?( Z H7 k+ S
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
9 M) v$ x% h; {McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, W' x, Z6 U+ u, S) E
} 1 | Q5 H. ]) o
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. & ]' H- ~8 F K; J, ?
|