|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,2 D9 W/ \, ?6 h8 H. a+ i
input mcasp_ahclkx,7 |" M7 T& F, ? ^. q/ X9 b! z j/ p
input mcasp_aclkx,
: P# g% F- G% }' W9 z$ Qinput axr0,
) I! j! P* A* q
4 ~ Z, ?8 M. z3 v4 ?1 A) Poutput mcasp_afsr,
# R, x- Y& ^3 K$ Q3 `output mcasp_ahclkr,
' }1 M( R+ p( F9 Doutput mcasp_aclkr,
- r. H: E0 V9 Z: X8 aoutput axr1,
9 e ]* n( Q8 N; s) e assign mcasp_afsr = mcasp_afsx;+ q+ v) u$ U8 T* `$ X6 H
assign mcasp_aclkr = mcasp_aclkx;
( I/ L$ b0 Z; Q$ I4 bassign mcasp_ahclkr = mcasp_ahclkx;
2 @* x$ O1 q9 `1 @. ]# i8 Nassign axr1 = axr0;
0 L q# q5 W7 B
% {, }7 T: s' B7 x) D, X在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
& n3 b5 l9 V1 A" l& ~9 Jstatic void McASPI2SConfigure(void)6 _% K* p! H' Q' E
{
5 }( r- f& G2 b* i, @McASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 F+ L# H) x7 W* M1 p9 T+ L' L nMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( H7 t% p6 E) A2 aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 P$ `7 |) |, v( l
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
8 x( H% u, a# R. }9 _McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 v! Z0 V# b X) P! W9 A, o; C
MCASP_RX_MODE_DMA);
; H7 _* x) K2 E; p: @* y6 u" T5 JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; {1 S8 R; j6 Y$ z+ aMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 o2 c! t* p" }2 H# L8 X( m, ]* VMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 }/ l5 y7 a' M8 I) X& z
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: d G* I1 ? wMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
9 ~( I4 y8 B& w5 @( u2 Z- \MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */' |! M! Q& s6 c. A
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) e8 n ^: u# |' w0 [8 H! wMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 ]! q9 w+ L* @2 c0 b' b9 ~/ KMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 q$ T' N$ Q% j! W z8 d6 g3 e0 y
0x00, 0xFF); /* configure the clock for transmitter */
* g+ w9 n' j7 fMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
" R$ H+ R9 z* y3 a1 g( a' x9 lMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" }) ?8 w5 F1 t( B0 y1 K( _McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# @7 I7 c5 m; s( _
0x00, 0xFF);( z# |. i( ?( ]+ z
* N, q( G: K3 D2 Y+ \0 E/* Enable synchronization of RX and TX sections */
) I7 b6 C. a/ B( {% A- IMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */' O K& ?: H' b) l9 l, M/ c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' P' a; v/ {5 h6 n. J n4 [5 O7 EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*1 F0 X% A" ^1 z. O3 l: g( V' \: _
** Set the serializers, Currently only one serializer is set as
" i% g E/ I' V* w+ ~** transmitter and one serializer as receiver.
$ w. i, M; q2 ]0 P2 `' k" q*/2 m& l& C1 N8 J2 f. |+ x+ {+ F) N
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 Z) ]7 M, E% _$ P1 ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*" }4 B2 ]5 m) F; D& D& s
** Configure the McASP pins + G$ L5 O ]7 f8 j+ |
** Input - Frame Sync, Clock and Serializer Rx
; j9 x/ N; S+ R3 ?- e1 O1 m$ R9 y& u** Output - Serializer Tx is connected to the input of the codec
: l7 g; w( \& F) b. \& F*/4 N) B- b' V: k& w) z& W
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ K' U8 F" Y1 u. G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 {: Q0 U. _: D* j" jMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; ]' E7 U$ N2 c! F7 p* n. V9 X i5 X| MCASP_PIN_ACLKX: a7 b" G6 {0 v6 N' `6 k+ Z+ w2 p4 R
| MCASP_PIN_AHCLKX O% `. x/ K! @
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
; v, ?1 E2 J! D$ lMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
; `; \; o8 O/ u) C| MCASP_TX_CLKFAIL
% Z$ ]& V( I, M| MCASP_TX_SYNCERROR
' a( y' ], k, r) [) W+ ]| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" g; \. h: e% k! o( ]| MCASP_RX_CLKFAIL" U3 X8 K* y- b. v9 r: z
| MCASP_RX_SYNCERROR
g6 Z) w, t6 A& v7 J) ~| MCASP_RX_OVERRUN);
# }$ s% [0 U' I) @} static void I2SDataTxRxActivate(void)
+ t8 G" h% y( a6 W1 t8 p{
2 t! |& X! z# h( }+ z5 I. r/* Start the clocks */
$ M+ M$ f( q6 |; gMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* q( w9 d9 ?! m) ?* q. G# Y+ [McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */- W" A: I3 m$ M r$ v! c! f9 o" W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 D; k: y8 L. h: }. t, L8 B
EDMA3_TRIG_MODE_EVENT);3 p5 e1 H0 a9 D" z; }* v. n
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 U/ c4 O1 @; i8 ?) w! N& t: A& z
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 Z2 ?$ u( a; Q6 Q9 ^McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 z/ R% a7 k0 V# m' WMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
6 u( W( X, s2 a; @& xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */( Z& _+ T- R; n5 _% J- ^
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 R; Y+ [. p4 P* N: C- C
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ `% z& x+ A" e! |! O" A1 _
} % a2 P& y5 K9 U' _; @3 w
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ) T& C: k+ X# l1 t9 |: x! ~
|