|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
; n' N1 n5 Y7 V5 `$ t0 ?) [ Y1 Finput mcasp_ahclkx,8 q% }& h) N6 ]
input mcasp_aclkx,
1 K- C: x4 O( B$ O$ |6 zinput axr0,+ f- m% {% t5 b; L
; u- F. G. O5 r" Woutput mcasp_afsr,
B4 r0 R7 C# S4 D Soutput mcasp_ahclkr," x6 [" d6 `' Q# n) a+ q9 D
output mcasp_aclkr,
0 D$ g, ]6 u5 G3 Foutput axr1,* d! ^& Y1 H" r
assign mcasp_afsr = mcasp_afsx;% ~7 j5 O$ m+ O0 p
assign mcasp_aclkr = mcasp_aclkx;* t1 L. N$ e9 ^# C* j# }+ r' p
assign mcasp_ahclkr = mcasp_ahclkx;
; S# G; I9 p+ U" tassign axr1 = axr0;
: ~& ^: x, j. D( A* k6 E0 H3 M; i2 J/ P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
+ r* O+ ~; L$ w/ u2 R. G, G. Z" Dstatic void McASPI2SConfigure(void)) _, n+ c2 `& L: A3 Y1 X3 A
{
0 q/ g- K8 V6 ]/ ?- T6 uMcASPRxReset(SOC_MCASP_0_CTRL_REGS);8 [6 {9 \1 T7 p; u
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 [6 g; f4 t$ a. N. V6 hMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; ^0 i v4 i$ l. J% v( GMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! ]4 B) m. j% o; B5 T Z; VMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* N0 j `# h$ ~+ z9 H
MCASP_RX_MODE_DMA);
4 g, ^$ O) K" v4 zMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ V: H; w3 S% z4 z2 uMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 o) g. P: b. \7 [/ z2 \McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! j% V5 a) [$ U. _, F8 Q' j$ i4 C$ pMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, Q0 U* {, e5 _ S2 R1 X
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . ?: w, c2 c8 B$ ^( r' Q% H% l: r2 |
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
3 x9 E @8 p, o; Q/ l3 s$ D. QMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# H1 O4 F5 q5 g: GMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 e& u/ g4 F7 l8 `- D1 D( V
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- `( i+ l6 @% U& N4 ]
0x00, 0xFF); /* configure the clock for transmitter */" g5 c, q/ o- E1 @( E1 j
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
) H3 n; w1 j* R& f1 R, sMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 r3 y0 D: B& w7 g8 I, v
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" v) ?8 N0 E( S& j3 p0x00, 0xFF);( X- [/ U) Q% y+ N
2 W3 d. B- d$ o- H
/* Enable synchronization of RX and TX sections */
# v; a# n/ u F+ Z5 [! \1 }0 AMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) G7 z! t2 a6 v7 d7 tMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: Y0 ~; K) o. J( s) ?7 z( hMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
7 D# b1 P5 f6 U/ \8 s7 c** Set the serializers, Currently only one serializer is set as+ J, x6 a. I$ E4 k4 D# @0 E6 W
** transmitter and one serializer as receiver., R/ e- N! ?) C4 s9 j) r
*/( `( }& }7 {5 p/ v( f6 n0 o
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( x& y: ^/ Q1 A. T C' o' DMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
+ b7 Y9 h2 {6 z1 |' [; s** Configure the McASP pins
1 a/ r1 I4 N @ y+ f" G. L** Input - Frame Sync, Clock and Serializer Rx( }# J( Y( W7 U4 X# C0 s
** Output - Serializer Tx is connected to the input of the codec
* y2 c5 I, V) E! t$ S. j: u% _*/- F4 H& F! d! }. E
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ i+ _4 m- B5 A/ p) Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( ` _/ g! h O" i, j! }0 M) M
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ X3 i# Z# n: y* f& f5 ~+ i| MCASP_PIN_ACLKX
6 \0 ]; V$ Z3 k# f| MCASP_PIN_AHCLKX: m% B. Z+ R; D
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */6 V! J0 o* R( J n$ J; p; c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% o. T5 M: U2 D6 f) e| MCASP_TX_CLKFAIL 7 j- I8 O' l0 c5 h4 H
| MCASP_TX_SYNCERROR
) A$ Y6 y# Y) L5 W$ `# c| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ _& k C/ m* q" F4 \( G: B- k( H
| MCASP_RX_CLKFAIL
$ m4 K# ~4 i/ d' f* B8 ]| MCASP_RX_SYNCERROR
' A; v2 [; X0 e/ ?0 K6 o) @| MCASP_RX_OVERRUN);
/ O7 G/ i3 L+ v, ?% M8 n( w} static void I2SDataTxRxActivate(void)/ g' C( ~8 G& {; l# h3 d
{
: S- m6 M5 g& d X6 h6 T/* Start the clocks */9 t1 N2 o! S& b, h- g
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ Z2 p @ u# g5 E- _
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */: G% d7 \: {' n( D
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ C* J; x: F5 t! {/ s( C$ J( \1 XEDMA3_TRIG_MODE_EVENT);
7 R9 [* k+ Z6 SEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ ]# r; c t+ v' X# V$ sEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
' ?# P5 Z* E3 p t) pMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 _5 h2 R2 _, b5 TMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" T9 h4 |% g6 O* Z5 w! u/ K4 h) pwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ J' t2 W1 k' z8 [+ j
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 u6 `' d5 X6 w6 b t, A
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ D- [; Q# N2 u1 V" I b
}
6 U+ s' |/ ~8 C" v" m) `0 I! m请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. / W( B z% G( m, k! z" ~
|