|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
) s7 ^. v% n; ninput mcasp_ahclkx,! L7 ]! ]+ _ @9 L
input mcasp_aclkx,
) j9 ~' H j: _# s9 Ginput axr0,4 \5 f# o3 W3 a4 r6 E0 o
, P' y1 K# y2 n. Joutput mcasp_afsr,0 i% c) m4 o/ k2 t) h% x+ a( D( R
output mcasp_ahclkr,% s; Z" W& R [2 q- U6 P5 a
output mcasp_aclkr,
/ S& J" a. q$ r: p! ?. C0 o, youtput axr1,
" i) f4 U' g# l! \( T assign mcasp_afsr = mcasp_afsx;
% m, x8 }! N2 @1 C9 Y5 R+ t+ c! N2 @assign mcasp_aclkr = mcasp_aclkx;
$ [$ S) G, n) l3 t1 _' u) j4 Aassign mcasp_ahclkr = mcasp_ahclkx;: n. @ f( T* {+ o
assign axr1 = axr0; ' z" H, ?% W, A3 f4 O5 G
/ L( x. k7 u1 d$ O4 _, p5 ^
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) \/ y2 d9 c/ }! O0 ^
static void McASPI2SConfigure(void)
7 X$ v2 r7 Q% t2 z5 r- t. g% A{ L8 z9 @! Y" J/ ]5 k: C8 `
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 q1 }& I" N, ?+ hMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
; R% Z% P5 T8 {9 SMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ ]$ o/ n& k \& Q; z7 q4 q& x
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
. h/ b) C/ u' d7 H, V5 CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 W6 M* f H7 J' Y2 G+ N% M
MCASP_RX_MODE_DMA);/ `6 b$ |% _/ b1 [1 X5 ]* q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: {- y1 l% R- P( H+ A9 IMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' F |3 u( b& J& AMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 |% T% T1 W+ |7 F% j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; G8 g# ~' ]1 p1 y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
( W% r" ]# W% U: SMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */2 @7 h* ~( g3 v2 `
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
1 A* r# Q0 \% Y, UMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 Q: `7 {) b- bMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( l4 |4 s! m& t& G5 o. d' u, u
0x00, 0xFF); /* configure the clock for transmitter */
1 X# a* a/ }2 \4 X; iMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; @, ]) V- v/ A8 q' _- \
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 ~: u" p. V2 C9 [$ QMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ a4 t7 z$ f5 r' L0x00, 0xFF);
) ?2 i6 r1 i' F! |' p
. x- A4 c* o% j9 s9 X3 i( A t. o$ f. J/* Enable synchronization of RX and TX sections */ % X3 M" k$ t( [4 j" V$ \) A1 K
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */! ^ _" T5 }' E" M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, M% C+ m7 h( e, ?: }- Q) B
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*; \3 {" [& L! H) ]
** Set the serializers, Currently only one serializer is set as6 K, y1 U$ z3 q6 l0 [
** transmitter and one serializer as receiver.
7 o- B# C" L. u. p+ c9 }*/9 D& s; b$ |! C& N* ?: \) s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 }5 m9 e5 _7 l
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
+ a* R" @, O* {** Configure the McASP pins
$ c# ^" G- [5 f9 e# _** Input - Frame Sync, Clock and Serializer Rx
' O. w3 L; T5 k: S+ I4 _** Output - Serializer Tx is connected to the input of the codec - j" _3 ~7 G% a; R9 ^
*/
% U; q; x) R1 m1 EMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, U. @$ w4 P5 S. `
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
- \* W0 n: p0 X; a1 @9 h JMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& @- T" G4 n) ?' w- L" k2 Y| MCASP_PIN_ACLKX7 M* ?8 z* S- B7 r0 v4 S
| MCASP_PIN_AHCLKX
- S( j9 w [' z6 ^' [5 n9 q2 W| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
8 f n6 F1 }9 KMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . t- ~9 V! D: z B4 Q
| MCASP_TX_CLKFAIL " k% c: s, F1 O" t$ x3 f. u# ]
| MCASP_TX_SYNCERROR
/ N: }. w+ q ]2 T& w1 }( t| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 y2 O4 D/ R! X$ N% k0 e
| MCASP_RX_CLKFAIL
" n/ @0 x( K- g, i+ p- K0 E( Q| MCASP_RX_SYNCERROR
* Z1 M1 n \1 N% z) _ v$ || MCASP_RX_OVERRUN);+ ~4 D: n, ^- y! @0 |6 s
} static void I2SDataTxRxActivate(void). Z0 j# ]3 j, [ M
{
* }2 Y0 ?5 i: z: @2 Y% S# [" j3 Y/* Start the clocks */
% |- c* ~/ g+ u3 |McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 N: K0 k+ S8 b: S- ]
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( q8 ]7 `1 C# d2 e: M0 l6 e2 G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,* M9 ^* X- m: X1 B
EDMA3_TRIG_MODE_EVENT);
0 x$ T/ t- U' \( e! oEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& {0 d! W. ?8 u O5 HEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */2 ^. @) t6 p2 |% [4 k; |. ]: i2 S
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 o: E4 u# K& r( L7 C- C+ U6 g
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */5 c+ P! L* S4 C5 l; R" s0 U5 b/ a } Y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
3 g# d2 b! ~/ {# k3 N2 S" HMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);, E+ I V: S& T. f
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
0 R! {' D h/ U v- ^2 m* z; U}
G8 l. v" o4 Q+ P4 P" d3 ^$ P请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 1 e: c! K% D. A
|