|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,4 h0 k* C6 z2 b5 p9 H
input mcasp_ahclkx,8 {( ~" f4 }, {) Y
input mcasp_aclkx,. S6 D f0 v. ?% Z
input axr0,) n! b: x1 P, l% _. n
$ A1 y% M% t$ W5 h( qoutput mcasp_afsr,8 g" j5 D7 ~8 g
output mcasp_ahclkr,% r, Y# u/ A9 n2 I
output mcasp_aclkr,
/ g* t& E7 L# n! B3 S0 V2 g# uoutput axr1,; u; V9 H9 U. g% H+ N
assign mcasp_afsr = mcasp_afsx;
0 |7 c# P: y; t4 yassign mcasp_aclkr = mcasp_aclkx;
% Y' z9 C0 @% o! o0 \assign mcasp_ahclkr = mcasp_ahclkx;
8 z+ U* v8 w/ z- e, j3 kassign axr1 = axr0; 8 K& S& l& p% n( H, S5 Y
5 `; `6 G7 z* }% J2 l/ j% |
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 / j l* F9 d4 m) Y/ Z, z
static void McASPI2SConfigure(void)
9 P9 ]1 ]6 z2 b; C [{. h8 z8 W2 F( m8 O g( `
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
: {6 n; @9 @$ \0 D( q2 b# lMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */* ]2 H6 @5 t/ w2 E2 J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; E% V& i3 n- @4 |2 ^: rMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
# L) X4 g; a9 P1 Y/ m, F% l [McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 ]: o9 w+ w( m
MCASP_RX_MODE_DMA);3 \; \! N3 L0 c# o: v9 c
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, o9 R6 K. e: b6 s8 L
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */' T8 d! e% x; R3 Y2 w, X' N$ L
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " Q) O: J* {1 F, [7 s; r
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. w( v8 h8 F' J9 Y FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; K% S! R/ k, W2 P1 P( [3 f* NMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ M- K x* S- W
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 C6 W$ e2 ]$ Z
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 @* l( d) @) N4 k* F SMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: D# K& A8 V) K( l" J$ N0x00, 0xFF); /* configure the clock for transmitter */
3 z4 f/ J6 z; Y7 Y& VMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' o0 z+ ?8 ?% s5 `) }( p1 ]3 E
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' ]1 g- H& B$ K+ P# n+ D2 B# [McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
5 D+ y2 F! O# p: z0x00, 0xFF);% H/ h" E5 |3 A
, A1 e- a" `7 {3 E4 {2 N/* Enable synchronization of RX and TX sections */ " `3 }& S; L4 W1 u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) x7 i* K6 ^9 U9 A& cMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ y) n) U. C" v' l1 m0 J7 P4 B3 O6 ]McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
q1 s9 _/ p, I** Set the serializers, Currently only one serializer is set as
8 {9 Q2 }6 f% U2 R0 F' B3 n8 b% b** transmitter and one serializer as receiver.' T. b9 H' {" T5 {% Z. x! P
*/. E9 D8 i4 R9 h
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; n( U3 u; Y& S) U" Y
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
P; B0 E* Q) j9 X/ w2 l9 I6 t** Configure the McASP pins 1 }8 S: R" T* C% n! F8 c- G
** Input - Frame Sync, Clock and Serializer Rx
( z4 X" _6 { @9 |4 E- c5 }. ?** Output - Serializer Tx is connected to the input of the codec
2 ]& s5 Z! N% c$ g, T9 A*/
# o. T: c' ?6 F$ ~0 T! M6 zMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' o7 L8 B, ?7 j% PMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 M! k- U) s8 c& A& SMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' a; ?) i( D7 r) A| MCASP_PIN_ACLKX2 k# }3 t- V, B: f
| MCASP_PIN_AHCLKX* r$ K$ W2 f# g) G+ v$ i
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */" @+ ^9 n, |# V* S5 n# |
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 Q' o8 n! ~* [. ^. k0 L3 B| MCASP_TX_CLKFAIL
/ B* {/ _9 D& o% A| MCASP_TX_SYNCERROR4 t+ |3 H. A# u9 d: H
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 K5 T! q/ F8 E X" n
| MCASP_RX_CLKFAIL6 ^0 _: a& @* S1 F/ y
| MCASP_RX_SYNCERROR
4 m0 v9 j% D6 h- h- s| MCASP_RX_OVERRUN);
1 m6 E N- s# t8 J. o0 c% E9 @} static void I2SDataTxRxActivate(void)
1 l+ f% B! n, |, j& d{& d4 B( {3 B6 z" K
/* Start the clocks */
6 Y& Q7 _3 q* |McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' c6 t; Z& b0 ~5 w" j3 }- \/ KMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
- o( }6 C. o( D& o2 o& j. v& p4 ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ {6 F9 ?. v8 D# jEDMA3_TRIG_MODE_EVENT);$ e" U6 G& n2 {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , n* y* d' s( Y- r" D$ D
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 i5 T* a: `8 M9 I) P* ~7 a0 c+ DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 t& h( M s( D4 q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
7 L- C7 N8 c* X. Lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, t8 i' y( k2 e, H% F$ `3 h/ gMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);: R4 O; x: m5 [" U9 y: k
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);6 {- ~" a3 Q3 [9 K
} " k8 b! R9 W. G) [
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 _( `( u8 i8 G( s+ X& G
|