|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 O, Z; `+ Q) G4 Y: @7 h3 @0 y1 binput mcasp_ahclkx,
) i6 p( S' | y) u7 Q. Qinput mcasp_aclkx,* k8 M, I9 `0 b: r4 P
input axr0,
6 |$ L( b- ~6 K/ D
* l/ U% `% I4 m6 X; Moutput mcasp_afsr,$ f1 N; y# q5 J; ^% a* L
output mcasp_ahclkr,
) }% {% M+ W3 Z. {9 doutput mcasp_aclkr,
2 n) A) X0 L; y% G" voutput axr1,1 z8 D4 l3 G* I/ D7 \2 y
assign mcasp_afsr = mcasp_afsx;
; U5 ?% a- w( T6 V4 q1 passign mcasp_aclkr = mcasp_aclkx;5 P3 ~: X8 I6 g+ d e
assign mcasp_ahclkr = mcasp_ahclkx;2 q" Y3 }5 [& @) c
assign axr1 = axr0;
; }' g! K G2 M0 L: W' `! P
* T5 p: t8 E! f5 K) I7 Y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
0 V+ F. F9 U( u8 X% dstatic void McASPI2SConfigure(void)1 n* e2 r* K+ z/ i
{+ F( l% f6 l* ]& G' \
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
1 ^7 M+ b# x. N3 n# k/ j7 XMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
% Z: g- F% T7 j2 R9 q3 e2 HMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* Z8 d5 w( ?" e4 C# x B
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
9 u* [$ [' U& Z2 HMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' w; Q' g4 l) v: I( G
MCASP_RX_MODE_DMA);
+ N2 @ s9 C' p" SMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ z; x3 H. \' ]& U& ]' r6 E
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% p) S' O8 m* i8 W$ ?McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, : s3 b7 J1 c I6 o
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. y: X0 T, B3 F1 ?/ [
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 I6 ]$ r* s, F3 z. iMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; v. r. Q" h" v* L. D# pMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
4 |$ [5 [" }8 i2 AMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) I$ c% p% G: X4 J) E& n3 E& h
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 {9 [3 [6 p. w) m H1 L
0x00, 0xFF); /* configure the clock for transmitter */ ^" i# X8 Y: D' k
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: u/ x) o$ \; Y- v* z( L$ [! {% k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; H% s; J- } z3 i# k2 y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ F1 W2 k% D, G7 Z5 p) W, @0x00, 0xFF);
1 M2 Z* K! O/ D2 l# M0 ?7 x* v, t
/* Enable synchronization of RX and TX sections */ + q1 p2 t* L- c8 w0 b3 u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ d6 M* w# C) I1 rMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& U) \$ ~6 X' @% _+ I8 G
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*+ g% m0 u' C4 l4 q
** Set the serializers, Currently only one serializer is set as
" U* h) H7 _& v c7 M7 [' k** transmitter and one serializer as receiver.( J' x! `: M' f2 Z1 j& t1 p
*/# t" E8 @* E5 }8 l1 o) I" D
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);4 Y7 A) B! M0 `) ^# d% p
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*0 N5 F0 ^$ o- c4 c
** Configure the McASP pins
0 [) M1 E9 A* W% S** Input - Frame Sync, Clock and Serializer Rx
+ F3 S! G! b9 C$ F/ b& o** Output - Serializer Tx is connected to the input of the codec
! u& q e$ y' ?% m$ N/ K*// j. l0 E1 C9 F: T: m1 R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% |: I7 w* w: q2 ~# m
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& m2 j" Q1 x. v7 o' i, `2 ^
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 a3 I7 ?) f ~6 f5 Y; y
| MCASP_PIN_ACLKX
& r4 g {7 p! K| MCASP_PIN_AHCLKX! R) u; d1 A( j% o* A% r
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 ?+ |: ^/ P; OMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
; f7 n; L7 X$ e: Q2 w| MCASP_TX_CLKFAIL ; w6 s1 Q. R4 D9 U
| MCASP_TX_SYNCERROR2 n4 k) J) Q6 v9 S; J; n) i) d
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 Q' {0 Y" c9 t- y* ^" E* M7 A| MCASP_RX_CLKFAIL) _- P: f) }& n+ ~
| MCASP_RX_SYNCERROR ) j$ }% E% n! y2 w* y
| MCASP_RX_OVERRUN);
3 a W. }2 a! q2 J: P8 [} static void I2SDataTxRxActivate(void)
4 e7 i6 e) l2 s2 I2 M9 i# ^{* l3 T' m3 f% h- Z
/* Start the clocks */
F" ]& \/ r" f2 s& g( ~1 BMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 }' O$ t L% P M$ U4 T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */& A# g# F' k* V
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, h, O! e4 X# o5 \" I+ f' V3 n- T' l
EDMA3_TRIG_MODE_EVENT);, ^+ y8 s% O0 `' B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# u1 B/ R7 K) [2 J5 U' WEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */+ `7 H" T! v+ b3 R U; }. A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 Q3 {+ P) o( p7 W; Q$ PMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# r- \, h6 i/ D5 @& L4 kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */+ v/ z3 \* G. a$ m3 o; B
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( q. h2 T G/ s" ^0 ZMcASPTxEnable(SOC_MCASP_0_CTRL_REGS); }4 |, _8 M# X5 t D# Z/ P
}
+ p/ e' f$ B Q' u& h4 j+ P7 w请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ C0 `) \% P, J# v |