|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,7 K3 K( v2 H: N2 i3 Z5 q" x
input mcasp_ahclkx,
5 u& e% v/ h4 }input mcasp_aclkx,
$ f% B5 V7 k& R; C: tinput axr0,6 ], w, n7 T& ^' a! _0 i
& ?6 [" b4 q5 ^. l% I4 o: E9 z) K' |
output mcasp_afsr,. s; g: x/ H, s' V& G& W9 d
output mcasp_ahclkr,
" ]! g0 G9 ~. s( T& P& A6 g toutput mcasp_aclkr,2 k) |- d/ q4 e7 g1 k
output axr1,) w$ l6 {" I5 k% ^6 j
assign mcasp_afsr = mcasp_afsx;
) {; H; ]* S6 h9 Oassign mcasp_aclkr = mcasp_aclkx;2 Y h3 d7 H5 A# I
assign mcasp_ahclkr = mcasp_ahclkx;
: S: E# H/ V: z3 f, |0 P) R5 Z3 fassign axr1 = axr0; / m$ {/ }4 j1 x- W/ f+ {
) r& J5 A- b( \8 `5 `" \1 h
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
( _5 ?8 ?9 w. c4 H2 Fstatic void McASPI2SConfigure(void); I) P8 l( I5 {
{
/ n8 i% y8 D1 Z' V4 n( ^, VMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 Q) A/ m% L, R7 w! i+ GMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
G- U) q! f0 j( }1 O/ B3 _: zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* P7 x |. r! H/ `& X7 N
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ u$ d; q2 v0 x+ ~
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% n+ D$ ^! I; A) Z |% q3 W' AMCASP_RX_MODE_DMA);
1 f7 b6 u# E" F% S' L6 vMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 y0 x) U f s
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 a, q3 v, p b& R( e3 W
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; _$ P4 Z9 Z3 HMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! L5 Z6 m# s. }5 a b6 {- Z: l
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! L2 P4 i, q' C- i/ Z) sMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
0 `0 r, ]- x7 l- r3 q- W. C! LMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 \& ~2 ^* L2 y/ C
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* h! F% S9 g" e, ^McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ t: G& t2 B" ?: T! W2 W
0x00, 0xFF); /* configure the clock for transmitter */
4 o) L/ K) ~8 @# u( PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
" C- b- v- F* tMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 R8 f6 |7 o: V- L( A* E. V3 }7 a
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& g( W% u' v/ q/ i; I* a1 E _
0x00, 0xFF);
" _, w% `$ P1 o$ `4 D6 X$ g% U( ?) Q% k+ Z7 X; x7 ]2 o
/* Enable synchronization of RX and TX sections */ U; X: H, m# ?; b5 b
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */% l5 I8 b9 r( X& d! k
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) |( \, n9 [8 JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
& z4 A( x" ]; y** Set the serializers, Currently only one serializer is set as
4 S8 i9 i: n3 H' I' h q2 p/ O** transmitter and one serializer as receiver.
0 H) q& G3 R" s*/1 [ D" B# S& q& m! ?5 a* c6 I+ S
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ T9 T7 a# W# Q/ @$ WMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*8 R5 |7 }6 `& s5 i' E! y! s
** Configure the McASP pins
- X! j; V% j9 M. Q \** Input - Frame Sync, Clock and Serializer Rx
; V7 E! v2 u% m4 Q4 R7 x Y** Output - Serializer Tx is connected to the input of the codec
8 o- P6 H, \' J# v# o*/
& Z4 k. j' D% K+ L" B( q. gMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 S5 y, j8 L E5 |McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 p9 N! M5 b G- p5 y5 n4 @
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" z P2 l1 O0 x5 O" O7 r0 Z: ]
| MCASP_PIN_ACLKX! y5 l+ X0 K1 Q" }. t
| MCASP_PIN_AHCLKX/ k1 r. K3 S7 ? p9 C0 j
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' k" X; `5 K: M2 J: ~9 `/ ^
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 z0 P( R, a! {8 c
| MCASP_TX_CLKFAIL
! b* T8 H" A L+ w+ A* c- L| MCASP_TX_SYNCERROR0 m- p; Y: ]; x" B( n
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR + N& e8 i, t3 t" H( u, B t6 Y
| MCASP_RX_CLKFAIL" [+ c. c8 {- y* U& n: C
| MCASP_RX_SYNCERROR 0 s: s0 P" x0 ?: f
| MCASP_RX_OVERRUN);
6 R) ^% @& Q+ z. Q) D7 o} static void I2SDataTxRxActivate(void)
6 N$ p5 {9 u5 B{! N6 V; X/ R1 L4 x+ K3 B+ F* {
/* Start the clocks */# {6 g5 p3 k0 H5 @
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);! b( K9 n- j/ j- m9 x3 a
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */. F! A4 j1 f* m% B) z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& @9 |% ^/ G y! X/ cEDMA3_TRIG_MODE_EVENT);
2 ]1 t/ Z5 Z% H0 X+ O7 HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ u) v9 v4 M* F) K3 P$ Q) uEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */2 R. s; N% y% T t2 w Q
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 K' X% D! K) X; e! s1 WMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 m% v6 y# B% P3 W* I! Q6 \/ P4 A
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */2 ^- h3 Q5 S* T8 g
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ y. L& f* d# |7 H* D) t; G
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
0 O7 O, L0 F, d# D+ m6 ~# r} 9 z8 ^; y# g% q F0 @) y( {& H# V
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . A9 i, f( S- a% r- ?
|