|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,2 ~/ X/ g# E* b; B1 p" f2 t. I4 y
input mcasp_ahclkx,
1 ? k: j3 m( z% b; ?2 M$ Linput mcasp_aclkx,
) Q4 c* ?* x @( {input axr0,) C, t8 I: d4 a5 ?1 V' [9 `
2 q2 ^1 S# c9 |1 V$ V
output mcasp_afsr,: p+ T* K+ @- y; Y
output mcasp_ahclkr,
" {8 f; v! U1 y& J- D6 s7 Xoutput mcasp_aclkr,$ G$ W( ?# V1 c5 c" N
output axr1,
) f8 n: L: u. A( V' O3 a4 A assign mcasp_afsr = mcasp_afsx;' c* S6 |# M# {" I+ y2 e
assign mcasp_aclkr = mcasp_aclkx;
# I$ ~# Z7 Z! v/ ]4 t, |assign mcasp_ahclkr = mcasp_ahclkx;
( n, [( k8 V* x- _& T# Dassign axr1 = axr0; ' v4 {* @6 a7 f! h4 ~# h/ E( _, f
* N4 w1 e* D X5 v5 k) a. h8 j+ _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & c8 }% o) p! A4 Z
static void McASPI2SConfigure(void)
6 t4 e9 \: B0 o: F' E0 \{
7 t9 N* M; m" O# R# GMcASPRxReset(SOC_MCASP_0_CTRL_REGS);4 h! y. R# y4 a& w @
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */4 U2 o; C2 Z. v" G0 @
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 i% E k2 C" _! v6 l, ?/ A
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: @, S4 z2 k3 S. Y2 W' y9 j* z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; n" I! `- G/ @5 Y5 _% R
MCASP_RX_MODE_DMA);
$ k6 Y( s! G) A2 f, ?McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 r5 t$ j/ x$ jMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */; c/ p F- [8 }/ b: [" H( v4 |
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" c! k% A- ?2 [& ?' G2 ~MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' S" }0 o) @; L1 W. B- U# R- _) U8 vMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 N: U$ E( f* NMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
8 A9 k! B! J' v' }4 {6 aMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: b/ S, c) n2 {1 _+ v9 V
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 K# |- U7 w O* n! I
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ z$ E j6 ~' g4 t2 y0x00, 0xFF); /* configure the clock for transmitter */1 b2 y2 V; ?0 q+ y% d( t. b& E d
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" }% C. l' y7 q/ b6 @
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, d& u# P. W3 S: y5 I; Z& NMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 B. b, h; a( i- x/ L5 {0x00, 0xFF);
: M9 P( {5 A5 H! b" \- p& s& `0 S( h. _8 N
/* Enable synchronization of RX and TX sections */ ' e0 U- A5 H. j7 S; l* T9 ? r9 K
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */. a- F8 R$ {0 B0 f
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: H( g5 f1 Z) Z8 O, LMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
: }* T7 I5 J$ {0 m5 ]** Set the serializers, Currently only one serializer is set as
7 t! b& i0 S3 H+ Z& ~/ K* h2 A** transmitter and one serializer as receiver. h* x- I. z9 c( f: o! A( Q" L" @3 c7 R
*/
9 U: X2 E) g, A1 J$ y# LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 Q. @' I! |8 W! I2 GMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# B: s3 J2 F! F** Configure the McASP pins
0 j( E$ U) ]0 n- W7 @* m( a" E** Input - Frame Sync, Clock and Serializer Rx/ y, S/ R; I) H2 U
** Output - Serializer Tx is connected to the input of the codec 5 G6 G1 _1 q# g1 N" L8 _' w
*/9 r6 D! e% l. b
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, m U8 g' G: ~0 h$ E2 x2 E5 R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 X( `! f. o5 q& G2 X) a* d
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 o$ R" s/ G9 X+ h| MCASP_PIN_ACLKX! T* ~* E f' r
| MCASP_PIN_AHCLKX
# D& K. y7 \" K2 ~0 Y$ h0 l| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
; H3 N! E m! { ~McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. v/ w8 b6 j* L5 Z# S) a2 S| MCASP_TX_CLKFAIL 7 L8 j! E# s: {! ~0 l4 u0 @
| MCASP_TX_SYNCERROR8 `2 v; z9 L4 Z$ v5 g
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * ]& }; R7 p* i) J7 a: h
| MCASP_RX_CLKFAIL
# e) E% s1 p* C1 V. i* F# u| MCASP_RX_SYNCERROR 1 v" ]$ h9 m5 p2 V
| MCASP_RX_OVERRUN); m o( L- k8 L5 n4 L
} static void I2SDataTxRxActivate(void)
- R7 [+ G5 M0 d. d1 Y{: h# j+ y a! d: {
/* Start the clocks */4 X$ o; N7 s5 o& O/ e8 m
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; m7 |; x$ I+ m: j
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
2 v6 Y* n: t) H& k7 @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ g1 Q- Z3 `4 D5 n3 u
EDMA3_TRIG_MODE_EVENT);3 ~; S/ |& y n, x+ l# f% W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 k' i5 U) t% V$ s* j" m {# q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */, B( x+ y$ n( K' u8 e6 i1 {9 u
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 R2 h3 y, J+ R4 u6 [; G, B) Z7 c
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
1 x- ^: \% E" b8 M( Kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */4 u+ v$ n8 ]) c. W
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 W$ u/ I1 n% w- ~0 [McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, x3 G8 j5 h$ Z6 R}
. K* `6 C# T6 @( E2 Q, T请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& p9 x, p& D4 }" Y0 H2 v |