|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
. e, B* |3 j9 winput mcasp_ahclkx," k! i |& r( a' h# r
input mcasp_aclkx,. T! @8 Q# V5 ?7 u' t5 i, {
input axr0,
. f0 N# h# f# O F6 i: l' }3 K3 I8 X# i! K( S' U
output mcasp_afsr,& `) e2 A8 `, T) k9 y6 n8 a
output mcasp_ahclkr,
% b& e. W8 q/ f9 H3 |output mcasp_aclkr,/ s& _* r) u* q5 T8 L# p
output axr1,$ i5 [+ G9 c" ~6 H5 Q4 K& m/ x
assign mcasp_afsr = mcasp_afsx;
& y+ u" t/ ~( B( Fassign mcasp_aclkr = mcasp_aclkx;% O( ^9 ]6 j3 P( l
assign mcasp_ahclkr = mcasp_ahclkx;; s; f8 V( [4 k" ^ Y
assign axr1 = axr0;
3 g" _% V @- h2 @ e5 Y; Q$ t1 Z2 {* _+ v/ j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
: f( |! ^& L- o8 ystatic void McASPI2SConfigure(void)
. M- R9 S4 n( x1 \{& g- B; q5 D+ |% u7 @5 E( f
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, ^( s% z! ]5 e0 ]McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */' L6 Y8 a8 `+ H2 O S2 N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% R8 D3 R# F$ d. G
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: G: g" b# p [2 n+ h
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 `) b H! ?% I# L8 N/ VMCASP_RX_MODE_DMA);
$ e0 J) J& j1 \5 T8 h% LMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) Q2 h2 F% J+ Z1 ~* yMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: m, `- ]; e' R) z @McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: w6 B* s3 M+ a0 k8 W1 x3 |$ LMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);0 N7 q* H4 b# I# H" U3 `
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ F6 ~+ X! ^% P2 D: M6 bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 I* k. Y$ Q' X0 n
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 O, f0 O( `' F+ w0 X) }McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * G1 Q. X" @. [, f
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,. G& X( D9 g" j/ d5 ^' ?( C: k* x/ I1 U
0x00, 0xFF); /* configure the clock for transmitter */
0 S! E1 n$ p3 ~' d! g4 K/ i" O; v/ WMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( T0 }' B9 P5 o' f
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 `! q$ R& ]) K9 ?. f' o8 Z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 D- }6 Y# A7 C6 Y# R) Q0x00, 0xFF);7 o2 I( j$ a/ K3 x
* w# N$ n) `3 t g; M
/* Enable synchronization of RX and TX sections */ ) ^/ a5 D0 X( x8 [, j3 m. y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) o# O. V) W- xMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 ]9 @( D; ?" N/ NMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*0 B, R, c" B9 f3 |! N
** Set the serializers, Currently only one serializer is set as5 [4 p2 H' R" U
** transmitter and one serializer as receiver.
1 k$ k, ~" Z B/ R% t+ o*/* w5 X6 Y0 i& O
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; ]+ H+ `7 m1 y. S' Y* BMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*' p5 A& ]; q. @7 t
** Configure the McASP pins , v/ X, S# t/ u, k7 A# H/ N
** Input - Frame Sync, Clock and Serializer Rx
$ g- ~4 K& t& o0 o** Output - Serializer Tx is connected to the input of the codec
. T$ I5 D6 w y# z; z*/. Y; J! w {) q) i
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);3 x, V/ |+ |, ]' a& B6 J
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- S8 a1 V" Q+ q8 C
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- o7 S+ W4 }3 E7 e| MCASP_PIN_ACLKX* v* ^) a* q2 s/ i8 G( @' m0 H
| MCASP_PIN_AHCLKX
8 ~; P+ U, [: h9 _| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// U! m# z- E$ H1 Z1 _: k; t+ F+ G
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ G5 T% e8 Y* d* }/ z
| MCASP_TX_CLKFAIL 7 F; w; Q& ]* e9 k$ M
| MCASP_TX_SYNCERROR
/ K0 `) `# m0 q7 q) G% U| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ C! n- d3 D2 a# x| MCASP_RX_CLKFAIL
' k* C( M3 p S* z| MCASP_RX_SYNCERROR
) P0 _* L0 k9 n6 I7 T| MCASP_RX_OVERRUN);: F: w$ T1 |5 C k7 P. ?
} static void I2SDataTxRxActivate(void)8 V `& ~: l* d3 w$ p+ V
{
- ~, n; V1 m% U. l/* Start the clocks */
# G5 a* f1 r$ f0 a: EMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ j& Z* Z7 `- e& f) u
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
t( W d- {) m+ y$ GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, F5 p7 X# G' [+ `% Q2 F
EDMA3_TRIG_MODE_EVENT);# L( T+ a+ ^ g
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 t, w7 g" S: J* F
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */' D# ]. p& W9 p# U4 L
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 B9 f \8 A3 N+ b* w- z3 J# l* s% V
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ q' V- K# y6 K! d$ f" Cwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */9 ?1 p: a& n6 g6 Z7 p# ^
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. Z0 b: ? a- s/ k4 q+ |: WMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);& t( y! e& u8 t. v& O) s
}
3 B E* l# @/ |! [( L+ R请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 k2 C. ?6 e, j& D1 m n' H |