|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," x* L$ m& T' ~" n- N0 O4 l
input mcasp_ahclkx,
[) k. r1 e6 b' Y9 i9 Tinput mcasp_aclkx,) p+ I7 m6 n8 ^% @7 k6 u
input axr0,
* @' x' k1 p2 p( p% J% n
" O3 L) a4 H$ B. T! G1 ooutput mcasp_afsr,, u1 e/ W0 s( ~* ~( `" |
output mcasp_ahclkr,
9 l% Z+ j7 J" G0 c. h; |output mcasp_aclkr,9 W$ z# D3 |. j8 ^1 _3 [% L# n; ~( H
output axr1,
' g- E3 q! H s* ^" w$ L* ~ H0 d9 h assign mcasp_afsr = mcasp_afsx;4 H( k. W* W9 I( F
assign mcasp_aclkr = mcasp_aclkx;" q: ~! A8 @/ R, P6 a R6 `
assign mcasp_ahclkr = mcasp_ahclkx;: A- g" `# F1 @& M5 y% B# s
assign axr1 = axr0;
: t1 r+ m! ~; t* ?" X1 ~0 H- ~8 g
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 5 u7 T, |7 n. u( h. B
static void McASPI2SConfigure(void)
8 _& u- B' Q* [{5 v" M7 P# k( g6 ?% F2 w! \
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 e9 ]" F7 `8 l3 mMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */' v9 w1 X2 d/ l
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# N" i+ t! r8 F0 ^ g( s3 P' a @* cMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */3 M: f1 p0 w- D' c5 M
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; h7 k* V3 ^5 X' j
MCASP_RX_MODE_DMA);
* B2 w1 \6 u" e6 d7 I% }McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! ?' {: S \* L2 s3 i* A& \" M* oMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ B' v& F& x2 i* IMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; D6 k4 b# G# X( r
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 s* v7 B, k$ X4 M' U. @: }
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, , w0 m' r0 j0 m/ d
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */6 P+ o" u1 L0 i# X2 K
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. T; X3 d3 c* T. b( y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ! a7 P0 H0 U# r* m
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 H" }5 R) y5 y9 ]& D( E0x00, 0xFF); /* configure the clock for transmitter */* k6 u0 ^9 b' v
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 X' i5 V, q8 T- F4 w/ j! lMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
4 A! U* |$ @, v8 X0 o, `McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 V2 s( V6 r( N) S0x00, 0xFF);
3 D* l% ]9 U" {+ m1 R5 E* A
9 {/ |: T& d- a" c7 M6 T/* Enable synchronization of RX and TX sections */
# K5 @8 H, R5 l# \# C" F" Y! HMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */1 _ G. C, Y9 z6 {2 q
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% \' t" L" u( u3 y) _
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*5 G2 W* W, p6 l) B
** Set the serializers, Currently only one serializer is set as
1 u+ {5 Z7 _& u3 r# v( L** transmitter and one serializer as receiver.
: B- G' T$ c. n" V i2 `*/
' T# \) _4 K w; q \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
* k2 C9 p- W2 J) a3 BMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* |% C8 [# B# R* u** Configure the McASP pins
) y' Y$ s- C+ ], v** Input - Frame Sync, Clock and Serializer Rx
8 w" N; {; s2 K# ]( q! w** Output - Serializer Tx is connected to the input of the codec & S' V6 f( |( ] z/ T8 Z
*/
" u2 E0 Z7 a6 J( C6 ^' DMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) i: _- D9 `7 d" G5 q+ T9 S( {% DMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 t( b: m! S" e" T9 d. o) R
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( \$ ?8 c g- x" y) Y/ U9 B g| MCASP_PIN_ACLKX$ }# }: P8 v, d8 l( L
| MCASP_PIN_AHCLKX9 e1 @# r% z1 R7 V; v! T& b8 h
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
. R" n j% P, K- Z" G( l. GMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 b. i2 H1 u8 v+ @0 W8 u# W( n( @| MCASP_TX_CLKFAIL ?0 O p- Z/ c9 }% N" Z
| MCASP_TX_SYNCERROR* z4 ], J+ `6 b7 r& X+ ~* \9 T
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 O- D N6 i! A' H0 D# P$ n| MCASP_RX_CLKFAIL8 Q2 U& s, F V& d Q; b
| MCASP_RX_SYNCERROR ; ?$ Z! Q8 ^1 \8 L
| MCASP_RX_OVERRUN);1 y4 F5 Y: h9 D' ^
} static void I2SDataTxRxActivate(void)
) K, K5 Y* }$ T# S- Z{
. N, @5 }, K% m% ]& @7 Z# L/* Start the clocks *// h7 f# r1 {3 g1 n
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
9 i5 J2 [& y. |# O, p1 sMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; q3 B/ x3 h# F- [$ V% eEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 b0 m' o, X( s+ g5 g
EDMA3_TRIG_MODE_EVENT);
" l; b) K1 ^9 O4 z6 W8 [2 C( ~, GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " b* g8 K/ @- k: v- y2 U/ a
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& a/ L( W8 b6 ~: LMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 b$ n9 D) ~% F$ d5 HMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) y' w$ G2 s/ S- B: a7 ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */2 h& l/ @/ F' t/ z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
7 G' t- ]9 x8 v6 B nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ F- O$ u% l2 A3 d5 [* z
}
" X3 x3 y2 Q. D) y* w' Z2 ~" x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 [4 ^* H* g' C8 c |