|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ v$ S% w* O- C6 j8 r8 _$ {4 \
input mcasp_ahclkx,5 u: P! r \1 i' C# ~& C
input mcasp_aclkx,
7 G0 i8 N* l: h4 M: }input axr0,
& |* W7 t+ a5 Y; q3 w }# A3 R- g3 V9 Z: t
output mcasp_afsr,9 k) @0 ~; t$ B7 X1 g3 R6 ~6 \
output mcasp_ahclkr,
1 W& f* l3 K% [8 f5 Z9 x$ E# G2 ~output mcasp_aclkr,
* c5 V% w0 ]$ M( |output axr1,
- b( _. E! ~* \$ N6 n) ` assign mcasp_afsr = mcasp_afsx;
" v1 S) f" Z8 x, W" {4 p& Qassign mcasp_aclkr = mcasp_aclkx;
8 V/ m+ o( A" N/ v8 n8 ~% P4 u$ oassign mcasp_ahclkr = mcasp_ahclkx;2 R' v/ @1 p) v0 H
assign axr1 = axr0; ) m) u' C* F1 Y) |1 \! V3 ^. D
' p# @1 l8 N4 S1 p* v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
3 @5 `0 Q) K. o5 i( ^static void McASPI2SConfigure(void)- u( w$ L2 S! K# }& T1 ^& g) g
{
' P( ~, E) T3 T6 ^. w' ?+ [McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, @6 U3 V4 v, S; p, P, F% SMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
1 B4 c) y$ O; M% L b6 c, aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) n' e$ M' m+ I5 \4 E+ n
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */! H% ~: r( H W+ s
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ U5 `! B5 E" U1 ~4 A- W HMCASP_RX_MODE_DMA);
) x: r3 {3 y3 ?: q) c/ i1 s% JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 D6 P `% J9 h" g
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ C# I2 N& a+ W9 K6 M% n2 w! D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 }1 I( O8 ? ~& U% HMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 q$ `0 S3 j& yMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 O" o ~" a' i5 }# M AMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */ u6 S u+ C( O9 w% F; D
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% a! }7 D1 P- R3 L0 f
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); # q. j5 f5 x' R1 q2 c
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 z7 r" n! `5 p, D; D3 ?5 p, Y
0x00, 0xFF); /* configure the clock for transmitter */
% [5 d* u9 D# `/ B$ c5 PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ O w" D7 Y; n
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); & @% K) V" O; c. w: ?
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% k/ h2 r8 D: n# D5 y. O
0x00, 0xFF);
- G) W I' q; o4 {2 ], _; I% Q. s+ A
/* Enable synchronization of RX and TX sections */ ; N0 r0 Z- t9 w8 k8 q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */. T- G' ?) y* ^1 h! M2 X! y( \$ V& ~
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. i4 w! G: L2 _5 p* D& B! LMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
1 a, @* n- M/ b, l; j** Set the serializers, Currently only one serializer is set as
' l; h: \' Z0 [( t3 a** transmitter and one serializer as receiver.
7 g; @2 U! x& w+ p*/
. _% ?$ z: A9 c- i* j8 n, bMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 X2 t* y* F; B H, c7 w8 w5 B% aMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
1 w- V/ D, M4 F1 ~** Configure the McASP pins
5 i1 _% H$ p1 K7 Y** Input - Frame Sync, Clock and Serializer Rx$ f4 y# ^; v6 f/ }. I ^8 K5 d& }
** Output - Serializer Tx is connected to the input of the codec ) p% `6 Y6 w+ T* ~
*/
0 A" G' N1 J& v% {4 ~9 ~McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" v8 N! |/ w7 N1 y0 w2 M
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 U, p# @9 `% ?McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) f' s; w1 J+ r, C
| MCASP_PIN_ACLKX
! B/ e7 o% o6 a% ^, r) \9 D| MCASP_PIN_AHCLKX
7 l# c4 G5 b) |1 P3 S| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# i9 H& t. `5 M( @McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' Z+ n8 O4 y" }% R5 D4 u; E| MCASP_TX_CLKFAIL
+ J" w: Z& S0 k, L. G3 M) M: R| MCASP_TX_SYNCERROR
! y4 D1 O5 m5 e6 K' a| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 y" {; N% E3 Q( R& d/ l% W
| MCASP_RX_CLKFAIL: w$ q7 O0 N2 z0 B2 r5 C
| MCASP_RX_SYNCERROR 7 ]0 b* V _, e6 i
| MCASP_RX_OVERRUN);
, a- v: ~- A$ k( Z, v} static void I2SDataTxRxActivate(void). W) X3 e% j6 U$ B5 q) W0 I/ p) _
{+ j: }, U. G+ L# X$ D" Q* x
/* Start the clocks */5 z' r$ q6 a- @( ^2 m4 Z
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; w8 `1 ?! g' R7 N, O: c( O/ @McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 }9 ]6 A1 n- J6 k7 Y u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) [# y. c9 s* P# ]EDMA3_TRIG_MODE_EVENT); O/ a' p G0 c: P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 j+ H' J! s& T* n
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ U. h' e& C( [, UMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. t9 h& z* N3 x% E* q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */+ E' \" [" s' F8 N- H6 U$ o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
! _! P. w! I2 C7 Y% N9 H7 l7 `+ O. tMcASPRxEnable(SOC_MCASP_0_CTRL_REGS); S M/ [3 o3 Y& e
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! w F0 t- Q6 T) ~
}
' U3 T: n/ V9 ^4 c$ C0 t) q4 b请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 V4 A5 X, S* G! Z' l+ Q |