|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, N8 m$ A& l4 Q0 P3 b& i
input mcasp_ahclkx,
+ h) @/ A4 d* }input mcasp_aclkx,$ j' S$ @. u6 Q3 o
input axr0,
3 V& S) {) B! `% b2 k
4 Z: G3 {1 Q) K6 {" [, @output mcasp_afsr,
. b8 u" Q8 O0 A3 G3 Q) B1 r, Ioutput mcasp_ahclkr,
' e; j6 N- [& B# ]4 v5 qoutput mcasp_aclkr,+ Z d4 W! l4 B# ^0 d
output axr1,
, g U/ \# x* j% G! b assign mcasp_afsr = mcasp_afsx;
7 u) c3 n6 P8 }) K+ p( Rassign mcasp_aclkr = mcasp_aclkx;
; h1 i& Y' S! R1 O- massign mcasp_ahclkr = mcasp_ahclkx;
1 k" ^: ?7 t) G% l1 k# j0 oassign axr1 = axr0; 7 D! R/ M. ^, Z \' D2 U( ?: L8 _
: z1 l: T/ k' X
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
' Z+ b4 F9 c7 ?4 ]2 nstatic void McASPI2SConfigure(void)
2 B* \4 V8 d( m( O6 L9 u5 E{0 L# v/ g' `, k
McASPRxReset(SOC_MCASP_0_CTRL_REGS);6 E0 {; P7 F" Q% W, Q+ t
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */9 N% O' z5 ~/ y/ g0 p4 V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 J2 X3 P3 d2 J5 {- ]McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */0 G0 w3 c% {5 D, o4 E# D+ D) S% t
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 p6 t! o8 b0 X& @8 |0 ?1 j5 qMCASP_RX_MODE_DMA);8 p, J. |& F" \- f g* E+ _* O
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) h; Y: B. _, g1 S- U5 @& {MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
r6 n/ A0 M" q. b& M' \) HMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 }% P% e# l o8 B; w% E# q! gMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: Y) X4 v( l: G1 E G" _McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 U; x& f. Q+ S8 U: Q+ PMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */2 G$ T" w9 x- E. N3 Q
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* j# V$ x9 S$ B) D, U5 C( c
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); c. V6 S- o3 s2 R5 O! V& J
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 a' I! _. r3 n& z0x00, 0xFF); /* configure the clock for transmitter */
4 \! f) V" U7 E6 T6 V; DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( M0 n( s8 s- uMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 b6 t: I. ~# [: b. e) S
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,' P7 I; H& j: D3 c
0x00, 0xFF);
3 [5 g0 l" @; y% j) [
- r4 e+ h6 q8 d) O/* Enable synchronization of RX and TX sections */
. q. ~& N1 b; R- P/ kMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
& x# H; u/ n$ N0 c0 x9 z' mMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, L0 Y* ?; J* E" CMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
% K X4 [3 w( z# K1 z$ w** Set the serializers, Currently only one serializer is set as
$ p% H$ W- x( L9 Z** transmitter and one serializer as receiver.; v; y- U% C7 K( a- U2 V/ X" o( P
*/8 i- d2 O; E( l! `4 x% H
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 G/ R& a# m# {0 g- ~
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*( x" j+ r$ R6 L1 A# p. s
** Configure the McASP pins 6 X- O% n/ v) Q ^1 ?
** Input - Frame Sync, Clock and Serializer Rx
" |) ^$ K; C* Y& t1 p2 j4 ?9 \3 y" s** Output - Serializer Tx is connected to the input of the codec
9 [+ ]5 C1 ]8 J# A6 V c*/
2 v! N5 O9 [4 Q+ o( X: ? IMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) F1 A+ K) ?) u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; X' g7 I! j. |8 D( l. E2 yMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' `9 j5 {! F! {! p g| MCASP_PIN_ACLKX
( C+ o) K/ h$ a/ O| MCASP_PIN_AHCLKX
; F. \% J0 w4 P| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
" M' L0 F6 d3 E) M' w1 t" t9 [McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 w6 _+ O9 N+ s1 q* N
| MCASP_TX_CLKFAIL
1 N, W- G0 K9 f- C| MCASP_TX_SYNCERROR
: r6 Y& a6 h: d! t3 [0 P| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% a( e- X! N+ N" Z, [| MCASP_RX_CLKFAIL
, [. S9 \- j& o5 d. v: v| MCASP_RX_SYNCERROR ) Y8 _6 I6 @5 A) v
| MCASP_RX_OVERRUN);
3 \( j5 G5 ?$ E} static void I2SDataTxRxActivate(void)
7 |' R% Z- R: \ V) h{0 \. ] x% y: S& `% q* N4 n
/* Start the clocks */
8 s ^& q' t" e# YMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ k7 y+ y; t4 J- n9 ^/ o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 i, F2 X: J7 L: vEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 I0 E1 p) _; x5 Y
EDMA3_TRIG_MODE_EVENT);* R! d1 p# Q+ k, ]- K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / [& Y) Z) R8 G$ L' J
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
$ ?8 l) B2 Z/ ]2 ?) A' VMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
& R) q2 d' ]4 E. f7 q1 G5 M# ]McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ E6 M6 w- k% a* {while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
9 X2 i g/ f$ Y, aMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( i" Q% b3 W3 _( tMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);: H2 M1 v. w$ d. l/ h$ ^9 m: X& G
} ) J% G- j, a( O
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: r- m- r+ H1 `9 y6 q+ X' J |