|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,' E" l( v1 D! U* u* `& [
input mcasp_ahclkx,
) g* l% f. p Q0 k, H3 b) w+ ]" iinput mcasp_aclkx,
$ m$ t* F6 H9 t5 B; sinput axr0,
3 N" f" v: X2 v2 d- d% R1 R& D5 w8 D1 y& J7 N e8 v6 e
output mcasp_afsr,2 l" g7 w0 {+ g8 c# K* F& S ?' F
output mcasp_ahclkr,
0 S1 x% P. u0 E: ~2 Q; Y% v& }% eoutput mcasp_aclkr,& N" [, N7 e7 U" N
output axr1,
8 O( F$ v# z w8 K+ x- X, C assign mcasp_afsr = mcasp_afsx;; f+ ]7 N9 D, L3 B' U% q4 W3 B# U
assign mcasp_aclkr = mcasp_aclkx;' p, F p4 \- @+ O5 O+ B
assign mcasp_ahclkr = mcasp_ahclkx;
- Z H @2 Y/ n7 B+ @0 ~assign axr1 = axr0;
5 L; t* A; o- X/ z, S9 n
7 k5 \! e$ k2 J V1 ^在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# d' i- t- h- V3 ostatic void McASPI2SConfigure(void)
+ X& y7 K: Z1 O1 n{5 t! G6 F+ R# y' x" n8 B1 v& i$ s! R
McASPRxReset(SOC_MCASP_0_CTRL_REGS);7 _7 o% |- D8 H
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
6 ]* z* M% p v' h+ g8 p- YMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" g1 H# p# g! I( [: f
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
6 K1 @% Q! \1 b% b7 CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 y3 y: e+ U8 a' B9 Q+ e8 ~
MCASP_RX_MODE_DMA);" M8 A6 c! m y J
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; g9 ]9 V4 L* V9 J/ T/ I$ c
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots *// a9 ~$ l p$ ^, V) n; V; o6 o, x; Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. S+ D3 O, [+ ?7 p7 oMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 k* }! m& }5 u7 p
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
L$ F) I. G" l4 ~. yMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */8 y7 ]2 M x' E0 Q# G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 j, w* W T% @( c9 J' z. SMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 ^+ O. {1 }; q( v: f+ g' k
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: \% v- a$ ^1 w0x00, 0xFF); /* configure the clock for transmitter */, V6 g$ j* G5 u
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 R! }$ o& ~9 e% j: N6 Y
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) d+ K' s6 y% o$ K
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) J" ^' r& k9 C) d4 u3 a. L2 e) q0x00, 0xFF);$ Z3 i; [3 E2 h! z% X
+ H4 [0 Q7 O$ w U. @! P7 d+ q# B/* Enable synchronization of RX and TX sections */ - ]1 W, q* K+ J. a
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */$ ~$ y7 g: M- G$ f' G6 ~
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. Y" F6 V: F6 d7 V# y' N: G7 J" |McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: p% p6 C5 j0 |& Q
** Set the serializers, Currently only one serializer is set as. i; p1 Y, {3 }2 d/ G8 x9 }
** transmitter and one serializer as receiver.
* N1 L' A" e: a/ t; h9 U*/% a+ y- J8 \/ n; q, W* v
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ q& F7 b1 R4 G% k+ }" ]) HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
; d1 y3 |7 M/ b+ i: y& g** Configure the McASP pins
: r `3 [! o- ?2 s" i: {) p0 ~) X** Input - Frame Sync, Clock and Serializer Rx' f, R. ]! |- h6 R+ M
** Output - Serializer Tx is connected to the input of the codec , p: i* \3 [6 i, n: l. c$ t
*/7 P1 P \ u( Y& |# G2 t
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" w- H" v. g1 i' K t3 _! ]0 ?
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 q; Y+ N" Q) q$ k: {McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX0 r& y- c. s. G0 U7 P6 Y) L. ^
| MCASP_PIN_ACLKX6 e6 x9 S; j! R6 ^9 b
| MCASP_PIN_AHCLKX
; u9 M `: _/ C' c& z| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
; p- [( Z( p" P; }3 K. E2 y9 f0 UMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 s7 F- l" k' R) z* J- ]| MCASP_TX_CLKFAIL
# K8 F% o9 o$ S1 O| MCASP_TX_SYNCERROR9 S) ]. Q8 g' t e
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " b% \( s( M4 G5 ]
| MCASP_RX_CLKFAIL
8 {1 o' |% Y3 ?| MCASP_RX_SYNCERROR
! x& x* J+ Z1 v! a B! V0 l6 Z8 N' W| MCASP_RX_OVERRUN);$ u$ z$ T, K; p
} static void I2SDataTxRxActivate(void)* K4 P) j5 L) _" X% b. n" i& t
{
6 q3 ?4 z. x& |: I5 K, l/* Start the clocks */
7 \6 j7 }% C4 p0 c3 G2 }: z8 SMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
9 k0 [, E3 A* T- N7 {McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
# @% r7 c$ F( E LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 H- N; c7 B' y f; R9 a' X
EDMA3_TRIG_MODE_EVENT);- H5 M4 P% u* R( J( I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
8 U) q2 \. Z) ]8 VEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
8 X& W# n# V4 U4 D4 P( \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) a, W+ ]! f+ n( w+ p) ~: i
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */" P% u! K: r) X" u) `
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
# J3 }( b3 r+ q6 G4 [McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! N! n* b' d# P; ]! J5 {McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. z+ b+ q2 b+ V} , Q, e* B% M; E; d- K
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. / E* K. p$ e5 p2 e" n4 x
|