|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
- q! g. n+ K) }5 G" N2 ginput mcasp_ahclkx,( H7 s5 _+ o; a/ w
input mcasp_aclkx,) O; U" ~' W8 G# N+ Y3 P& \! _
input axr0,
$ \! F; L: Z( g. d+ Y1 U$ x; E$ o8 o; _6 p4 k
output mcasp_afsr,
4 Y% J! r, V' k8 F: c: c$ b0 Z. }output mcasp_ahclkr," a- c6 s+ z: ?/ C0 r
output mcasp_aclkr,4 C' K- g; X% d+ C( }
output axr1,
2 _& j8 K2 R5 A0 X' L0 U assign mcasp_afsr = mcasp_afsx;
# R/ e( d5 d' A* k6 d% nassign mcasp_aclkr = mcasp_aclkx;% r$ i& S& S$ C m
assign mcasp_ahclkr = mcasp_ahclkx;
" Z1 [% [" L' v. j- u9 J2 Oassign axr1 = axr0;
0 D6 e+ t% B' P# M. m1 A; m
) r) G% D8 Z/ _4 @4 j! {& m$ X在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ k( C% k' I7 o ]static void McASPI2SConfigure(void)! T G: y) T! F$ c- Q: M
{; }0 a& m# o1 B: ]/ }% ]4 H: m
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 p* _# ~+ m$ |* Y! q9 C) gMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ D5 Q' \# s5 D/ V) K3 X1 L
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 V& ~5 Y4 `/ s4 l, k( QMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
% q. i- ]9 V' |( \$ `2 {% v, u2 L2 e6 FMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 B" e# k0 G) R/ ~* nMCASP_RX_MODE_DMA);+ u# E @0 q& F! o1 X
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 V" v, c* W7 R8 gMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 P1 s" W7 Y: O' R# w% M
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # A: W3 ?/ {6 Z7 [) M% r" h: M
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; v$ `; b3 ~7 c; [9 M$ }+ ~McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; G5 \- s t; z, v( O9 Q7 `* f
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 e' M' G. O5 h# o7 g# l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 g2 f$ p a5 Q8 mMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 d7 Q) I- c4 O8 b+ E- N# M# L6 `
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,% z, O( I6 x1 S" d6 |
0x00, 0xFF); /* configure the clock for transmitter */$ t. p: {# {7 U9 c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- A! s. Q5 s9 @; `. N1 ]McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 v& `9 F+ s: f6 b$ _; e& HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 Y. U) E: b7 T& K% ^; c0x00, 0xFF);9 {/ g9 i! {2 w) {# s6 [) u6 o
j+ {" R2 ]/ l/* Enable synchronization of RX and TX sections */ " @) s( O1 ]4 J9 x/ ?) r8 `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
, R4 u3 ?6 L0 IMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 R! I3 T: z; q) V! X. B( k1 T H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 E- H2 T% E* V" W0 c( l
** Set the serializers, Currently only one serializer is set as% V) P6 d8 o" D3 v% D. K$ \! U4 @* e4 U
** transmitter and one serializer as receiver.0 P4 i$ l; e9 [; Z; `# T
*/9 x% P0 h7 @* A% r3 N
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 X3 V* n' _" } \! W$ O
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /* r8 s8 L& T: f
** Configure the McASP pins
* R* O( V, m( e** Input - Frame Sync, Clock and Serializer Rx' S- H" ^) o4 I7 i: d
** Output - Serializer Tx is connected to the input of the codec - X+ U: k5 x- O. b8 x
*/
' M; P8 O/ p" sMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 l2 A: }9 p/ X: I* ~) F+ w/ q- f M5 Q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
# Q0 y; m9 V$ k. F% \McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; Q. {5 X. z+ |* x5 p, ]7 c| MCASP_PIN_ACLKX% n/ X* ~1 r# j
| MCASP_PIN_AHCLKX/ R. K: e- ~& K9 j
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ I. ]/ t$ L. J# D( CMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 V! c9 |# X0 y& q- \/ h" ?| MCASP_TX_CLKFAIL
- p- |) J. P- Z1 N7 w4 H( V| MCASP_TX_SYNCERROR% e# p' R- P1 @( R
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 ]& m7 O4 C7 I
| MCASP_RX_CLKFAIL, P5 |$ V3 z- L$ i- \# s7 f
| MCASP_RX_SYNCERROR
. C! P4 M, o+ {: l) Q/ D| MCASP_RX_OVERRUN);1 B* g! w$ B; Z0 e7 M5 m
} static void I2SDataTxRxActivate(void)7 G; n: Q: s& O% k
{
7 a+ @& ^# k8 Z$ o, m2 l) n5 V4 u/* Start the clocks */
/ T. r# m; A) _. |. i& v% P9 OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: t4 Z% z' e9 a& hMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */9 o- Q# v/ }4 W9 o t8 ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ J3 x9 Y) A1 iEDMA3_TRIG_MODE_EVENT);! H4 d, d6 I6 _8 x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ m; b. U" |9 C5 ]. OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ R5 W" n o E* e8 h) L
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. _- o Y5 o/ |1 A& O/ CMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
3 F; x* e; n( I$ C$ cwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines *// C. ]5 m* g L* b
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 @0 _4 Q5 D$ Y# _- g3 v- z
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& e! k; }% f0 Z" T/ A j}
% i& c5 F9 M! R1 X0 Z请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 0 O [9 u6 E6 b5 W1 B0 `
|