|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
; w2 t- g, L/ K+ E6 f! _; rinput mcasp_ahclkx,( E" z( k& T1 Y' B; K
input mcasp_aclkx,0 W7 U: o' l- ?4 S6 V! C
input axr0,
+ ]6 @* a" G' g$ H. ~! E' J, T e
output mcasp_afsr,
0 Z* d; i: E# H' D- U4 D3 houtput mcasp_ahclkr,! _3 N$ P5 }/ ~( O! W/ Q
output mcasp_aclkr,
) b" g# K) m$ H( ^4 i- ]output axr1,' m2 e' [$ _) y6 ~ p' {; g
assign mcasp_afsr = mcasp_afsx;* ?9 }' H- S. ^0 f* m1 s, N3 }
assign mcasp_aclkr = mcasp_aclkx;
$ W& @, @! G8 H( U1 _5 ^! ?4 c) {assign mcasp_ahclkr = mcasp_ahclkx;
0 I0 {- E! M q! iassign axr1 = axr0; ! a3 a: ^+ b* }7 r& c$ O" w
, m- ^$ s9 a' z1 v7 _- d- i% d在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
7 q# d1 M R }static void McASPI2SConfigure(void)
2 W, j/ e0 b8 D* j9 x. r: F{: @$ h/ v r: z3 r
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 A; o! w0 a: L$ ]" ?9 F) O9 qMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
9 I# V; P7 j o) R& nMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 B. h) x+ ?) U4 z6 ?/ G
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
$ t& L2 _1 D6 w7 N+ y. NMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 R4 L& b" Z+ _$ oMCASP_RX_MODE_DMA);; z8 b+ ~. M8 H: `
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. C, b2 e1 x* L% x
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */" g$ }% W' N) d: {
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , @/ k2 S3 M4 ~& V; G
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); D$ H2 p% i7 t4 v- R
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, p0 ^4 y3 }. V$ A- ~3 vMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */7 Q3 f' o1 B5 {, e5 b
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);2 H2 v7 Z3 ^1 E# j* _* b
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ `( v/ z7 C8 u4 k1 r* O& ]! b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ S9 L+ z4 Q$ m7 I5 s0x00, 0xFF); /* configure the clock for transmitter */
u4 o2 l: b4 z7 ?* E% T7 }McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ P x- O9 y5 a2 T; m2 w! w
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / u9 |8 b" ?: q+ O8 H5 k; ~
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
7 P# |- }2 }5 ^/ f' z* e( q2 e8 X0 i0x00, 0xFF);
3 B# h$ o6 J* {; P5 h( h+ ^; P4 l- C/ ^
/* Enable synchronization of RX and TX sections */ ) S& M" S' U5 |
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ L- t* A& K6 X
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 g s* K7 q8 K7 c: r( lMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*/ l8 }0 s# o- ^4 p9 B! r/ s
** Set the serializers, Currently only one serializer is set as, D+ I/ q* n& G8 | w
** transmitter and one serializer as receiver.! i9 v% h, Q% Q5 ~/ t G7 n: F2 [! T
*/: u) G, V* D# r, w+ b. p5 n
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' m; |+ K1 [" I J. W$ o1 N$ ]) mMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
8 i+ I- O2 I6 g" B** Configure the McASP pins " ~* V s, h# r' l1 v1 ~3 g
** Input - Frame Sync, Clock and Serializer Rx
1 m4 X- s! z! ~1 U3 r) I2 N5 f- a** Output - Serializer Tx is connected to the input of the codec " a ~: B7 M9 w9 C/ G' d% F; W
*/. ?3 x e/ V- ~ Q
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 K+ M6 u: v( w1 hMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! \, x. e5 |/ F+ U( p0 l {McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX G x$ J" q1 @6 G5 C
| MCASP_PIN_ACLKX
4 P5 d: S/ m( E; u; \| MCASP_PIN_AHCLKX4 ^# M8 t4 w6 ]6 `$ p* |6 i
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */) ?; x# U( A$ G" A P* n
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR - Y$ p8 h8 d( m U, {" i
| MCASP_TX_CLKFAIL - A3 A% `4 ~, C9 _
| MCASP_TX_SYNCERROR% [6 F" I' ?; `4 w2 q- G9 s
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 K7 M' \3 X6 I/ v5 ^
| MCASP_RX_CLKFAIL
" w- d8 X q1 z2 J| MCASP_RX_SYNCERROR
u# S8 O' A+ U| MCASP_RX_OVERRUN);4 k. h* j$ @& {. K/ t3 H% f
} static void I2SDataTxRxActivate(void) j8 G: c. `' m+ O; H* w
{/ y, d i6 V9 U# T+ f6 p
/* Start the clocks */
! ?4 W8 d$ C, g. m2 fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
( D* q) \! L: Z. g( _, r8 r9 O& ?McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 k5 ~* d1 G. v5 j& ~
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 p: ^7 O( Z2 k: {6 eEDMA3_TRIG_MODE_EVENT);
* a$ S2 Y0 E1 {' zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: }0 W% a/ Y8 Q! f1 _EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */4 J2 x* V- R% d8 h7 z
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ L; ?7 E1 u6 O4 KMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */( _4 i! K% X( I9 x# t4 _' x; b+ j
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" b/ X( D9 U4 Q1 f
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' _/ } c$ c: y) ^$ V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' G: q1 R3 a$ Y1 I) O% E}
$ q' q/ y+ ~! v请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- r- `, ?6 d' c" x |