|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 W$ e/ ]/ P1 B& H9 \1 {input mcasp_ahclkx,
3 N# C* s2 ~* ^* A7 O3 s, uinput mcasp_aclkx,
8 U- C9 l8 g# Q- y' Kinput axr0,7 Q; h: O7 i8 S, s* E
7 t6 s7 [1 s. L/ {, M
output mcasp_afsr,
' E; n4 d" Q) |output mcasp_ahclkr,, v2 `9 V; V3 O( M) V5 S
output mcasp_aclkr,( e5 Y7 x" _8 q. S$ j T
output axr1,
# ^9 r' w" `: x assign mcasp_afsr = mcasp_afsx;2 J+ X! e) `7 N1 `0 Y( w: v
assign mcasp_aclkr = mcasp_aclkx;8 W' L- Z9 G/ K k9 d
assign mcasp_ahclkr = mcasp_ahclkx;( z8 j3 e& _6 o! t( ]
assign axr1 = axr0; o" _( F% w$ ~3 A! E7 p3 H
9 j$ E; Z+ l: A# q0 S* u! C: R8 I在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
1 E5 _+ G# r6 z- f9 }9 H" Astatic void McASPI2SConfigure(void)
# y' e8 k8 }' F! o: ~, Q{2 g& Q2 Z6 f1 I6 S
McASPRxReset(SOC_MCASP_0_CTRL_REGS);, }: l" y1 v* @7 G& C
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( p$ J" n: b: L2 ZMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! T9 ^4 U! ^1 q1 D! }
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
5 v4 j# C7 b- s2 _: V. Q( u, j" N' WMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! T& Y( z& i1 |8 m5 }
MCASP_RX_MODE_DMA);% ?6 E. F# ~5 b# i N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% y9 H0 e/ b2 o1 h7 G
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* t% ^$ ~! s* m! T5 y `; Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 k1 P4 E6 W" a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: g5 u5 Z" Z9 O( x/ v' C8 p) gMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 t! p6 Y# H, Q$ ?$ a3 NMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ [$ ?. Y' u4 }# ]( M% o3 hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) t9 z- }2 |; Y0 u% |! G9 y4 ?
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 1 G9 f/ p6 E% t! r( W% f6 `/ a& b* N
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,3 d8 P$ Z2 k; z. K( N' m
0x00, 0xFF); /* configure the clock for transmitter */' D* ^3 |2 \! r. e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, H; N& C! w6 G" a% bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; d+ v/ ^! \6 e5 V; ?: r) Q9 H
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& P. A6 {+ @2 x8 C5 K4 b, o
0x00, 0xFF);4 e% R& a* O0 i; l; N0 Z& E
2 F) X, C" ^& R }& i
/* Enable synchronization of RX and TX sections */ : u9 T6 U" e$ \ s/ E" e
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */7 s0 q) H* s) ]! z& P
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# l! B" W& q, P B7 g g4 V
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*- _- ^, \7 W0 p' V0 P
** Set the serializers, Currently only one serializer is set as3 i& G+ w: I# l+ }* _# }( k* h
** transmitter and one serializer as receiver.& M7 X% {. X' ^/ B# a$ V; O/ }, C. R
*// g2 V: _7 e' n& d1 R9 Z& m
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& Q# r/ f# E6 m1 X
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*! o5 i% g2 S# Z7 z8 I
** Configure the McASP pins 6 d2 J& S% }& H" H# A; m; G4 ^
** Input - Frame Sync, Clock and Serializer Rx* i0 c9 l3 o. }* i; o
** Output - Serializer Tx is connected to the input of the codec : {2 F/ h7 {% @% c/ \/ w$ `
*/. p' d) I5 C1 Y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 ~' l8 j% F+ ?( r% K. L
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
# M% v2 r6 c7 R- h3 S" P6 SMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 n) a. I- O; q' C3 p+ b4 I| MCASP_PIN_ACLKX Y$ P+ n" u7 S) R; [* W7 J) M
| MCASP_PIN_AHCLKX5 P# b/ G* k3 ?
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
/ E" n. N1 b6 E* u+ |1 U$ C( _0 gMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ( r9 |( K5 F$ D7 I( O
| MCASP_TX_CLKFAIL ! z6 ~- {! J0 k) G( H. e
| MCASP_TX_SYNCERROR
- d: m3 [% q8 C1 m& o; J: k; p| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & @& t- V* z8 | ]
| MCASP_RX_CLKFAIL) ?0 ~, p* Q6 ~; p& `
| MCASP_RX_SYNCERROR I6 t5 r9 p# y& J9 d9 U# S2 V- }
| MCASP_RX_OVERRUN);
. [/ D& S" N, |0 Q8 x* Y6 b} static void I2SDataTxRxActivate(void)1 R z/ y* k6 p
{
0 [7 ~) e% Z3 ~1 [: p/ ]/* Start the clocks */
9 h% G2 J0 C t* I/ d$ h' wMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 b0 V& i+ F* p* Y/ k. q" G
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) d- L, H8 u8 E& z' t. NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; W% e6 l1 U) `) d1 e& c2 FEDMA3_TRIG_MODE_EVENT);2 @2 \6 |2 c9 C9 @+ Q s+ U0 j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 f6 ^+ m) B" [! B
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
' r( U- z' u& `2 C6 P% G9 e( a, z' p" eMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* ]' P3 @! f# z+ t! P# yMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
8 X: J! U9 [/ m2 t S8 gwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
" h+ ^5 E7 e u8 ]& NMcASPRxEnable(SOC_MCASP_0_CTRL_REGS); q( x1 w8 Z/ b" l! \
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, t9 g" h0 Y, i k5 d4 V' l2 @* A} & v: _) [5 N# P( m2 h. [+ Q8 O
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , L$ V, t7 P8 r: R8 j6 l+ v8 R& |
|