|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
) x: f9 K) K" u# n( V) cinput mcasp_ahclkx,7 P% E) c) X2 Z/ I
input mcasp_aclkx,
" t4 M* w. a! x* G- |) X( Iinput axr0,, \5 |5 Q' u9 K, r5 v
' b+ m7 a" ~% w- R4 V* h
output mcasp_afsr,; V1 T0 n$ X% L0 x
output mcasp_ahclkr,. m9 m$ r/ K1 M/ M. [
output mcasp_aclkr,8 }' S1 R" Q7 p# ?9 A
output axr1,0 @9 A$ X3 G0 \4 [) g3 n
assign mcasp_afsr = mcasp_afsx;3 O# w7 _- m# t, f& N
assign mcasp_aclkr = mcasp_aclkx;
* Q+ r6 z: _# l0 H: Kassign mcasp_ahclkr = mcasp_ahclkx;
) S" d7 K7 J2 Hassign axr1 = axr0;
% C! }( W6 h8 G+ j5 ?( V
: O) N* A( O; c# ?0 F在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# \* M. i+ x$ Z! z6 ^; k: g: w3 D* \static void McASPI2SConfigure(void)/ f4 M7 J3 k W
{
2 [# f/ c1 q+ b/ N- u1 sMcASPRxReset(SOC_MCASP_0_CTRL_REGS);, @( `# n8 h& j. Q5 g
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
. l& E$ }" x m( P3 G* c2 dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 r1 g) d4 j) \; [6 O/ v, kMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ e6 ^. u5 G* l1 L
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 D3 _1 @8 ?* R3 n6 k/ ZMCASP_RX_MODE_DMA);1 I; `, b& j) F& r% @( \6 A
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* l0 d9 T* J5 JMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, l" _+ z. s8 A2 ~3 y1 UMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 U" n q9 }8 R5 q- {MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 z0 Y/ o) i5 j! P; u; i0 MMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * P3 y! y1 y& J2 C* ^; E
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */) s+ R) o9 E$ t
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
$ V8 @, Y' L$ z6 RMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); }2 b. O% ^# o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 _, r# ~- _0 \8 X0x00, 0xFF); /* configure the clock for transmitter */& Q7 j9 w) ^ u7 Q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ [! h3 K( o/ H$ _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
* z7 }, g: b$ m3 ]4 L- \3 P% ?McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 T( t: h6 P6 o5 R, S& |$ A6 m
0x00, 0xFF);
2 p# V% T% |5 u9 @ g* a" I+ g5 |9 w: x i5 ~
/* Enable synchronization of RX and TX sections */ 0 H/ p; V, Y l4 q% B. v* F
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
% ~; J- d) w0 X9 XMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ M9 }, @. N) G
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
( b% J, q8 x" z7 E** Set the serializers, Currently only one serializer is set as: V- A1 z4 I, p. a" x
** transmitter and one serializer as receiver.. Z) z$ j; t" G* A
*/% j+ r# g& ?- U' V
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- t/ ^( }' L5 _! s% zMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ S5 L( N& u' I
** Configure the McASP pins
5 h1 B6 S. c4 W7 G6 U** Input - Frame Sync, Clock and Serializer Rx
* c2 H! x% j* o% @0 X; o** Output - Serializer Tx is connected to the input of the codec
9 r4 j$ d! `4 g$ A) T5 M*/# _0 _- @' G$ }& j# b* ^, u1 u, T) |1 W1 s5 v
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) \5 @2 T4 B- R' m+ KMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& M W9 e$ {0 E' W4 b; o ]* }
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! Z* h) W4 x. h1 p9 h9 G| MCASP_PIN_ACLKX3 R* z" u4 [' ^' V% M, |( a- W
| MCASP_PIN_AHCLKX4 C; ]; x7 v2 u: l( N
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
, Q; y* K' ]9 q C. {McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
1 w0 y. t! g3 N' J4 b1 I| MCASP_TX_CLKFAIL - E* Q0 y' R6 H
| MCASP_TX_SYNCERROR
+ E* n2 x+ u$ ?) x1 \| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ) T# H' y, c# l. F' N+ m
| MCASP_RX_CLKFAIL0 w8 s! z% U, T& T+ p( T4 ~
| MCASP_RX_SYNCERROR
) Y8 i4 b8 ]+ l| MCASP_RX_OVERRUN);
6 b! r8 }3 @) I! F; p4 `- v, `} static void I2SDataTxRxActivate(void)
# g/ E& r6 y- s7 L: ^. ^{
& a* S% n3 J; v) v& D/* Start the clocks */
) ^4 O" P* u9 ~7 j0 eMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. k) H5 Y* k- @7 a4 lMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */' i. h* ]0 U) f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 e" z+ B* U; l* b" rEDMA3_TRIG_MODE_EVENT);
! j* k9 `& A' I& m2 ]% {# c' bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 G6 U4 I# f" T( v. iEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ C+ e6 S# @& U. y. J" Y9 ]
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' o( P/ ?: X, F* V$ ?6 ^
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
5 c) D- y5 C/ ~9 W; A% l: Xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */0 X" y. ^: c2 j$ X/ A4 e
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. `* c: B: W! p5 AMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 E. H ^" z. x, y
}
4 L8 ]+ I7 b+ ^5 @% B请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" H4 B ~) c7 p$ d& k( n |