|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( k8 H! X ^) p1 p/ e
input mcasp_ahclkx,
i) T0 E3 U* N' ]* Pinput mcasp_aclkx, |3 A& ]( m# H e+ T+ F2 ]# j% \: S8 i
input axr0,
$ k C7 b/ S) g
8 Y. e6 }% e: o, ?# P" J3 N9 Boutput mcasp_afsr,/ y Y" W3 Q& I. [
output mcasp_ahclkr,
0 v1 \+ a/ C# Y4 ?1 F/ Uoutput mcasp_aclkr,, S2 u, [$ c a/ s' @" m3 ^, I
output axr1,+ Q2 z) a6 y9 ?* k
assign mcasp_afsr = mcasp_afsx;
; ^8 V) B7 U+ Fassign mcasp_aclkr = mcasp_aclkx;* a! B# M& m5 Q& @% x5 O4 T
assign mcasp_ahclkr = mcasp_ahclkx;
5 L& G7 \& T7 Fassign axr1 = axr0; + l0 b1 o4 I Q' H, s6 H9 a5 I
4 V9 W/ |( f1 @) l在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 9 U8 \$ S O) E* l! X4 u8 `' S
static void McASPI2SConfigure(void)7 W( |7 ~, x+ \2 F: o- ^# D# b
{# B4 P l! C- |6 q2 a' S
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 Z$ c! ` Y$ Y* Q9 U5 G( v9 j9 AMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */, L! v) ~' c0 ~3 V/ @" q6 |
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
+ U" \4 |- t: ^1 Q" L0 @1 YMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) ?$ a/ P. e8 j% r. X
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& B& q6 F: b6 C# Q4 G( v
MCASP_RX_MODE_DMA);
; O1 F) U; \3 q6 }McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) K$ C7 t9 ^+ d4 P& R; y& t% x/ {8 T+ m
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* Z8 `$ C( P4 a
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 ^7 Y& h$ Y* D y% i8 K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! i% R5 m5 ~2 P. d6 I2 gMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ b# V) m, t3 H2 b' x7 \MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- S! `. L( M5 R4 f/ V$ u- B8 z
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, o4 m+ W; u% w
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( A# O4 E7 a/ i4 G$ s6 I
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ W+ E. M, _7 O. }6 k f0 ?# |, P, B9 \0x00, 0xFF); /* configure the clock for transmitter */
) a# H6 R9 T. VMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' n' Y: g9 _/ h( \, I5 }: j
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ X9 r) |8 b; g5 @9 l
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 Q' B8 ?5 }5 N- s1 E# e/ L' ~
0x00, 0xFF);
! C: {5 `. M8 b) Q4 J0 w3 _2 j0 V
/* Enable synchronization of RX and TX sections */
, _" J/ r- x* E. w6 EMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 F: r3 N3 x2 q5 K
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ q1 G6 a- |% U/ A" ?5 ~
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*7 L* s* y% w! e# r" a
** Set the serializers, Currently only one serializer is set as
* A( W* w, X) V; I; n' ]3 b4 s+ N** transmitter and one serializer as receiver.
, Q4 M% i) Y8 U: T I*/9 h9 X- l8 W: S6 l
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: o+ V0 ]! p( ^/ }3 J7 I7 G
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
' }. {( y, w( C** Configure the McASP pins
/ ^$ f* `. m# G* l2 Y% l** Input - Frame Sync, Clock and Serializer Rx8 _( A2 V' Q+ K7 I4 ?' x
** Output - Serializer Tx is connected to the input of the codec
* i! m3 d: o* T$ u0 S9 G*/
5 q$ M0 S0 A7 I; U' j2 dMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; F7 t& b- @! dMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));6 v2 x5 s; U1 B) d
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! s: G& E) K, N8 u& ]| MCASP_PIN_ACLKX& t( [. {9 b; w9 n! s
| MCASP_PIN_AHCLKX
8 G3 B: b C6 n) J0 I4 V1 N| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 g" T0 e9 V1 bMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. t g! B' T, X8 r& V| MCASP_TX_CLKFAIL
# [+ j, H, J: l| MCASP_TX_SYNCERROR
" F: K& y: T/ e3 X. x$ e| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
# J& F% Y/ r& \8 o| MCASP_RX_CLKFAIL
# c' u2 j3 D1 |$ W| MCASP_RX_SYNCERROR
, j5 s. r: Q1 U; h: H' k1 V0 @| MCASP_RX_OVERRUN);/ B3 M. U! v4 S+ @) u
} static void I2SDataTxRxActivate(void)
" X6 f- {" U5 d{
4 ]$ D6 ]3 E2 A$ ^2 H- y/* Start the clocks */
1 o4 J# l2 y' n4 H6 o! ]1 w" JMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' I0 \/ X5 G8 i: r
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 m- t! d4 G6 t: c* v) lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 j9 x1 R) J; K t2 Y$ S. h* W2 D
EDMA3_TRIG_MODE_EVENT);
; B. ~+ t% N3 j. ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " v; ?& Q$ `6 {8 \8 t
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; d8 S7 \* l. a: v$ hMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" {/ Q2 P, ?5 r+ W' k- R" b& ~1 S
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
! e8 r" P1 L7 p. ~5 t, fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */7 B* r: F$ _/ M3 L
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) F Y4 z" T- M( s' L E' rMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);7 i7 w& m+ I' L$ d
}
]! |: K/ ~; {# w: c' b5 i1 s( ]+ l; @请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ y% y1 p" x& X7 m3 J5 s( k
|