|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
8 p% _ w. K) s7 l3 Ainput mcasp_ahclkx,1 `( S! T# l! A0 e8 n+ {3 D. E
input mcasp_aclkx,
5 l( I+ [2 z) R9 \input axr0,6 z3 Y2 Z6 ~ j& `. ~
4 ?) k: H' \, F( }' V
output mcasp_afsr,
7 K3 B. t6 V, {output mcasp_ahclkr,
0 D* k- ~0 G$ T6 foutput mcasp_aclkr,( t* Z$ q- s+ ^/ @ L
output axr1,
; p5 ?+ S: b8 A# r6 q0 P assign mcasp_afsr = mcasp_afsx;7 T, r; o% A8 a. t- s( v0 p
assign mcasp_aclkr = mcasp_aclkx;
- ]8 I; p6 P3 @" J( P6 z5 \assign mcasp_ahclkr = mcasp_ahclkx;9 Z8 [, z8 a. N7 I; j( M0 q
assign axr1 = axr0;
( G4 O- u+ |! e
& w1 K. M2 Z3 D* R# V1 Z在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & _6 E1 ?' }( e* ~8 h, R
static void McASPI2SConfigure(void)9 a$ b) }6 _1 R
{! w# Y6 H/ H3 N% l. E
McASPRxReset(SOC_MCASP_0_CTRL_REGS);* x7 I* x5 [, }; |8 {' a3 Q9 J) l
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */! o8 w: Y; Q3 ^4 P0 q. N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ j1 x: b/ l' U& c
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
" _" a( v) h+ P% {McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' Q$ v3 x! k) R" N3 D3 S
MCASP_RX_MODE_DMA);
: s6 r9 p$ v# h# E* q- j8 V* rMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," b8 R2 x# ]; O
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */' w- U6 J2 l& h% \0 D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ ]0 S6 A0 A$ p j* `& ~ I( OMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! X" m! d) S( V- q& A4 q( f
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 [, T* }* _! Z g% N- j% I7 n* j- f4 A
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; s7 B* s1 E6 D+ h0 X4 w$ q" {, JMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 h( i8 w. a2 N4 q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. [2 Q4 C$ ]. f; Z7 b* m" u% eMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% o: @; ?: \5 O% w0x00, 0xFF); /* configure the clock for transmitter */5 x# F; m. _4 u; t( ?; l! [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
" [3 n# O* z; P/ ~" g$ DMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 ?8 Y7 B) u1 K/ t0 C* ^, F" LMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 d6 u# w6 M+ t4 O# H$ U7 [# O
0x00, 0xFF);
* H$ U7 f' x7 V8 k/ v1 k! x" h
/* Enable synchronization of RX and TX sections */
$ h' Y5 N3 d6 a) w+ OMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
: i& C8 ^* j- PMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 g9 J0 q6 o( x! F1 y: ZMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*, X6 _2 z/ B g/ L; X
** Set the serializers, Currently only one serializer is set as
# D$ C& h4 L; R: W& L, ~** transmitter and one serializer as receiver.
( E9 z! m% O9 O2 H/ i; v( p4 b. M0 c3 V*/, N! n) L+ O( ?- }
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! f) k( ^7 }( T0 q
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*) [. w* G* X" J. D. V* w* x
** Configure the McASP pins
" h' B* v: m; A* }1 D** Input - Frame Sync, Clock and Serializer Rx2 P. x2 b3 H. |" m/ o0 w, Y! }
** Output - Serializer Tx is connected to the input of the codec
_; ]) X. O3 H( o! L) o6 \" o*/
% t v3 ^) W# d8 C4 V* tMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, w! \6 Z9 g% s* n* S
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% |& ]. r9 S- I8 z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 e$ p' j% c8 L) l- t: p1 m| MCASP_PIN_ACLKX; J% f+ ]; f6 g
| MCASP_PIN_AHCLKX& N" F2 ~% m; [6 U# C+ U- G
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
/ W% n+ b. P6 Q+ yMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( O) t+ l. o& d| MCASP_TX_CLKFAIL 3 Q3 f1 X# z: Q4 U, ~! C
| MCASP_TX_SYNCERROR2 q; m- U) j( m/ {% F4 l- U3 ^
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! a1 r$ B4 V7 W6 `| MCASP_RX_CLKFAIL6 \: y( Q* G0 P7 S
| MCASP_RX_SYNCERROR
! b1 j/ W4 N5 k9 r| MCASP_RX_OVERRUN);' x1 a9 y' M$ N3 `0 }- I
} static void I2SDataTxRxActivate(void)8 Y- D9 u+ @* F# M+ f
{
+ J' k7 w* M+ L7 g" ~2 g" @6 }* G/* Start the clocks */: z1 a8 t$ I7 t0 p) H
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, |" g. D1 `5 c) X
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */2 ~- ]2 S* z3 ]. Z8 x/ o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) V+ _$ }4 x* l% N9 m
EDMA3_TRIG_MODE_EVENT);" @% X0 N; o% A, U) i. H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& \# l9 h! t6 a) x1 aEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */7 d3 t+ o' A1 [; M; s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
1 X" [* n8 l% v, ?8 R# ]0 [McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
2 W8 [" Q2 y1 Y6 G+ l) r$ F! \while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */+ Y% z! @8 C5 M7 ~1 h8 N+ c
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% K8 D) N* m: w' h5 p2 IMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);- M N: U- l% t
} % x4 a& y8 u' T# h
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. t9 N+ e7 d# z+ A8 Z; h/ ] |