我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
G9 D6 r+ e& N0 H% i! ginput mcasp_ahclkx,
/ S" [% R+ |1 A* d) qinput mcasp_aclkx,
3 S& @9 O+ o+ t/ f9 c5 K# Linput axr0,% Q4 g, q/ z" W0 u* H2 f4 N
$ C! D. [7 M+ j) ?
output mcasp_afsr,; W: X. n" a3 j. W3 d: ~. D
output mcasp_ahclkr,7 h& v+ d5 H3 X: I
output mcasp_aclkr,( ^$ ^. I; I6 V) S6 s! Q
output axr1,4 N2 E/ M6 p2 G3 |( C$ O( {
assign mcasp_afsr = mcasp_afsx;
" L, ^# E1 j; }9 N1 Zassign mcasp_aclkr = mcasp_aclkx;5 ]6 G( l) S# v8 w7 s4 S
assign mcasp_ahclkr = mcasp_ahclkx;
: g7 I; G5 w" j! ~& X+ passign axr1 = axr0; + c6 `' }/ q# m
4 {' @9 f' l0 S& {8 y: _在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 5 L- B6 b, ?; |5 l
static void McASPI2SConfigure(void)( y3 F8 K6 ~8 h; s; G) L9 v7 O
{( S% B8 y$ C4 |4 s" ?& Z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 A' ?$ K. U4 [7 w4 ^; BMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
' q \: r- Q& O! l1 o) l; }1 q6 z4 zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& ^+ | u9 f2 b7 d# C
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 H7 D* w1 L& H. h
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* C. [" a/ y7 I; N: wMCASP_RX_MODE_DMA);- p. f. y1 B1 j0 y5 `, t
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( h- y G% n; p. W0 k |
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* \& S4 N6 ? T' p# E+ K8 Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + S4 K! Y- Q+ L+ e7 _
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* R4 {8 W/ `: x4 K! B9 [McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 ~: O3 S6 L$ [2 \; qMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 k8 g" H2 ~* I8 B
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 o' T# `/ J+ d- P4 pMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
0 E/ y5 p7 W) E \McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# F" V" L+ U- Y/ H1 L0x00, 0xFF); /* configure the clock for transmitter */1 [7 {- t1 n& v" d( ]
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. J; m/ j, w4 @8 g" r8 T
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" I5 f; A7 `0 L+ j# h: T$ CMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% g5 h% v b" x5 z' z4 D( s0x00, 0xFF);( V& X" U7 k' f* ` c
7 q4 p* Y v! y n/* Enable synchronization of RX and TX sections */
6 x- ~& ]8 y" g2 B1 BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */, {1 X6 g0 `3 ~; y4 p/ M( q# f
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 X- m% c0 _3 D" n& F# |
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 s M- A8 g3 P6 H1 i# m
** Set the serializers, Currently only one serializer is set as* [" T1 C+ ]3 d/ V) i3 h/ @) f
** transmitter and one serializer as receiver.
3 |8 Y1 a" w+ M2 G3 m; M' B*/
/ W6 ?# m9 a; }, [9 F$ zMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ L. c+ k4 W+ C- w! X0 r$ {5 C
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*4 o4 D- H, d* g# q6 v! F7 L
** Configure the McASP pins + t% B) M: X7 [0 B; p$ Q. `, l
** Input - Frame Sync, Clock and Serializer Rx
& a1 w9 l! T, y% {; b, o** Output - Serializer Tx is connected to the input of the codec . n ? w* Z/ M! I( {8 W
*/ C' h! i2 d6 _5 O) T" v5 I
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 f0 I; `# C6 M8 i6 ^! EMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: ?8 `- y5 \( q; H1 I, r+ Y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* ^. V/ k4 K" }4 L) b5 Q
| MCASP_PIN_ACLKX. b8 i, G# v6 j9 W# o
| MCASP_PIN_AHCLKX
1 Q5 V$ j: G+ M3 g+ _* u D8 q| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' V f8 W9 @4 x- Z5 O! V7 J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" C8 o/ `5 s' N$ z8 R# w7 D1 Q% Y3 a| MCASP_TX_CLKFAIL
- B; W) K* I' h2 A: B7 Z| MCASP_TX_SYNCERROR
5 u8 P ]! I4 X! G| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. k, u9 _; K/ H+ e' X| MCASP_RX_CLKFAIL. @6 g# u- f9 {% A9 O/ M% k9 ^
| MCASP_RX_SYNCERROR 4 o* c: V9 X. d1 X+ |
| MCASP_RX_OVERRUN);* B {" ?/ f4 n, L! [# X
} static void I2SDataTxRxActivate(void)
: [$ t; N1 t5 b& p. _. ]{
% b. Z& L& H' k3 z3 o( p# R/* Start the clocks */
2 L- ~6 G4 \/ M) wMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ \' I/ H7 x1 `* J' `) ~McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */- l8 O% l9 l0 F3 a- l
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 h/ ^& E0 x. o2 s, c4 T! G
EDMA3_TRIG_MODE_EVENT);
# e3 u" {* s1 g2 b* DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - r. o% T; M7 p' N+ r
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */9 S+ K5 {4 b$ @, f6 E, o6 x
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 y5 C7 ^! q1 J8 X' {3 H1 a5 fMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */, H1 d5 g5 A0 t! d
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" E8 j. W4 ^8 q" q) h1 y2 o ]
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 r; U( C5 C+ q* K" m `McASPTxEnable(SOC_MCASP_0_CTRL_REGS);- u- _/ ?1 K# c* O R3 |
}
7 d) a! m/ ~" T) J U请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
v3 H1 r$ }$ j) Q* w |