|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
9 p8 w4 m& N# Q" x6 c( Zinput mcasp_ahclkx, L5 a# S4 O' f. J9 I
input mcasp_aclkx,
: P+ A8 _# j/ F iinput axr0,. O; _3 B1 z- }& y0 I8 Z5 ^/ m
0 R% a o$ u4 Moutput mcasp_afsr,
7 g) l6 }; p/ o0 o a6 D' l* \% Xoutput mcasp_ahclkr,
( g# }3 ?$ C- ^output mcasp_aclkr,
2 I3 |( y* m0 |6 J Y) Ooutput axr1,
1 G! Q0 B- `6 Q* K5 X assign mcasp_afsr = mcasp_afsx;
. t! _, S8 r5 K$ zassign mcasp_aclkr = mcasp_aclkx;
6 U0 G* N/ Q' S$ V7 m5 V; |8 P; B j9 Tassign mcasp_ahclkr = mcasp_ahclkx;
8 m- ^ k& P- F% ~! D( Sassign axr1 = axr0; : O8 w. d: `& s- c! i
3 a$ B$ s' a. k- j# b, r" I( e
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# ^& H* h# _! [* J" Astatic void McASPI2SConfigure(void)
' a( U; H9 U+ t( C( _{
, K# b! T4 `! c% ?0 H. mMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 ~) ~* L% e7 z9 D! I% s) C6 FMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
: M6 A% S" x% Z/ C3 {6 YMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, I' q! Z! C! _% Q; r$ J: \9 iMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */1 _' ?2 C$ k) b, S6 @: i) V1 l
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ \3 b5 C: U1 t g
MCASP_RX_MODE_DMA);
. D2 o$ u7 n7 mMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ U& f9 w4 f0 y3 RMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */6 ?2 I* v" T3 O. y _$ ~
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 _2 Y. P- p; f# [& c9 NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); m6 i4 O" T# E, J" Y; x$ P, b
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" y8 }& p2 s2 ^( cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 b* w* r1 t; w0 c ?0 A- O
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- m2 p6 I" z1 B% {8 `7 d5 A3 kMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
J) _ x6 L& Z Q2 l M' BMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: }) R9 |# a! Y3 L$ j9 T
0x00, 0xFF); /* configure the clock for transmitter */
* T3 q2 P k: V5 U, Q! zMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 F/ b W: `" @7 m! x. _" U, Q/ oMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # a& q: U- Q/ x$ n0 x
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) K7 }, C) h4 P, }* l& H8 k
0x00, 0xFF);% q* P3 G0 R6 S6 p4 W
& O- d5 o) r6 F1 c0 y* H2 ]
/* Enable synchronization of RX and TX sections */ 4 e3 ~& l; u1 V3 G k0 z
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 \* X" W. z5 B1 z* K7 JMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 z6 i1 i D M6 r1 K' UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
1 w. [9 u D3 y6 W+ R** Set the serializers, Currently only one serializer is set as& ^1 W$ }9 p% a0 X0 N- S8 X( W
** transmitter and one serializer as receiver./ d x- q7 x- V* S6 P: y3 c1 |- y
*/: _9 G* g) ]4 D1 n; y- Q" z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ i: `* r# Y) t- x* n! i( O
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ q m' R$ e( Y- k& a
** Configure the McASP pins 6 J, Z. X* a- |- ]7 B; P
** Input - Frame Sync, Clock and Serializer Rx
# t9 x+ i4 V" T1 z1 W** Output - Serializer Tx is connected to the input of the codec
! V, t! h6 J+ K' u5 q- N*/
' S9 N7 p' g Z5 ^$ _2 B5 A( n* `McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 Y6 }2 i" w" w# _McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* T( Y; Y2 @# l2 E7 d; l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 k) s8 j( x& i; L; I) ]) a) y
| MCASP_PIN_ACLKX
& n* U/ s9 A2 `7 r1 v' H| MCASP_PIN_AHCLKX! v Z3 }" ]! G0 {$ e
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */3 t7 q6 m; o/ v C" Q
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
; y, [ S u1 H+ f1 M8 z| MCASP_TX_CLKFAIL
& |+ R( q5 I$ A, d2 _& z* z| MCASP_TX_SYNCERROR
; `$ Y9 _: [% C| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
# O8 c/ {' M) m% I: ~ |$ i| MCASP_RX_CLKFAIL
: O( u* a7 n) e/ _| MCASP_RX_SYNCERROR
; Q9 h! Z% J! C! a7 v+ G" g| MCASP_RX_OVERRUN);
4 R1 n' z& ~7 O# Y- g} static void I2SDataTxRxActivate(void)7 @4 k7 S! `5 Y6 `$ c
{
) d. _6 y1 D- d% E) b4 P1 q/* Start the clocks */1 r6 w* @8 a& \; [
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
^9 s: U7 ~3 H5 c* G XMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
- F0 G+ _- `8 lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 ]4 S% X' Q. z0 bEDMA3_TRIG_MODE_EVENT);* z+ M9 ^& a; X' d. K' d$ z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 U' o5 O4 C+ t4 ]9 r/ @% h
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* z: m4 J+ g* l1 Z! XMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 e6 w' I0 Q1 J0 a0 w$ JMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */+ }. J% L/ l- ~+ M0 O( I7 ~( m
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
9 h! U7 L; N4 l' k" C- XMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 L4 q1 \3 Q" \8 E2 y7 w' ?' L( r$ E$ n
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 N! ^4 m. B7 {; u0 s} $ I* K' ^# T) z# A/ z
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) \$ h% m; ^4 S& P |