|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
' w4 c9 N1 {; |input mcasp_ahclkx,, \7 o! S7 W3 r( S& ^% g, m& _0 `
input mcasp_aclkx,
; O: u. }* E! L6 ? D1 winput axr0,8 w. i1 `) n1 _8 q' D/ a. c+ r2 q
' _+ ~8 r$ b& D6 B, b* C S
output mcasp_afsr,
. N, O, D7 v, ~) R5 P) t x' Doutput mcasp_ahclkr,
, h9 w1 s; |. t/ d ~1 r& w' Z2 Doutput mcasp_aclkr,
5 u8 d+ n# Y( `output axr1,
+ N" t4 o+ |. d: h- U5 p assign mcasp_afsr = mcasp_afsx;! ^; O! {% k0 N5 ^* |
assign mcasp_aclkr = mcasp_aclkx;7 D% n6 M5 O! f6 t+ P9 A
assign mcasp_ahclkr = mcasp_ahclkx;
1 w* K( Y) O2 J- e! b9 S( a4 U. Massign axr1 = axr0; : s. C7 Y! u) S$ Y+ \) C/ M
. O& a) c9 ?3 W- k+ D在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) D' T# u) D% }, _: h3 q I$ Y
static void McASPI2SConfigure(void)
. F8 u, J" o5 ?8 j- s# @; d{
4 D! F4 ?- I% [) xMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; Q9 [' c+ W/ j+ x8 y
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */0 i" T8 T' B0 P% f8 K2 v3 I" C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# `2 G) O' a) Z% OMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
" u' P$ ?' E' g. ~8 j. sMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 I3 S2 b( N1 wMCASP_RX_MODE_DMA);$ T; ^0 J+ t1 y! s0 _( w
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; L/ U0 a1 h+ S" w) @
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
0 @" A% X: @% ?$ j6 J# oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - u7 @3 S5 j. S0 \
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, ^/ \! J# b! s% K# ~( F
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 q! f0 q, {' \* V8 V! f' p& Q
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
6 C+ g% m2 I% i8 D9 G3 ]! j) fMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; ]4 w; A" Y* L6 x8 G& U. P
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 E1 g# j2 S7 s5 YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, F7 G5 T) w6 o+ ~' U2 c
0x00, 0xFF); /* configure the clock for transmitter */$ A6 x* i4 x7 z+ n
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 o2 n- K V# b* IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
0 e5 D! ~. f" }McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' `5 k8 t p+ \0x00, 0xFF);* c& \# s" h, d6 t; `: i
' c& J4 N$ B' F0 ^
/* Enable synchronization of RX and TX sections */ : w' e% U. Y s7 B& g9 ~' F
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */2 ~* Z3 F% B" r$ T$ n% H
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) X# U+ _; n6 }# T* o3 rMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*+ g: Q( r4 ? m& S, K+ V7 K1 m: v) [
** Set the serializers, Currently only one serializer is set as
3 c! |" r! t0 X {7 j( d, X. @* e** transmitter and one serializer as receiver.1 q) w O) \( |# {, B
*/3 U, S7 C& `- ]* S: t& X# k) a
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" d0 [, Q3 `( Y/ \' L- MMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*0 {' G+ B0 E! w( J
** Configure the McASP pins
: z. \/ ]7 L; p `** Input - Frame Sync, Clock and Serializer Rx: T3 W" g. M4 g( R8 I& {
** Output - Serializer Tx is connected to the input of the codec ( R& ]' a. J6 P3 I( ~
*/
. x1 V, \8 ^ d' r( X9 a8 G/ wMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, e |! H. d; A+ X3 U6 e! G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* ]% O$ O5 @* Q6 z: K4 T5 pMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. _7 t3 |9 y5 k+ h6 L/ h| MCASP_PIN_ACLKX
0 U! C2 X+ [( G+ o( {| MCASP_PIN_AHCLKX1 Y# c* K _! {. I5 E
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */: p- u$ Q& Z5 L" P' g
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- F* ^. H& J) T* Q| MCASP_TX_CLKFAIL
- E% `# p6 ^0 r |8 G| MCASP_TX_SYNCERROR
/ g- ?4 }! ]7 ?# o| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 ?, K5 T" X* V; c! N0 O9 e| MCASP_RX_CLKFAIL5 e8 A5 O( _" \5 ~/ E2 R9 t
| MCASP_RX_SYNCERROR * ?- i$ K. |; y' }6 ~
| MCASP_RX_OVERRUN);. B! ?8 i# r0 `
} static void I2SDataTxRxActivate(void)
" N- D1 Q. |. F" p) ~{
) b: v7 n8 k4 H& x/* Start the clocks */
$ W- s8 q7 O: r" C, W+ W; b! XMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ V5 ]; o* u1 |. } Q) o' ~McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */! J2 G/ Q. g( ]) S' j3 s7 D6 e
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- U2 i w6 K$ Q. LEDMA3_TRIG_MODE_EVENT);
2 @+ T2 ]2 K' |3 t8 |* _, ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
. s7 ?3 [( {. T B4 L$ IEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
$ c0 J' i k5 mMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 H# o$ m0 Q- ]5 ]8 R! d7 k' o9 ^, X
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
Q5 j8 v- Q2 r. `* ]8 h/ }3 bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( }: q8 y/ J, u; OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% |/ P# Q5 q2 y( f+ z) OMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);" k7 O7 R) V4 k. c! f
}
6 P1 P6 X6 x, h# x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% }9 j6 _. f+ w; Z+ K' r6 W9 y, f |