|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 Q4 F7 R( y- R# W/ p+ C: binput mcasp_ahclkx,% F5 }$ H4 T# y0 D6 }& f3 p
input mcasp_aclkx,, v6 O2 A2 u% S9 V/ A, J; t3 N
input axr0,
g6 x$ M% V9 R6 n# n! f- b4 `8 X& X( x' ?' L( l7 z
output mcasp_afsr,
7 H& ^ r( [- j3 xoutput mcasp_ahclkr,
6 S- {& Z) B3 J Coutput mcasp_aclkr,
: p! w4 J+ O9 B' ?( [+ Coutput axr1,, E* G8 t- k* S0 p8 j# G! {( Y
assign mcasp_afsr = mcasp_afsx;
( E Z8 i/ c4 ]$ q% C8 [assign mcasp_aclkr = mcasp_aclkx;
: H5 K% y$ q* `assign mcasp_ahclkr = mcasp_ahclkx;
+ o9 G! C9 j% J( Sassign axr1 = axr0;
# `1 e" ^, L; `8 d0 O" w6 K( a$ F# ^; w
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
2 n( D1 N! V# {) b& }static void McASPI2SConfigure(void)
8 y% ~' \. ^# P{ y2 t% o& Z @9 B' m2 h: i
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 ?+ h! @, P; d( ~5 E- `McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
, |# I7 R& I/ @7 k/ }: g# {- JMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! h; Z- |+ u# j, H. o$ C
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
3 z( B; [& U- O4 J5 r- i3 JMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 w' {% a1 @( b! {- z! u4 m0 s2 tMCASP_RX_MODE_DMA);
6 ?8 o3 W. M4 x( @, iMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 _' O& e. |1 A
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 e% M u3 W- T G, j
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 W( f/ h7 C+ ^: r! }; \1 D& l4 u. U3 D, I
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) C7 V* E/ [, d# j, \( L' p
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* e r5 ]& M9 m1 }MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, F K' c! p+ e% I6 b
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; w) S- y( d1 N! p3 C0 fMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 j" ]+ t1 O# M6 u5 g
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,. X* Q* ]9 \% {
0x00, 0xFF); /* configure the clock for transmitter */
3 h* @+ A! ?1 ]4 ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; J; y$ d- H7 }" D" G$ u4 t) \$ JMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
7 R( M* a8 ~" N) C# \- BMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% P$ ]$ y0 e+ y. G- u3 [4 C& g0x00, 0xFF);
4 o& X" S# {( `) C8 W3 H
* G5 N1 r! J* E7 b9 @8 A. p/* Enable synchronization of RX and TX sections */ . a9 P. I0 Z' O! [
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( B* ]3 m; K' I* _" }. h* Q
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 R& A q( {7 T" C/ ~' ]7 I3 jMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*6 n0 C$ x4 f* }2 i( [# o
** Set the serializers, Currently only one serializer is set as
# W2 N0 y. A, Q3 S6 k6 e** transmitter and one serializer as receiver.
9 r! V/ j, L2 V; ^# t+ H*/( `) @3 ]# O R* ]! Y% V
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: V4 R! r5 O$ R6 o7 [
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*& x" U( D, x1 C' u/ y+ ]
** Configure the McASP pins
- Y9 w( M u. U3 [6 c** Input - Frame Sync, Clock and Serializer Rx
' \0 k, O4 `! q** Output - Serializer Tx is connected to the input of the codec
3 Z# }3 }8 k8 b9 V; _8 `*/' [# N8 `& U4 ]* T( `/ d' }
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 a( o8 ]5 ]1 r
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 F* Z9 j/ i2 C( O9 K4 j) J4 R( |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 [( V. L% {- g2 C0 G
| MCASP_PIN_ACLKX$ C. k) N# o$ s2 {% ] q" ~/ o
| MCASP_PIN_AHCLKX. r N# i1 Z" m+ P4 O
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 G+ X; `! H% M
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
* L. Q8 v% e2 Y+ F2 k0 W6 x; J| MCASP_TX_CLKFAIL 5 e: S9 J8 O9 B8 ?. u5 n' _
| MCASP_TX_SYNCERROR
: r+ ?+ P' Y. O% J& W% Y$ K# I| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % S# D9 W: h% p
| MCASP_RX_CLKFAIL1 j5 l; m, g* x5 k& P6 V# f
| MCASP_RX_SYNCERROR 9 O- S5 p7 S0 n
| MCASP_RX_OVERRUN);9 `& F1 U; x: H6 [- O# Z
} static void I2SDataTxRxActivate(void)
0 i! F6 P8 i; U9 o{5 k# j1 _- W* E; e
/* Start the clocks */# s+ f) M3 ]: A& }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) \. d5 ~8 `6 b4 b- O
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
- r1 E2 T" U- L) n( ^# m- e0 }; GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 ~ D( ~2 z7 o! j* Q8 |4 eEDMA3_TRIG_MODE_EVENT);1 f: Y5 u1 J. h8 Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ @3 i8 @0 p6 X( a% u0 \
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */, ^) h- `) X( }% Q5 J% k' |
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 b0 g h6 E$ Y. [; m" GMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */0 M2 n# ~5 B( m" C' k
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
* s: L4 d5 [1 k6 vMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 Z5 B, ]2 ?3 R7 H J4 B) X- \5 RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) s4 F2 E# g' \) d9 ^7 I; O, \} / x5 X& a) S5 r" T6 j/ b! f
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( `) L/ x( |* ^- f |