|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,/ Z* r5 b& ~" l- C9 d# K8 N
input mcasp_ahclkx,
* S2 h! i& U+ Q& G: K- Winput mcasp_aclkx,! E$ y4 u# X5 x7 X
input axr0,; x: t7 y! E5 f* }9 M
$ Y* k+ R. t5 p9 d" E3 Youtput mcasp_afsr,+ H C. u5 M6 e/ I$ B' v
output mcasp_ahclkr,9 n {2 P/ n. c% B
output mcasp_aclkr,
4 m# Z- [2 m0 [ z0 ]- [4 i$ C/ @output axr1," a( R. z& C; O. j4 q% a" L( g }
assign mcasp_afsr = mcasp_afsx;% j0 i8 m2 V/ y, x' e
assign mcasp_aclkr = mcasp_aclkx;1 P* a) m+ c# _; p0 Y& X: w
assign mcasp_ahclkr = mcasp_ahclkx;7 ]/ t& {9 Z) }, J
assign axr1 = axr0;
( T5 c2 l, u* F8 M" ]# Q
( K# b( N: y+ a: H在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 B; e( h( X2 c; e vstatic void McASPI2SConfigure(void)" d* T" }& t! h0 L9 |& p5 I
{) l) j8 \5 V1 J! j
McASPRxReset(SOC_MCASP_0_CTRL_REGS);1 m1 k9 h8 l, {2 H2 Z
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) n1 \; P2 b1 \! wMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; R+ F) d8 X/ u4 u# i
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- ?" x9 S) s$ D0 ^0 f
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 s7 m& p0 a3 \8 u' @. W9 {( QMCASP_RX_MODE_DMA);9 t+ _. }1 }% ^4 m: C
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ j& J( b, O. L/ [MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ T) g3 k l% WMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
# p# @3 [ P7 F8 L, cMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- f- O8 q% r! P3 K
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 q8 T; }, s* z0 A$ } _MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
W# N6 A: k1 O W! w3 `. m0 ZMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
4 S8 n) Y# d) L$ _' R* P0 E' [McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 s8 o* G: g# @# H! F6 H+ v/ b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 _1 |& z0 l3 Z& y5 Y- l
0x00, 0xFF); /* configure the clock for transmitter */
1 \ P- X' ]4 O8 }McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
6 D# c) i5 I [5 q; L$ QMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - @3 S, E/ _& V d. P+ f
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, Y4 d& I- y4 G. h5 s
0x00, 0xFF);
% o$ f; N0 b; W, D% I, ]
9 \5 \! o( B! L* f/* Enable synchronization of RX and TX sections */ ) L" L" }, W- U8 a$ x$ n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* P% L! O8 L ]
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 W/ s* k, h6 x+ ^! NMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*+ S+ `# n& `/ Z O; B; h6 E! y
** Set the serializers, Currently only one serializer is set as$ k$ |# x$ N0 f" O
** transmitter and one serializer as receiver.
' u. E( X! \ @+ a*/1 c; B$ t5 N' {$ k# w. @* |
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# c, _- I1 y* gMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
& N& g- }0 @4 k$ L+ h# z C O** Configure the McASP pins
4 C; [1 H4 u L& B% P* [( u** Input - Frame Sync, Clock and Serializer Rx& I6 h1 S3 S! S! A1 i( p1 B
** Output - Serializer Tx is connected to the input of the codec # L. h$ P. @5 j D4 F
*/) ]- E- [/ r3 C
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: w4 y' }1 C( ^5 a, |% p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, o+ _& A# v" l; y; r. V. z8 i, EMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ p! _- Y, f2 P% Y( j/ R5 C0 {( R
| MCASP_PIN_ACLKX' e9 k/ Y& g$ @
| MCASP_PIN_AHCLKX3 Z8 j& Y5 Z: G
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
Y2 ]) o1 k, KMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ( c# V/ E. z; F; Z& L3 S* [4 ?
| MCASP_TX_CLKFAIL p" H: @% f* \' P& S
| MCASP_TX_SYNCERROR
# m/ c" H9 Y- X4 A7 _| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR v; {& f& x: }0 U) z. N
| MCASP_RX_CLKFAIL, J( d5 J' v. I8 x2 E
| MCASP_RX_SYNCERROR
5 v4 g/ e) b4 G* y& Z| MCASP_RX_OVERRUN);+ Y6 ?$ L8 S3 d; x3 m/ [/ d
} static void I2SDataTxRxActivate(void)
- K; U2 `* D) y- l! t{
1 o/ ~. G4 ~5 W' L- f7 k+ ~& P/* Start the clocks */
& h3 b$ V" ~7 [/ AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# n1 G# O9 {( i! e
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; e& t# b2 a5 g% V7 v, e3 q1 O
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; @% K. f" @# p3 p$ S/ {
EDMA3_TRIG_MODE_EVENT);
/ v: k$ F3 q, T3 {( |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 I( _% l# f! N- ^( S, N1 a e# |( j# YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
+ w% Y; W% {7 D/ K* q# g8 rMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* r) `0 Z; T# B }6 PMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
. R$ m! p: @2 K4 c% m6 t$ P8 Q) jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
q+ v4 u5 [1 B9 @1 g8 o h- X: a7 |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ V2 N. q' k+ D( l5 [4 `5 M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 E7 Y6 }* C7 z* K- n2 _+ [; Y
}
4 r* u/ y6 w8 C请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 C, o2 p( u+ N+ a
|