|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 V4 N( Y) }6 S+ F
input mcasp_ahclkx," S- s$ w7 y( A1 H. g% z
input mcasp_aclkx,/ Y! g! V; d' y
input axr0,( [1 O6 ]$ s4 p4 Q
8 r# m. H- y4 M/ V a; [" c8 {5 K
output mcasp_afsr,2 E: }6 s( {- r9 d: v" A
output mcasp_ahclkr,
+ F, A5 L* D5 {/ w" r! b3 \output mcasp_aclkr,. V. N3 G* Z! F9 h* E) u
output axr1,$ h3 c* G( D0 o5 Z# q
assign mcasp_afsr = mcasp_afsx;. d, K: ~+ C; L: K$ u
assign mcasp_aclkr = mcasp_aclkx;
6 L* T* C, ]( V4 Rassign mcasp_ahclkr = mcasp_ahclkx;' f1 [3 H1 [, H2 \, v$ H
assign axr1 = axr0; 5 {8 Y5 D+ e4 h. S- c" V' R! N2 s
& S4 x& \' Q- ^. B; P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
2 w+ H% O+ J' l1 o/ H) l0 I. @static void McASPI2SConfigure(void)
; F9 L ~! r* H{
6 G( k4 ]+ @6 P- A# `9 vMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 x2 D7 v# Q8 J! [; aMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
, d+ P8 B- {# P1 D5 ~ |McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: W3 n+ @) S/ w D
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
& t1 Z& ?( z |" ?$ D8 \McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 x3 {# ]' d( g3 M2 i4 AMCASP_RX_MODE_DMA);
& C1 \; ^" ]5 ?1 p( eMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 A# b. Z% ^! X5 {, p$ xMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: R) o9 _, n- E+ T% T$ i' lMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( I5 \* p- j# V9 Q* _. x( z9 j: }
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( X4 E% R" V3 R; e, J. JMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) ^$ a: ?' ?1 a5 u0 J7 _$ L
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */9 D9 Z( k+ K7 O2 e
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 [, \. G% D' I; R' H. \
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( b* m: b" |' O- yMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 U5 ^4 B4 b6 {" z
0x00, 0xFF); /* configure the clock for transmitter */2 Y9 R G1 Q7 s+ f1 A3 {
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 y$ z5 x% i0 |: u
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" c0 m' t0 a' ^/ `/ B/ q( z: ~McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" s' @: a7 [) C( O) X0 _0x00, 0xFF);
$ x( v2 j6 ~$ @; l) Q+ ~
- v0 J/ ^* a* _* Y& n2 I5 [0 s2 S2 j* R+ S/* Enable synchronization of RX and TX sections */ 2 K4 o# J2 m# }7 ~5 V( G# G& X7 l
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */) V: z- A" Y4 N! w" D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ r, o% {: \# ~! A
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. D7 Y) _6 z/ ]0 G. a) X
** Set the serializers, Currently only one serializer is set as
% B: ~2 _7 e! K: Q8 ^** transmitter and one serializer as receiver., x, i+ h3 W' E- B% v, q w( q
*/ F7 h9 R" a1 V) ?: r, i2 ^2 g
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% _! ]/ w( K+ H, P9 d% RMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
6 M1 s. G, H4 v6 B6 @- c0 W** Configure the McASP pins
5 A7 a5 V8 j W2 L3 b( G; P** Input - Frame Sync, Clock and Serializer Rx
+ E1 y3 | T9 t* ]** Output - Serializer Tx is connected to the input of the codec 9 k$ x% m2 p# ~% M8 l8 ~
*/
x+ j5 q1 }4 h1 GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ w" y) y- @% \" Q- `3 fMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ ?. f$ T9 A8 A9 N% o# ]/ S# B
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 H: e( x; a# w| MCASP_PIN_ACLKX
0 Y5 Q- Z' A0 X9 @/ |$ L| MCASP_PIN_AHCLKX
3 [: T$ `$ g% x' u& e3 x4 | ^| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- P/ D7 z+ x: v. m* c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" C) I8 n! a- W4 a- P| MCASP_TX_CLKFAIL
2 w% M. p1 v' Z9 Q# ~$ d) M) A| MCASP_TX_SYNCERROR
% X& u& K4 y3 n, o9 R| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 x. a* r- f/ Z. d P, r8 l, i5 {
| MCASP_RX_CLKFAIL
7 j n. o7 N4 K3 u8 {& x. `8 ~' d| MCASP_RX_SYNCERROR 5 M8 n8 c8 M7 |1 Q' n$ h. K
| MCASP_RX_OVERRUN);
7 Y! _, e& H6 h- w} static void I2SDataTxRxActivate(void)
) j( b* r8 ~$ _9 _{% ~, i1 }1 e6 d, r- b3 i# T" [
/* Start the clocks */" r; V0 s: N& d$ a
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
& p, g3 ^& ?, e' s7 N! w: NMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 x) _2 S5 C5 TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 n" g* ~: f% }/ n, REDMA3_TRIG_MODE_EVENT);
! y/ N+ z" \' ~EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: U4 A+ B9 T) g/ nEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */) O+ C2 ]" r3 }7 A- T5 u# p6 v
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 y2 i$ i) w0 Y$ S$ q5 N1 HMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
: ` P3 Y0 G4 J& `6 X# Wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
$ P+ U7 V- j3 D& T! @7 q: RMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* r: i& n5 ]% W5 UMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
M3 Z P4 |8 d3 W0 L# y+ j7 q}
/ u0 S& I0 `4 H% t) {& X请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 U7 ~* D- r0 M" E6 G |