|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," }1 n: k- R5 i: ^- A) Z8 x
input mcasp_ahclkx,
$ @. T6 | }4 iinput mcasp_aclkx,
# s1 T( S( l/ s6 Finput axr0,6 X3 n) f+ h6 V2 [
; u9 x3 l, M0 ^5 [output mcasp_afsr,' u4 i& o0 L6 H3 h
output mcasp_ahclkr,
" L: i& l3 P7 T# G. |" Joutput mcasp_aclkr,7 K( p* X' ]7 D4 G1 _
output axr1,
( n' [6 {1 Q# y4 H) P+ N assign mcasp_afsr = mcasp_afsx;) L7 }/ Z9 F: V
assign mcasp_aclkr = mcasp_aclkx;8 b3 @- }* B, M3 X3 P' Q6 v$ i
assign mcasp_ahclkr = mcasp_ahclkx;' B3 Y4 ~5 o& E0 ?
assign axr1 = axr0; 7 c0 }9 _! b$ s3 A x
# z! M- @# ?2 \1 i9 M0 N( C. z在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : |" O" o% t0 ?& `3 @! u
static void McASPI2SConfigure(void)
' h k% {! o+ j8 v4 F# v. T" n{
* j( W) U1 b$ A7 E. D$ J5 lMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; z/ V) |! n& Q; l$ B
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
?0 X* B, B/ M+ b6 aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- I& j" h) ]2 { k5 I$ n( P9 ?6 X
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; l n, L3 Y+ tMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- b8 G1 B( s0 F+ j9 @MCASP_RX_MODE_DMA);- P3 d8 ]: x5 j9 e# H
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ B7 p4 Y) W E( U; a; ]0 nMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 }' s- O2 d+ g/ k" |( R- i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
( X; _& e) P$ e; P TMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 S/ H& p$ G2 R: P }4 m( p, `
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& v1 W! d: R2 d% nMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, n% Q" F0 u- I& _
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: x. M$ X/ H9 V, f& H: D
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " N t9 o3 o4 l$ B- b3 Q8 }
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: V8 ?5 z7 `( H0 P0x00, 0xFF); /* configure the clock for transmitter */5 ?6 _# T9 r) ~5 j5 O% N3 T% n
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 T. @% g" O9 n6 g( g
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( G" @8 Q3 p" h/ M
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
2 L" T+ e5 k. O+ K) [% {% d0x00, 0xFF);
0 j, N! g$ V4 {+ @ Y. t6 ?; G
# D3 D5 ^, Y2 v4 Y6 Y2 z* ?4 F0 i/* Enable synchronization of RX and TX sections */
0 B1 f" K/ s( J! j. OMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */2 c6 V9 _5 G9 [) v5 |' i
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; ]+ g3 x, l0 G& P! NMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
) D4 b5 b6 @8 z. M- H f6 ~; K** Set the serializers, Currently only one serializer is set as
) S: r4 F# R, x3 M5 g9 l** transmitter and one serializer as receiver.$ c2 i: r3 Q b: \/ ^) c: H$ n
*/
" W+ ^0 m: L& a5 q8 SMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 y- Z1 l3 `' J2 t& U3 W7 Z: [6 i- mMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
: C* {- T1 K+ R& M& h** Configure the McASP pins 6 ?5 l; U& k4 f) ~5 }( d' C5 c
** Input - Frame Sync, Clock and Serializer Rx
9 F& P$ _7 \+ |% j1 ?** Output - Serializer Tx is connected to the input of the codec
+ U7 g: J' p, L8 }" S5 y$ v% p*/
. w, }& G) s; K1 j# b3 SMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" ~9 _; G, M9 D. y/ d2 g" @
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
7 T$ @ n- v& {McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX0 Z8 N7 r) `* T
| MCASP_PIN_ACLKX! ]! R3 J8 u C( d1 V( {
| MCASP_PIN_AHCLKX
' K* P2 q" J2 k || MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# V4 [. F# ?; e; z, x MMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . b) y' p( [4 _/ D4 U2 ^! ]
| MCASP_TX_CLKFAIL . E7 H$ n8 W. S8 Z
| MCASP_TX_SYNCERROR3 q' m; G6 C2 j; H
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ) F+ u6 q1 B9 _' G: ]$ V) J& c. _+ b
| MCASP_RX_CLKFAIL
! l% N9 ?1 z# b1 J8 N C9 o; u; S7 M| MCASP_RX_SYNCERROR
- i! Y- `) j" ?4 F| MCASP_RX_OVERRUN);2 x; _- i+ C6 u% o& d( z8 U2 W( R
} static void I2SDataTxRxActivate(void)
7 H B8 {: L2 h! v1 O8 ^/ ^& Y{ k/ ]: ~7 e( o) k: i
/* Start the clocks */# [7 z+ k* X8 [4 h; J6 Q8 P
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ h) L1 m" E7 ?' I, j
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */. C& ?" c* G C4 T! W2 J
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: Q- b+ g; X% k3 M2 a% TEDMA3_TRIG_MODE_EVENT);$ C, d; k7 T: Q9 u' X" `* b# x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# Y. h/ z9 V j# OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers *// Y8 p* s' u; Y4 Y& l8 H
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- i2 M5 L6 X% \* H: r' y: ^: s) CMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
9 }9 ~6 D6 ]- }' }* y6 y0 D( Twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */+ H9 ?2 z3 i# Q$ S5 @ @9 u
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 ?" `1 V0 t7 D5 L1 [, h$ ?' fMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 }+ L4 i# A3 s0 g! X2 c0 r
} & _) v, p* C( a$ ?- [7 i6 O
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ! w2 \0 q3 U# \# Y
|