|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
. O* r: [" d W! finput mcasp_ahclkx,
8 Q' |$ T/ Q' vinput mcasp_aclkx,. @$ Y( F& A, @( J7 k
input axr0,1 q+ F# E% X' q
: G4 C7 D$ R2 s4 \( C7 V
output mcasp_afsr,6 T# Y( f! H9 r3 s! {
output mcasp_ahclkr,
( }. f& Z8 F$ N2 {# I; b8 E6 I; doutput mcasp_aclkr,+ C- D+ D/ f5 o
output axr1,! W0 w! k, W! `* r9 v
assign mcasp_afsr = mcasp_afsx;
, N- b2 [ n7 d6 @; V+ }assign mcasp_aclkr = mcasp_aclkx;
; b" W. t# f \4 n. {assign mcasp_ahclkr = mcasp_ahclkx;
( c9 Q# |. Z; r3 H8 x% Zassign axr1 = axr0;
/ D9 K0 m6 S: g4 {+ w+ O. ?6 O' @; D
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
: h& e% t$ g% B, m1 M( U" a6 Rstatic void McASPI2SConfigure(void)
2 y" k8 P: D, V+ q{
& s5 w+ P) I' C/ A5 X' mMcASPRxReset(SOC_MCASP_0_CTRL_REGS);$ ~, @ c" e# u- U
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
! u/ c! f) f8 y$ }* f% ?7 ?. |+ pMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% E7 p& I0 i: G% Y6 FMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
. ?- w' X, P* U& U4 KMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; K( f1 p5 w/ w" t k/ i3 h W3 a
MCASP_RX_MODE_DMA);
5 f$ ^6 g9 X% C1 e. RMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- b& q0 b$ U- ]2 |8 A7 U
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- [7 j0 Y4 L6 \1 X: m7 ^$ D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 z6 R8 [# x3 ^$ @9 s% A, l# H% m `
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* r" n- T7 R: ~: }- F* mMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& `5 Q6 ?7 c* B( k3 N$ v+ ]& F9 F8 xMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
5 R3 u5 t' \ c; a0 gMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' h" v7 M* |% z& R4 V% KMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 6 u; B# E6 S4 n
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 }" q$ r; H- U, g$ Q0x00, 0xFF); /* configure the clock for transmitter */$ [ ~; f4 M* A ]
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
X. S- y- f! EMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
2 ?. Y) C) p$ [5 wMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: u6 O( }+ K- e- j) j! C) H0x00, 0xFF);
1 m2 U4 e; q+ l0 g8 G% P9 k. K6 J( w$ X- [/ m5 N8 C1 c# l
/* Enable synchronization of RX and TX sections */
' P/ P! ~ J2 AMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */$ z/ ]# d" I/ T- u2 L% j$ K
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! P% o- ~3 C: R, D2 a1 q' c. p: p$ g. SMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 K2 d# d/ s# u# a, H K: m** Set the serializers, Currently only one serializer is set as
, F( K# }& o" \7 T, i** transmitter and one serializer as receiver.
1 J( J* Z0 ^1 d4 _9 m*/" n8 J( k3 i5 R0 d
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# l! b& P% C6 b
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 G8 o: U# n; f: ]' P7 ?6 B9 t** Configure the McASP pins
% [4 o, r: W4 }** Input - Frame Sync, Clock and Serializer Rx& q# u3 t$ d, [; T
** Output - Serializer Tx is connected to the input of the codec
& f2 x) N- E4 k6 D" I*/
7 g$ D9 \2 d% r1 q8 N. NMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); j1 Q7 \# w& |4 Y# f5 W
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& L! w6 H. b8 l; d& `3 d
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ Y+ b) ?) n# s& I| MCASP_PIN_ACLKX6 c. ]* G0 n. E. y
| MCASP_PIN_AHCLKX, l; ~; {- { S" D `4 q' v
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
2 c6 H7 J4 v& ?1 s7 `. LMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . Q: ], M' b- T# Q- i1 f3 Q
| MCASP_TX_CLKFAIL 1 {3 a! P- w. E- u) S( G0 w$ u3 K7 b
| MCASP_TX_SYNCERROR5 K j: _$ _- c$ Y3 L, \4 H
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " v5 r$ U3 e/ c
| MCASP_RX_CLKFAIL
! O2 [" ~5 F7 `/ t* K/ q Y| MCASP_RX_SYNCERROR
8 ~ I$ E$ ^3 {6 i3 H6 f| MCASP_RX_OVERRUN);0 r$ P% t. K: Y/ p+ z* I, G$ y
} static void I2SDataTxRxActivate(void)4 T' K: M0 H B/ V. R" R
{
7 ? ^0 G: H$ I5 I) |" v/* Start the clocks */0 e% `/ h. q( X3 M* L
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- q) b1 q2 ?# \+ MMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */& T! `) y3 b& m; j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- P i* Z0 l' V. p; @0 tEDMA3_TRIG_MODE_EVENT);1 s) W- j/ j2 D" y& A, i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 j7 r4 L; d w% E# k
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ ?! @/ G, v9 ^1 g6 f2 a
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. A* B' V* v3 C* g& [
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ ^7 ]6 t; Y- [% E# r8 T% `& q' Z; Qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
9 q/ Y, w2 S9 B0 e y9 SMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 G Z: j0 ?) ^" B; l* M! k
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% Q: A/ ~ A4 u& |7 i& b4 x}
/ P% ]. b" ]$ |* Q4 V1 [ u请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) U. p* t$ h5 J& Z |