|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
. _' S' u! i3 N$ z+ N6 r: Q! c2 L1 minput mcasp_ahclkx,3 ~' K7 s$ K) B
input mcasp_aclkx,/ J' [( b. r7 \3 H" p
input axr0,
9 b3 v! V/ I' T6 h; n
7 O0 T5 i+ R" i+ Z/ Q! x" {2 K# _output mcasp_afsr,( y1 } g) ]$ u& W8 U5 e _, }
output mcasp_ahclkr,
9 c* q% `( H5 I+ ]3 P! }output mcasp_aclkr,( w6 D! v F8 h, I9 V
output axr1,
5 |5 I V( ~) v9 a assign mcasp_afsr = mcasp_afsx;9 [, F4 w: `5 \( ?1 T$ y
assign mcasp_aclkr = mcasp_aclkx;
, W+ T6 e- k* p5 t. u! V& |- @4 @& Bassign mcasp_ahclkr = mcasp_ahclkx;
$ D* B% z I I+ iassign axr1 = axr0; - x# l1 E( J* T' d6 S2 k3 f
3 p& ^8 h9 B! j; h
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 l/ A' U! m1 r8 h$ W
static void McASPI2SConfigure(void)& J3 x" B i! l) }& N- v
{& [1 w, M: {+ U( z0 d
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- @% }: O' ]. |: V# [! aMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 l5 K! a, [2 S4 h, a- HMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 V# }; L- j1 n* `0 G
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; I% M9 _1 m6 R# @& N3 x4 h4 fMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 o8 U( D& z, l& `! XMCASP_RX_MODE_DMA);; |* ~% t. N/ o
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ c# c0 ]; H2 E# {& d3 ]4 BMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */. f5 w+ T; ~' o2 F- S0 T
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 Y1 r* Q2 j& o0 ~1 ]$ R+ RMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: w! q* `& {( G( G6 c5 r/ f8 {
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / Z' w# T1 a6 t4 B
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ {3 ?8 D9 Q, ?+ }) T
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 P5 {' \& O- H4 d) aMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 v8 v" J2 I) w7 j
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! A' L0 S$ l% B
0x00, 0xFF); /* configure the clock for transmitter */+ p' M% q# L" P1 h
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% ?/ z, _) q+ l1 N* yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' V, D! f" e- W: U2 x" \/ ^6 l8 r6 _McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, J+ _1 z# _ r Z: K+ u8 \
0x00, 0xFF);) X W8 n$ T' A& w3 n A# E
+ Y/ N1 T& a% l5 E8 Y( Y! r6 _, Z) D
/* Enable synchronization of RX and TX sections */
5 G3 E( Z3 r# _ D( _, sMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
& P$ u3 }& f& MMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); a/ W! r! g& j; F' _% G a
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*0 @+ o' S& N% }
** Set the serializers, Currently only one serializer is set as5 J; J1 B6 o3 H8 j1 b" l- S9 {" n
** transmitter and one serializer as receiver.
4 M5 f2 S0 Q$ X6 @2 r' C- \3 r2 `+ h*/% Z9 w+ O* c+ A. f' N
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 O5 {$ R! Q+ T. |. g0 H1 c+ W6 n2 _McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*8 u5 E) U) j* q% I6 w# a
** Configure the McASP pins
& V1 t; C: O$ P) @9 [** Input - Frame Sync, Clock and Serializer Rx
7 z$ a9 M- O6 c5 M. A/ n** Output - Serializer Tx is connected to the input of the codec
/ _. d2 t0 ?) G*/
# X- Q; z0 F. R3 Q& eMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);3 S. z0 U: c5 P( Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& @( j+ w3 g5 @4 K4 u. d5 e; J
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 K; h4 e& \& [9 U9 [/ t| MCASP_PIN_ACLKX
. Y. G- O, t0 R; ?| MCASP_PIN_AHCLKX0 u$ G4 F$ S; w, T: E
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
- q$ V' W% _- u/ J; m) V4 ]McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ C& d i% @3 _0 @| MCASP_TX_CLKFAIL , a6 y1 B' f b+ s2 K: f
| MCASP_TX_SYNCERROR$ e+ d1 I* @) Q' r, c) @
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: G: v8 j* X; q# L1 X% H* J| MCASP_RX_CLKFAIL
2 |3 n# J9 s7 B: C/ f. n0 C| MCASP_RX_SYNCERROR / G5 _8 v' T5 X: I
| MCASP_RX_OVERRUN);
; U+ ]# l* C/ _. ^( O7 F} static void I2SDataTxRxActivate(void)* t" f2 }* Q( r! [/ T
{& z( H9 s( P" ?* I
/* Start the clocks */
8 J3 N8 U; h" H1 KMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ R6 }: t9 c- ]+ _, KMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
9 x6 X% e Z2 n+ B! oEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# x8 ~% N' b& ]. \9 ]: l
EDMA3_TRIG_MODE_EVENT);' D; R- n/ _8 V0 Q; m. b3 x0 r* B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / J" h. F6 z0 y8 h, ?4 P. P
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 { N9 x. t2 V+ B: q' xMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) Y3 R$ u/ ^5 @- e! g- jMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& u8 d, k& A9 ~
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 [ J% P' t6 R' d; `McASPRxEnable(SOC_MCASP_0_CTRL_REGS);, Y6 x9 |, i, `# y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 E; ^8 e0 p2 Z( W+ A$ e7 ~}
( c \; C# z0 g$ \, @* q请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! s1 I: e: h, B; N0 `( Y3 c( \* ?+ Y |