|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,; c, }: u2 w1 m2 a+ K- |1 U. q& p0 ?
input mcasp_ahclkx,
/ s3 W- X; j7 e9 @$ pinput mcasp_aclkx,/ y7 V8 a2 F( N$ V0 L8 Y' S
input axr0,9 I# D3 L+ ?, t; j
9 U# D: ?0 e: `, B% y' [! Moutput mcasp_afsr,# y* q, F. y- }( x3 D) o
output mcasp_ahclkr,
! n8 {- d6 \' c) H5 `+ J5 E# t! koutput mcasp_aclkr,' @6 d/ p" p# J* A! \7 `
output axr1,
5 G O+ @ w. C assign mcasp_afsr = mcasp_afsx;! _3 \7 |4 r' X
assign mcasp_aclkr = mcasp_aclkx;
& h" h- c: i! {! Sassign mcasp_ahclkr = mcasp_ahclkx;$ r5 Q! t% v5 l5 G
assign axr1 = axr0;
: U* e' m" u( W$ c. v! r. ]( R4 z
+ ~, l/ |' V3 R8 i- r% U+ J" |6 D在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + _ \% K/ Y8 M$ r: F& [' e
static void McASPI2SConfigure(void)
9 k7 Q3 e7 K8 A* e$ i9 H{' @" p% \) A! _3 [- y& S8 H
McASPRxReset(SOC_MCASP_0_CTRL_REGS);4 e$ g1 m7 K* k- z0 ~0 s7 ]
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 ]: d3 f! ~1 {McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' s' X4 k4 }% i/ E" C$ e) VMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ \) c: S' `8 G9 _% A! s: p7 ?7 i
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ j6 O3 \# ], ~% R
MCASP_RX_MODE_DMA);* Z& |2 a6 U; M1 d' t
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# `6 r8 E# V7 J- o/ T
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */' q3 {2 M6 ^6 g* O8 b
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 m: H; [7 \7 P# I# _6 _, Q! [) j2 s
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* M# l6 @6 e5 D' {( B' z# VMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 }2 f" `) K: R& V9 X
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
) H1 ~2 D1 w; @7 o0 @4 V& ?' E" JMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* A- H: U7 h* c6 r
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 M9 B. ?# c! c$ `: D( r" d
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& o& X+ l% g5 }+ _; e) f0x00, 0xFF); /* configure the clock for transmitter */
0 s+ W! x" K7 y" Z) TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. D6 @1 _: ]5 o0 H/ ]1 n! iMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 7 p2 `; h' f3 X" H6 _ Z S
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: |4 U9 U! X& g! ]$ W4 }
0x00, 0xFF);( a" \) S5 u( E& N: x
; [6 Y Z1 s0 t+ \/* Enable synchronization of RX and TX sections */
1 `5 i, S2 w w' U) P2 zMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 s+ h s6 a) w" \McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); J9 c6 Q u- h0 {! T% N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
' L/ J! D6 [, {: f; J/ l U" R0 m** Set the serializers, Currently only one serializer is set as
$ j+ ^( `! r( \4 i/ L) f1 P7 D** transmitter and one serializer as receiver.
4 s* h w) C8 w" p0 D*/
8 c' o2 G1 k5 aMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 j. W9 P7 N$ j0 h% IMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
8 J7 C6 T$ y# t5 [/ }5 o* d** Configure the McASP pins
6 c8 J1 J( N/ T1 P* K0 b** Input - Frame Sync, Clock and Serializer Rx
) ^( Z9 j9 Y" @) h** Output - Serializer Tx is connected to the input of the codec
1 R$ o L4 o& f! ]$ J( E+ O*/
6 @, I+ `0 H" I7 h' i% }& u+ zMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; A1 G6 B: Q# m2 \McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
' W; b# i, f6 N3 WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: V/ [" M* L5 i/ U% S5 X a" F' n
| MCASP_PIN_ACLKX
% H+ ? w, u7 l: l6 y| MCASP_PIN_AHCLKX
8 B( _4 J3 Y/ I! t. e0 j8 ]| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
- ^" Q' q. r$ wMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! V9 n6 N/ C# e| MCASP_TX_CLKFAIL
% Y4 C5 p& T$ @2 M| MCASP_TX_SYNCERROR. @0 Q/ F7 `0 q, f- p: g
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" h" w# @" j6 [/ M4 d| MCASP_RX_CLKFAIL; N l0 D J) c! y
| MCASP_RX_SYNCERROR 8 m# U8 K3 b' { ?4 h
| MCASP_RX_OVERRUN);+ h6 } F2 }( e- o' u; ]
} static void I2SDataTxRxActivate(void)* v6 ~: m8 B( s* w
{
: X* h, R/ x m/ |' r) k2 G/* Start the clocks */
0 c0 V9 o7 u; r- G, qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- j8 ~8 `3 j' l1 O+ F2 ?& m
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */3 Q+ }+ ^9 Z3 }% g0 N4 ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 j$ B X$ z& K) d8 `# Z
EDMA3_TRIG_MODE_EVENT);5 c. u: H8 W+ q5 K# y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 j3 L5 {; E/ T6 I- ?0 l7 t7 F; K# C
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */ M+ _* i3 }& v8 ~" A1 I9 D* h
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
0 c/ w7 c* c" _7 tMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
$ W/ I M$ A6 y) a' L* Qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, ?: N# D# L f+ yMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);& {9 V+ e& G7 |2 K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. G$ t6 N( ?5 n& Z}
" ^/ d8 s6 b) ~- C' C4 j6 F$ h请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 G$ {1 [5 d P! Y
|