|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,* J* I! J# J; j p6 D2 n6 \5 l
input mcasp_ahclkx,
+ a/ c# g! \6 F/ L- dinput mcasp_aclkx,/ |% y5 P2 j2 D0 V% ], D! _3 c
input axr0,9 y6 N g, z6 g% C
( D4 T0 j' y2 F" t# |( h0 n7 poutput mcasp_afsr,- A Y, k' k0 V
output mcasp_ahclkr,
4 Y4 F4 z. _# s; ~output mcasp_aclkr,2 k. a/ w: D7 X2 O0 _4 ]+ u
output axr1,/ R) J" c! V; }1 }+ U1 p
assign mcasp_afsr = mcasp_afsx;
" @. g# @ |! |+ t& n$ Fassign mcasp_aclkr = mcasp_aclkx;
& K+ } G! g1 A1 e/ k( Z! jassign mcasp_ahclkr = mcasp_ahclkx;3 T5 I' F7 W+ m; k( W5 [! ~! V; T$ |
assign axr1 = axr0; 4 X0 P' {* W5 C% ^+ ~/ {
_4 t3 d- |% {在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 # P, e4 q( i; V! e
static void McASPI2SConfigure(void)2 f, n. c! O- |
{4 z: l; y% l& J. f% g; D7 L, e% n" A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( K+ p2 Q& [9 A9 NMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */0 U! }" O) [ M& f$ J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% Z2 m% @% ?: R. a/ Y h3 MMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ `# @& Z5 @4 j6 m6 q U- R
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. ^8 z+ a: m' [- |$ w( r# j% m. d
MCASP_RX_MODE_DMA);
Y# n& q9 S4 c1 JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: m0 B& m+ B2 ^& EMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ t0 O3 h; {- B
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 N" s8 R* u: p8 Y. ]5 c
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 a1 @/ A% P. I* r- KMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 f2 v: N& R' C, t5 A
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */8 Q0 o' v9 K; J0 ~5 y9 v
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 F/ r/ F D( r9 w' A- TMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( @( W! }5 }# R: }
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, t" A' t! L# O7 s+ C1 c/ P
0x00, 0xFF); /* configure the clock for transmitter */5 [; q( u9 J3 r- }6 ]! R' l& h
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 f- g O) a. N6 `8 R3 @$ a1 q6 j qMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 u4 o" G3 ^3 P( _4 ~; d9 f
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 Q, w; I! F0 l* N
0x00, 0xFF);% ^8 e( M7 K6 L
1 F) I+ f3 O# E8 V0 h2 I
/* Enable synchronization of RX and TX sections */
$ |1 o/ Q+ b$ bMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
' S7 f! h' M- l- S: o/ IMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 W! u$ S) e4 AMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*- o0 k. Y1 O' q- k" H0 x( R4 }
** Set the serializers, Currently only one serializer is set as0 r( s R: ?5 B8 w$ F
** transmitter and one serializer as receiver.4 [5 I' h( x& n) C o' s
*/
4 h/ G! a) I' n9 X9 fMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 T/ y& |+ Z3 I; @. V, Z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*+ G. m9 J: t" q6 f H4 U' m
** Configure the McASP pins 9 t* i) W' ~: M9 _$ x7 c6 c
** Input - Frame Sync, Clock and Serializer Rx
6 I* ~8 ^9 e, w6 b* t** Output - Serializer Tx is connected to the input of the codec
9 e- X' I) w0 z& ?6 B" t*/
" U- S, f7 x. jMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);& ^+ _) e5 {- ?/ W- w
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) R5 E- z6 t/ ]+ x c# c; E
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 Z, Q# l$ j' K8 r5 g3 ?! v6 u) \
| MCASP_PIN_ACLKX
/ k0 u3 ?/ W- i ^* F J| MCASP_PIN_AHCLKX, l' X) B+ O2 U. h9 Y
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// m' f0 @( t1 Q0 O; I% s
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
/ A; E- x8 f1 w! v. _| MCASP_TX_CLKFAIL % B1 `! [3 v* c) F
| MCASP_TX_SYNCERROR" j' {8 a% v q/ F2 T
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" e- }7 f( d ]/ b| MCASP_RX_CLKFAIL% P8 i& p, N5 r {$ L& D
| MCASP_RX_SYNCERROR
1 O1 z2 }! v' g| MCASP_RX_OVERRUN);( }6 y) c; L; V
} static void I2SDataTxRxActivate(void)9 \1 W Y; B8 q5 h9 B8 i3 x# s
{) f3 x/ ?4 b# b) C o0 [) t4 d
/* Start the clocks */
$ b$ ?" [" x9 e: q, \7 {8 qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 C7 s `5 Q% l0 E6 m0 z4 c/ nMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */: G( D/ P0 `' k
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: A" e: q; O/ B& k0 y9 `5 \ ~
EDMA3_TRIG_MODE_EVENT);
$ I# k3 r9 O0 Z# R2 c$ L8 _EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& |5 k% n5 f5 U% P8 w) EEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */" A6 Z8 @$ u1 q; J
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 A" W7 X& W' @3 L, a4 WMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */1 G- s- n$ U2 _# l7 R9 W) |
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */: D3 k. ^ e# C
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
6 k8 G2 k4 O5 c' J: KMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);: K% R8 L! [- ]) E* t
} / L: Q" p$ ~: D. t3 m; K1 U) D
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. " t, p/ {& s. ~0 p5 A
|