|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
- N/ b9 _$ {- O+ Iinput mcasp_ahclkx,
* W, _3 U0 W6 D* U H8 K6 j6 cinput mcasp_aclkx,
8 } ]2 I; B% X+ R7 }4 n& l5 pinput axr0,* {% q. }) ?/ U
8 {& D# _; |5 c# g4 e
output mcasp_afsr,
' o) \# S8 |3 n7 t! z& uoutput mcasp_ahclkr,
+ w0 t5 X& l$ J5 a1 Doutput mcasp_aclkr,
5 d& d, D# \; L/ |3 ?output axr1,& d u0 @2 q! W1 N2 M& f! \
assign mcasp_afsr = mcasp_afsx;
+ |/ w! d1 Z2 F @9 l! Z# x6 hassign mcasp_aclkr = mcasp_aclkx;
0 Y& L* G: l3 ^6 q5 F6 K" Q/ m: t- massign mcasp_ahclkr = mcasp_ahclkx;
+ @0 Q5 |& R( X( passign axr1 = axr0; ! x+ o+ h8 C6 N! N* u7 y
' p0 w% i) i" ~3 B1 C" K1 c在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
& F# {8 q2 W' [( Q! Tstatic void McASPI2SConfigure(void)
0 P" l) t; r* J( a6 F' g' n! y{
0 Y% p* [8 v# L' W% eMcASPRxReset(SOC_MCASP_0_CTRL_REGS);1 K- x2 P9 O- I, x& \, r- s
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */* D! b4 q; q# j) t( k1 i$ n
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ }+ ~0 I6 `. n7 E' T: E" h
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */8 ]& L8 `( @* X; ]8 u
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
z& C4 M- Q7 y" IMCASP_RX_MODE_DMA);6 j1 `0 D2 V" V; t' S
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 ~6 {* H3 w% S0 O6 t( |, }MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 H* n6 M" l0 @: H( m
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 _9 ?% e' e" a! n% h) n
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 T$ T5 o- Z( X9 W, J( H' tMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 C2 M3 ]; @3 i0 E8 J* d( z& K
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# n% I0 d2 d, x- `
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 |* F; B+ A) a0 R' n1 B
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 1 r# E$ D! x" D* w" @) E) _* p5 w
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 a4 d. ~# g3 R( J: O: {+ k0x00, 0xFF); /* configure the clock for transmitter */! L& v# k+ V1 c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 \3 i; M A7 _ L$ s/ n
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " S$ u" Y% i$ @
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% b6 g& k1 _7 g- t& U, ?* N0x00, 0xFF);
9 s( R: m# L, h" L1 J d
; C2 x- P, E' d: g m4 U/* Enable synchronization of RX and TX sections */ 2 w _4 H, d- f# _: y4 J! U; X/ l
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 o4 |6 P* L- e/ NMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( w# d! }: O% s+ P8 @( kMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
; V7 X8 U& y3 \** Set the serializers, Currently only one serializer is set as0 O5 M. _2 ]6 u a7 E9 X
** transmitter and one serializer as receiver.' g# b5 `' m% P1 H; A
*/
/ q' x: |, ^2 fMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 [/ z2 w! P' Y' L6 OMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
. U q% X j i; D** Configure the McASP pins . W) M* {# J5 m# A. T! P+ Q% Z4 y
** Input - Frame Sync, Clock and Serializer Rx: H. F9 f! \$ i r
** Output - Serializer Tx is connected to the input of the codec
6 C& g0 E6 r, u8 ]% O" O*/
2 R: G" `$ V( A- @( C! j, a4 rMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 A% o ~ @4 P/ U* I/ VMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! q, E9 C/ S: \6 ~9 n7 M+ ^- XMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ P$ E& V. _& O8 C1 F5 |) z3 \| MCASP_PIN_ACLKX/ ?. s& e/ d& U; y
| MCASP_PIN_AHCLKX
' r Y O) f1 b8 J) D* p. o| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
3 d" z# n# y G7 f" z' SMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 1 a0 B8 N' w% q
| MCASP_TX_CLKFAIL 7 R' e1 W0 H; F7 _4 D5 o0 E* _0 y
| MCASP_TX_SYNCERROR
) E- |4 B* }4 J6 W5 I) S( || MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 S) H9 q2 K' A0 T. }; h/ r| MCASP_RX_CLKFAIL
; e& X4 v$ n( N| MCASP_RX_SYNCERROR
1 g! R$ g C" s2 g3 l, z! z| MCASP_RX_OVERRUN);
: Q3 e" a! O) V6 s Z} static void I2SDataTxRxActivate(void)
( ~8 K/ I: r7 O1 o* w{
K1 c$ d, b; V; a6 a! |4 R/* Start the clocks */, f9 e2 w) d4 ^) R
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 r' s. i+ C& A8 p& P; O
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 K: A) W0 B0 ^% a6 T! [EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 u E$ b3 L) |- H: v! FEDMA3_TRIG_MODE_EVENT);
' f" R/ d7 w5 D' _9 S) j& LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
\0 M5 E5 }8 x) u2 ]EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */+ Z" Z* W0 N @5 |
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' W0 M' g3 I) w: [McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */' |8 Y5 o: F- o1 R2 L d
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */' @2 v% h9 ?, ]9 W9 a2 i1 s }
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);% k4 k i, y8 J) n# J
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, V# n* | \& P3 y+ L- q0 @# F6 F
} ' J" Y4 u. M Z+ I$ l
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. & u3 t% q, [/ @7 f
|