|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,. z9 @2 q+ Z; T: J
input mcasp_ahclkx,
+ T( g' b& z8 D6 Ainput mcasp_aclkx,
6 X' R+ }& w7 J0 Finput axr0,. p/ X$ Y/ A% e: E& C2 b0 p5 h- {# i
3 b8 V3 @) s9 h! ooutput mcasp_afsr,
, h# M' W0 h) E' l# e* koutput mcasp_ahclkr,5 G/ h" P0 s) o5 E
output mcasp_aclkr,7 D# a4 s& R5 _0 j5 E( @' P
output axr1,2 N( o; h+ H' U& X
assign mcasp_afsr = mcasp_afsx;
U% _1 K+ M: l( Y, P$ \/ r% Bassign mcasp_aclkr = mcasp_aclkx;8 z, { k, J$ i v4 ]$ H- s
assign mcasp_ahclkr = mcasp_ahclkx;
; {0 \& [5 w1 m( ]assign axr1 = axr0; 4 [1 X3 l4 S( ^' |1 b- f
$ P3 R1 @2 G, _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
7 h. r; p) G% p1 P, tstatic void McASPI2SConfigure(void)
$ {7 w' E! R i, L{. ?7 a" ]7 v* ?
McASPRxReset(SOC_MCASP_0_CTRL_REGS);, s# i. U) J" _# F
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
3 Y! L# z3 ?! r3 D0 AMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ j7 M5 ^; v; Z% |8 u0 ~& l( m/ G
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */$ p9 o, t' a! [. h6 m1 r" D
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 n5 P% }7 f1 o' J( t# T& s# P, ?MCASP_RX_MODE_DMA);) U9 k3 D: r$ a9 L
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. R) i" l/ r+ v1 T6 Y z$ |MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" d7 x* l3 }3 r' F0 M- o: BMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' u" m; ?2 E" e* P" c
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! d" |# ~0 i. E7 MMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, i" {& E. }* C* i; b/ i/ j5 W" E
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" r$ g1 ~/ @& s/ t4 P
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" {. o8 A, u3 ?! c7 i) P1 `McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% c c( W4 S# ^( `9 @7 T0 RMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 S5 N8 g' Z6 J* ~( r' Q' E
0x00, 0xFF); /* configure the clock for transmitter */; Z- ~7 K. R! U+ ~, }
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# y* F2 b- }* Q5 p, A4 r
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 7 {' ^$ @% E0 D" g, u1 u+ q W2 F
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% q# }$ l+ k3 N' Q1 f$ F0x00, 0xFF);* z' u; I; Y, G$ t% L3 e
0 c6 ]5 [+ |! R/ R& n. @
/* Enable synchronization of RX and TX sections */
E. m2 u* t( @6 R% ZMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ |8 m" y' e* `6 j* sMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);7 E' |* K2 Z) K; t# H& |
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
) X5 k2 C7 N' v: e** Set the serializers, Currently only one serializer is set as
) F8 e3 N6 @" f, Z6 p0 Z+ N** transmitter and one serializer as receiver.
8 \5 `+ c+ J* A0 t- W3 W+ j2 F P) \) L*/3 l1 ]3 ^% g3 |' k4 ]# T
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. N( R; L- _! Q4 M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) c: _; E) }1 N L* c, M) f** Configure the McASP pins " ]( \8 B0 k6 |+ i/ {5 f0 j
** Input - Frame Sync, Clock and Serializer Rx
/ m$ B( ^$ C5 V4 E** Output - Serializer Tx is connected to the input of the codec & K" K8 O5 ]& Y6 X' z3 D4 E
*/
" Q0 Q# k8 G8 v7 |( J. ]! xMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
M9 q: c- U: i- h ?+ pMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; z6 Z. v! U" B& x$ S0 x
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 o! V5 J9 M6 K/ q| MCASP_PIN_ACLKX
! L9 l, f, ]- H3 s( g5 X& @7 G9 Z| MCASP_PIN_AHCLKX; v% G; U. q" `3 _% P& ~; w
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' U& o3 w3 f1 w; }
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! V: I& \, o, E$ V
| MCASP_TX_CLKFAIL
7 J' Y+ y1 T Z% @5 Y0 y: _| MCASP_TX_SYNCERROR
% |2 @+ J: P: u+ p& A R| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 y, q! u+ s5 H9 z| MCASP_RX_CLKFAIL
5 r. Q. q) Y$ G- ]| MCASP_RX_SYNCERROR
6 n, W$ l7 e5 @9 W. F: c| MCASP_RX_OVERRUN);5 p; C- C E+ Z) g/ l' Q' l1 G
} static void I2SDataTxRxActivate(void)
8 B6 c4 ? b2 w: T{
3 C; t$ S' C+ W- q" t/* Start the clocks */) f: c! S/ a. v4 y" n5 }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 f2 @: s, G+ E- Q$ {9 v
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
9 {( n8 r6 W) s5 E5 |2 t1 |. YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ d$ |9 S/ G7 N4 i# x. YEDMA3_TRIG_MODE_EVENT);% U- y5 O9 F7 P% \; M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : Z1 W4 \, t9 I& @- h
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
1 A8 K0 Z; a) jMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
& L9 w6 w; a- q/ QMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */; G, o& I8 }. x: u, e, v3 z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
2 `6 G9 C z( a4 OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
D5 {, C3 b3 d$ @: E2 PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% W( d( }* I7 r7 a4 B9 j, L}
7 X! x# m5 Y/ }请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. : w) \* _; y9 p% _) ]
|