|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
/ ?; K1 U/ o* D; n9 Cinput mcasp_ahclkx,
, X; D0 [" E+ U1 E& C# A1 Oinput mcasp_aclkx,6 G: U# n! y) h$ {$ t# c
input axr0,
# ?9 N, U! k" J. n" |' U2 a$ O4 | H$ {# D2 r# c8 @
output mcasp_afsr,
# _* y" I* H. P1 `$ v: Boutput mcasp_ahclkr,# q6 D& i/ @' @# {' l: W
output mcasp_aclkr,6 \% u* |: v3 k. L- |
output axr1,
) Y; n% g; s# e. F assign mcasp_afsr = mcasp_afsx;& d- [( R& G% r$ ?: i
assign mcasp_aclkr = mcasp_aclkx;3 J' T1 n6 F) C" ]7 b
assign mcasp_ahclkr = mcasp_ahclkx;8 Q7 t# b% s2 m( _ Z' R
assign axr1 = axr0;
" i; N1 U* v H) [) o7 H/ M3 Q% A
& _4 K% g" Z' i @" B0 S在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 # ?. y. j$ d7 V0 `: V8 O( @9 Y
static void McASPI2SConfigure(void)
! l& b. j0 v5 |! M9 N6 B1 e{
* B& o" \; L _8 G" {0 {, xMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; \* x0 X* N/ H7 X- L) x! M- s
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ y+ @& V! r/ k7 w* | @
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' @ y4 `8 F1 o# q" T+ u, ]" FMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# K% `. K' m# p; H( p" o( P- H
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; V+ B4 g* r4 k& C
MCASP_RX_MODE_DMA);
% n& B, G" G3 L: n% |McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
a- h9 ~* V6 F6 O* mMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- z5 [' z: D$ p5 D) a
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % W8 u4 G7 y7 U$ J: S- U2 B
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, D( [- L, A2 K/ B* ~
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 T* O4 v1 V5 r x+ @MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
9 q: x$ v* r3 S% c! U9 uMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);+ X; P5 v& ]5 t
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 2 T9 i7 f0 }* L, o1 S
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 U' q. k8 z2 ]
0x00, 0xFF); /* configure the clock for transmitter */6 f1 O0 o7 \4 o& k, v& u
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! ~; m h+ `3 K" I$ n
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * g8 A% _& O" w1 I1 P
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) {, j; r# C) K( ?# `/ \# @2 x
0x00, 0xFF);
2 R3 S j3 @, X4 {. q- x: B. H% M, B' f8 b% R% v% K
/* Enable synchronization of RX and TX sections */
9 v2 B8 N d, E3 Q4 B n: ?McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; X9 X. h* `9 i7 o. ]$ N( t) RMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);5 y$ W) K8 {" G+ c0 f3 o# Y, B% g
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
+ H: E' o; M$ Y) u3 ]$ L** Set the serializers, Currently only one serializer is set as% y( q0 k7 v# t! ?3 N# h% m5 n0 Z
** transmitter and one serializer as receiver.
W. p( U* T5 M, Z8 G*/6 a% u3 h" L2 }7 u
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& o; i1 |- P% P4 a% Z: U& a
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
+ g4 G6 m# I! K** Configure the McASP pins
p j2 x5 [ t: p) `$ s** Input - Frame Sync, Clock and Serializer Rx0 L/ t' v& {8 y8 _& M
** Output - Serializer Tx is connected to the input of the codec . r- |, o9 s( C& k5 S' ` e
*/
4 ^5 e' h3 ?# RMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 }, C7 N' ^5 `$ f% x7 C6 k" f$ i
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, E2 x9 x+ X) v" h3 CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' s' a* d9 I. J* ~4 ^
| MCASP_PIN_ACLKX3 e4 d0 O* r' v$ x( t5 G
| MCASP_PIN_AHCLKX
4 q! @" L& y d! d| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 d4 E6 \1 Y) Z8 r8 hMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 a4 h, o6 q$ L| MCASP_TX_CLKFAIL
. v/ { @/ P% ]+ g% [- j| MCASP_TX_SYNCERROR
0 R3 u O' s6 b, e$ [6 K% `+ {4 T0 H| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % B3 ]) M) `4 Y, k. f
| MCASP_RX_CLKFAIL$ [5 ^4 a4 A$ ?+ c' I5 R. ^
| MCASP_RX_SYNCERROR + x( w/ A; q' c
| MCASP_RX_OVERRUN);& T- d7 h8 R' i: ]8 @5 q
} static void I2SDataTxRxActivate(void)
5 r4 _+ t! ^8 K) l, `- Z{8 M) {9 c4 X0 m6 \# n9 q n/ V' x
/* Start the clocks */
; X$ ]) S5 y7 X% O( |McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
9 h: ^" o2 w- E2 ?& _: r" K7 fMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
`4 w. O9 E) L n( TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 L- b7 A- r' @5 j) L X
EDMA3_TRIG_MODE_EVENT);
) H5 l& ^2 I$ ^3 f& B7 WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' ~$ t: e- D3 r" o& SEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* z( W( e! i- }! R) F- fMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( d/ _' j% [! d0 U8 }McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
' r) q5 {, y5 ]! i" e$ Iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
. I3 I9 } E4 P# V; j+ {McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 y6 Q/ a- a$ d3 d9 n1 f6 `McASPTxEnable(SOC_MCASP_0_CTRL_REGS);: X7 Z+ W: M5 B+ I
} ( q1 L! k+ k7 K( J( c1 X; K6 T7 |
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 G! a/ p7 I' `" c; r7 f |