|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
" L! ]" _% t$ ~/ V- _ V# ginput mcasp_ahclkx,1 ]# W$ N* `; O- [# g
input mcasp_aclkx,6 L' l1 ?" l9 X
input axr0,
4 l3 Z2 k2 @% G$ n$ ]' M; h+ i1 Z* Y2 ?- i p1 Y
output mcasp_afsr,
! M) J$ t/ \" a9 c& H) woutput mcasp_ahclkr,9 Y; I4 H- ~1 R! J$ S( T4 d7 ^# f' r
output mcasp_aclkr,) f+ v9 ?( R" [; S+ S
output axr1,
9 S+ f5 k) e. {4 V$ L F assign mcasp_afsr = mcasp_afsx;/ n7 o9 a' w, H0 u' U" x2 r6 e
assign mcasp_aclkr = mcasp_aclkx;
3 J5 I, Z7 F7 |7 ]) i/ p# _/ _assign mcasp_ahclkr = mcasp_ahclkx;
' I! Y) A7 `& U0 {' H# passign axr1 = axr0; 6 f1 P e7 T7 N2 O' _% P. n
0 B- P% ^) a5 l# K' N
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
. r. J$ ?0 b/ _% y" ]+ C0 Istatic void McASPI2SConfigure(void)' G! |: }. v; ]2 R7 f `/ A
{
: {$ d7 c4 v, [McASPRxReset(SOC_MCASP_0_CTRL_REGS);. m! _- w) v. i9 Y2 S! U5 m
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
& ~* w3 K" G0 T0 y) uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 Y* H4 E7 t3 j& o( w9 DMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */" N8 S; ~* Z3 t S/ a
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 Z# y b; L* ]: J) y7 D. L
MCASP_RX_MODE_DMA);) f2 d- P- ~/ T4 R% c& F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. s* E0 Q- S V8 n
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots *// ^1 \! l) p$ S, a3 r
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- g. e& _+ W- d+ r: D; I E' XMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 w5 @3 D1 o' \- j4 yMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, , Q$ V) n/ G# r$ W0 c& T
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% C% F' b* z$ h& H7 O
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# d6 q" H6 ]" _) q& @$ i* U4 K7 f
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. ~2 Y D0 s4 D5 b6 [McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 T. p% F0 m; ^' u' m1 d
0x00, 0xFF); /* configure the clock for transmitter */
) m) n$ A1 `+ }- b7 I! G& T) L6 oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: c; l( L6 t7 e1 Y' ?
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' @5 Z8 V& l' Z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ E% U; D" |- `( d- F0x00, 0xFF);# k3 s" B5 _1 C- D
% ^6 l7 k$ a1 c6 {# S
/* Enable synchronization of RX and TX sections */
+ l) B4 `# N+ v" aMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */: \. s& `8 e- L1 h
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ M/ b6 @* M! P. b) E7 M2 b
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
9 W1 E1 p9 O7 d3 Q** Set the serializers, Currently only one serializer is set as0 Q- x% Y. D6 u5 ~, F& r
** transmitter and one serializer as receiver.! P, v( t7 f2 M9 x
*/
$ h5 N( b2 |# H; x* `% gMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 T, f0 l$ A. I0 y4 TMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*7 x. o1 k) t. p( P& m x: n
** Configure the McASP pins 3 B& W' Q w& o1 C% y3 S2 p
** Input - Frame Sync, Clock and Serializer Rx
4 |% B" r! R% }3 b) E n4 S$ u** Output - Serializer Tx is connected to the input of the codec O. @8 S$ _) B1 w7 I
*/ T7 p# |/ ?& ^4 H, P: J4 [7 ^
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; C a- @/ ^& G) sMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 c/ E5 I# b: l: P8 S$ e/ UMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* |, k% I! h' |! W- g. S7 r
| MCASP_PIN_ACLKX
" D7 F. n7 ^! M9 K% ?4 M4 p| MCASP_PIN_AHCLKX
8 y9 f* {) c; D) U6 || MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 m# J5 j8 U$ Y5 a. jMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! O" t! ~; a& Y$ |, E) y i| MCASP_TX_CLKFAIL 7 K9 y9 q O% o
| MCASP_TX_SYNCERROR
: u: `) z6 a/ D7 k2 [! T| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- W; v9 ]6 j3 M+ o# P+ L# N) O| MCASP_RX_CLKFAIL
# q9 Q& r4 T! j0 p9 ~2 R. Y8 n5 c" @| MCASP_RX_SYNCERROR / n% h R$ A% ^' i) F
| MCASP_RX_OVERRUN);
' `6 i. X3 X+ t1 q! N' y} static void I2SDataTxRxActivate(void)* s- M, Y# q4 x
{; b% L, z3 J6 u0 J* v
/* Start the clocks */
1 E3 R/ H4 S% } C: i3 f; kMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ q6 s. Z7 j7 [$ w6 K' I" \McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */2 V8 J( a3 D+ |) Q7 k" U8 M6 P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 u3 R. Q3 N* |! O6 H2 W' T8 xEDMA3_TRIG_MODE_EVENT);6 `' X1 X0 P" t) M5 B- ~$ s% D) X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 @0 F8 U( h# f4 {9 Y6 p2 d
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ n3 B) Q5 Z8 h8 _/ qMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& g7 b9 P0 s) \* C* v2 r
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */' T9 E$ |+ r! x% V/ O; X, l; b7 [
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */, T: i. f. ~- t/ k9 e5 Q7 l
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ W3 V, m* ]5 q4 _& V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( y ?" F" I0 A0 p* i' F7 p} q% Y0 i b7 H. y9 e3 Y
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . l$ l$ f$ {5 H4 B l/ a& t
|