|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ P# R8 z) t* O# J8 R; s
input mcasp_ahclkx,; X+ s& S( m8 a" L- P
input mcasp_aclkx,
+ W% X/ Q" _9 m2 q3 j/ b5 binput axr0,
( K6 k; A0 m9 _- b
6 A& D( E; t1 E6 ~output mcasp_afsr,+ [/ X# P$ v7 t+ T" T$ ]% l4 b7 E' X
output mcasp_ahclkr,% ?2 W$ z, Q# ~1 i( l" h0 n
output mcasp_aclkr,! L/ l7 x( Z/ o- @9 P! i
output axr1,9 a% F8 Y% y! L, W
assign mcasp_afsr = mcasp_afsx;* {' V0 B n$ E+ j9 g J! m# R
assign mcasp_aclkr = mcasp_aclkx;
. d' L2 {- U ? zassign mcasp_ahclkr = mcasp_ahclkx;& f- }* X) r: [$ ~5 \5 Q# k
assign axr1 = axr0;
9 B! s# U6 c/ B6 v7 |
$ ^& T( }) ^, S3 ]! ]& ^, K f在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : c3 ~+ |4 C q3 C5 D1 J, }0 w
static void McASPI2SConfigure(void)& V4 {# k* N1 H: e/ h+ M
{* T5 U& M' G4 h( }
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) Z e1 K" X3 p" GMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 Q" n6 u `/ `* j6 ]$ }# S( l( I
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 s6 }+ q' E4 D4 }$ iMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
$ g- H, G; T8 v eMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 s. ?* l0 _) G- j7 }* W" G8 OMCASP_RX_MODE_DMA);
; F- i8 R! X: R6 ~! WMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. `7 z9 a* a" @: A; i
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */. c' ^& V- l" I7 M3 [
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 P3 H+ `+ H( h. n; d2 E# DMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 t+ t9 P$ U+ }% h( Y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 e) y8 O. _' i" ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
! u1 E, T7 T& {9 U: eMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 e" Y! ]+ e' T6 ~. e) b7 m b: L
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 ~- ~2 a1 M/ ~, f4 s' RMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 W9 v* W' z9 I& I( ?8 C# k1 E
0x00, 0xFF); /* configure the clock for transmitter */6 N2 _6 @% _9 d& C; T5 X% F* V; e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);1 J2 x2 j) e w5 u7 B
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; t) L0 J7 I* v. k/ B
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 D4 `6 ~3 i/ u0x00, 0xFF);
) L4 b; l8 X+ Y. X9 X4 q
" H: @0 T, Z3 m/ j) A/* Enable synchronization of RX and TX sections */ / v, `5 j$ T; a; d, z ?
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
9 _0 D: {$ Z" p0 y, F" KMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 E: y& b% Y J3 FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*0 J' M" ~. S# A/ s6 C3 h
** Set the serializers, Currently only one serializer is set as
' t8 u0 [ |1 R3 Y1 |** transmitter and one serializer as receiver.
2 [" r& a% v: y) `( o*/
- N. G4 m6 B$ H- w% R8 L* KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. W/ L" u8 ^3 ^ kMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
1 L% t" L& H; L4 e5 q' |5 H1 Z% L** Configure the McASP pins 5 y, `4 U& f( F1 O
** Input - Frame Sync, Clock and Serializer Rx3 L9 y G" e' d& Y3 p/ _4 a; X
** Output - Serializer Tx is connected to the input of the codec " n: g J: R6 O- X+ t) M
*/
/ p4 @3 m" N! L. d. L6 c! k/ ?McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 |: K. m( }& [5 F) n, x
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: d& u) m/ t* t* s. A) |6 ^: }. Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
, ~/ x; T$ S+ ]+ p4 b| MCASP_PIN_ACLKX% f' u2 O' o3 h4 @7 _6 f
| MCASP_PIN_AHCLKX' I7 q' F2 j. o" J/ _7 I, F+ Q& }
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
) V* u+ s5 n4 T) ~3 lMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! g/ B. {4 I" y- a
| MCASP_TX_CLKFAIL ! Y c g! v5 t$ ?
| MCASP_TX_SYNCERROR
" h( U) k* [$ m- d| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 {/ D) Y/ c! y3 m+ ?3 d$ t6 e0 w
| MCASP_RX_CLKFAIL
, M' O1 t; B9 L4 m| MCASP_RX_SYNCERROR
7 i7 w7 V# r% t- _% G| MCASP_RX_OVERRUN);
) Y9 c2 A. E( v} static void I2SDataTxRxActivate(void)
# F2 X, E% q8 X0 }* M+ H{" d0 S# g* A$ ]5 _4 b: a- ^# }
/* Start the clocks */
$ Q3 ]4 x9 E1 k, HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; x u% u1 E+ `, o) a- a$ J
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) G! Y- t1 S- A) ~( oEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) d6 ~# u( y1 B( ~4 D9 k: Y' t
EDMA3_TRIG_MODE_EVENT);& c0 V2 N6 D' U) h2 b" C8 @4 @% ?/ V
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + F0 Y0 ?6 ] `& v* Z+ o8 G6 I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */. l- A0 h5 H& u7 c+ O5 X. A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- a C* S* j, a/ ]7 k8 {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& @1 l+ Q- l( ~
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
7 C& q" U. U7 E% M( gMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);& l7 ?" k) c# B9 S
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);) G( \2 ?2 K9 U9 ]( z% E
}
8 H- i# j6 D. R/ a5 O e* m请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. h4 E: f; J3 V( K
|