|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! K. U+ }2 n6 t+ R( Y/ E
input mcasp_ahclkx,
! H5 p5 h$ x, Xinput mcasp_aclkx,/ W* t: I. k! D7 [9 M
input axr0,
# D1 R" z. U7 S2 z: [9 t7 v5 x0 `3 F1 V1 j+ M- Y `. O7 k
output mcasp_afsr,
3 h: T3 u5 e( j# w- y4 ?/ Z0 youtput mcasp_ahclkr,
: ^0 U+ x7 }/ Q; Ooutput mcasp_aclkr,
% r* k& D; q+ L7 Poutput axr1,7 C8 |. `% ^4 Z+ T7 @
assign mcasp_afsr = mcasp_afsx;
" `1 p! h+ T" ], V) }assign mcasp_aclkr = mcasp_aclkx;2 f+ ]% w% ?" y8 g" [, M0 U! T% y
assign mcasp_ahclkr = mcasp_ahclkx;9 X0 I9 c! f8 q8 J5 I
assign axr1 = axr0; % c. `1 _5 p! @
+ \) o& Q5 K- H5 w+ j* X
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
; C: _& m4 u. s; |4 zstatic void McASPI2SConfigure(void)& D& [ b' a. K5 y5 h: k6 G$ K
{
% {" g$ v9 }$ {+ jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 r& M/ d; ^. D+ U! r; LMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 `' o. [6 d& r; p/ I( }) ^McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. E. ?) g* F2 I" @$ T, [) q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
' p$ b% N e) q! [% EMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 @6 Y( s6 G( L( @' S
MCASP_RX_MODE_DMA);- X2 d" p T \) x
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. f8 D* s8 t, I: ~0 q, R# f5 f/ yMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */: d1 m2 \( i3 J/ i. a" v2 f
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 j% W$ I3 u8 A g) G
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- r+ x0 x5 D( `8 N: h# D' s% N3 ]
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 F K, W: ^ H! ]4 D" P" l
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
6 w& w1 l: D# v1 ]McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# T1 G" s9 c; c# q1 C7 J* }$ c1 S
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
: o. ^3 }- i' w; ]McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ Q9 L$ K2 q! l) G C2 g$ Z0x00, 0xFF); /* configure the clock for transmitter */
: G! w" o2 v9 _3 Y% g( B. A( d8 cMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 K5 k8 n, ^+ n) W/ h- m
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 `# b3 @3 Y$ g1 d$ W- X
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 s' F& D: [0 o) z; e
0x00, 0xFF);2 `% `3 h8 b- S
- `5 U( c2 g2 [! P2 m% P6 f/* Enable synchronization of RX and TX sections */
$ g$ J9 O2 _0 M- j, o8 eMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
* y- o! n7 a" b" I8 O# A; MMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 G! F# h# r; r1 r
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
: J8 w7 D% ~% M) b3 ~$ _! p* p** Set the serializers, Currently only one serializer is set as( W0 [& s9 F- Z# F* v
** transmitter and one serializer as receiver.
\2 t' `% c- v*/
- `0 {7 |$ N _McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 E! W) n/ G0 S s6 c6 Y3 P
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*& I1 s1 [" Y, C3 E* V
** Configure the McASP pins 3 @( t' u' E8 A: J
** Input - Frame Sync, Clock and Serializer Rx2 z: i F7 \; B# v' r
** Output - Serializer Tx is connected to the input of the codec
/ N! K7 W; S8 g& R+ R5 c3 z& w*/6 ]8 ]- f" [0 x# \" z+ @5 r: t+ H
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) `$ ?+ V0 ~3 Q+ n. p) f% O
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 D$ r' }9 k# S. Y* fMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
* E3 \( U! p1 Z| MCASP_PIN_ACLKX5 b2 [3 ^6 E+ r% g, [1 o* n" j
| MCASP_PIN_AHCLKX
& X/ }9 d5 T W% i1 v$ m2 f5 H9 b| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
. f h; ?+ y7 {5 A7 uMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. t& U& {% {3 c0 S| MCASP_TX_CLKFAIL
( m j: ?3 t' \3 p8 s2 T| MCASP_TX_SYNCERROR; p* ?9 N8 g. U* S( F
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ Q" R H! l N5 ~| MCASP_RX_CLKFAIL
, m5 g2 T9 K( u4 U/ p9 B2 {* X( l; M| MCASP_RX_SYNCERROR
" m( i! Q5 b8 a( L- i| MCASP_RX_OVERRUN);( k2 }; B+ J | ~
} static void I2SDataTxRxActivate(void)
7 v7 `( R4 R ~* Z+ b% ]{2 ~+ U6 e( S# }( G" _% ^
/* Start the clocks */% j/ k |+ ?4 X
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
{ v3 k" f. GMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
# X8 z, R+ C' _0 QEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX," _. u. y3 U4 q" k
EDMA3_TRIG_MODE_EVENT);- W( }6 R, h; G2 f, n& b: b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % W5 w8 z1 u. K, _ Z6 I: x- Q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */3 q% B X8 ?! M- l$ ^/ g7 b0 P; g
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. a/ y& Y, \6 U- Z2 x0 @
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
r; A6 ]9 M, e! Dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& A6 o1 }& |% _; v3 X; F
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 k a5 l& a7 x; X8 q" N
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- c9 k9 w9 q3 r. A+ ]} / {0 g" f4 c/ ?. Z
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ; I f( X2 p1 m7 p4 D
|