|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
2 W" R" d1 ?# Q# J, k& pinput mcasp_ahclkx,- I& a) B1 t& j( |4 h* ~
input mcasp_aclkx,9 T3 D! J( N- L9 d6 D- O2 D
input axr0,
2 S( W4 Q& b3 i, g, C
; ^* J# }5 w- Coutput mcasp_afsr,! {( m/ y3 a& @3 J6 l
output mcasp_ahclkr,
+ B+ T8 s4 d+ w# d( a$ Houtput mcasp_aclkr,% V2 K) `3 O3 B$ U6 ^/ k
output axr1,, b/ S9 }4 N' Q5 j) P
assign mcasp_afsr = mcasp_afsx;
- |; V3 v5 N$ I+ L% S0 Gassign mcasp_aclkr = mcasp_aclkx;1 Y/ ?% r; D" V( R
assign mcasp_ahclkr = mcasp_ahclkx;; q$ x/ {2 N5 d2 _0 G
assign axr1 = axr0; % b& I3 d3 W% I! t$ ?/ S) ]/ `
+ @7 ?( z2 t4 |
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 , v% U9 q% A, n, a
static void McASPI2SConfigure(void)
( Z; I0 Z* {5 M7 L. f& Z{% R+ X% J. u) f; ?! O
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- q. M7 \0 m, l/ i8 wMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
9 ]8 A# t; U M( ~, {% A" G! D5 XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: @1 M) k, H) C# d/ ]' s& \, n/ A% k( nMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */" X- F6 q) B8 m' |
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 v3 ~7 N3 C9 V8 q' W$ PMCASP_RX_MODE_DMA);
0 g, V, r! E! r( _ QMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" E& Z5 R( k# yMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 \ h% U. [( \3 l& e+ G7 sMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 ?4 u+ `% |# w( s+ n: X. N2 ?
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' h% K. ] K" G3 J+ q' l% R( D. _
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 s2 T+ V+ V5 j3 W- X. M' { O1 y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */$ w. C( J) D) C6 ?
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; k' A: F3 a" a# D) _* EMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 g" y3 W+ C: uMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 z( j9 \$ G( V/ {4 y0x00, 0xFF); /* configure the clock for transmitter */) r& ~$ G8 H5 k S: e# r9 {6 l
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% A" T# | F$ FMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 H2 W# f* R- ~, V+ H
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 `# \% w1 y9 ]# b6 M, m
0x00, 0xFF);2 N# r5 l7 J: o) r! z' i2 b
$ g1 ~+ m: M1 R8 z
/* Enable synchronization of RX and TX sections */
) u ?, o' J) KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 d, T0 i0 s9 ?! |1 kMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 l# P; H* n3 P# ^4 Y1 SMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*/ h. v- S" g# m0 r
** Set the serializers, Currently only one serializer is set as# U/ w* X" ` ?, G0 G# V7 B
** transmitter and one serializer as receiver.
2 f* r7 } j" {) D. }*/
. l0 y! K% L5 B! B- R& z$ ]( rMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 D; h& x3 Y4 X; XMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) [, }( K* g, H9 K7 ~5 g** Configure the McASP pins
/ H8 s: N+ f3 P6 ~** Input - Frame Sync, Clock and Serializer Rx
: K' K- H3 ]/ P6 w" ~( Q+ Z# M** Output - Serializer Tx is connected to the input of the codec 1 B6 B {4 f3 f V) q/ ], i
*/0 L: R- u" `4 K& h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);& I; A! @+ h& d: p4 h
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! k5 X3 Q' f) G- w: s
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 K( y' p; @. _* I. H o$ || MCASP_PIN_ACLKX( a" o* u u- g. L, w% ]
| MCASP_PIN_AHCLKX
+ E2 I: M/ a6 b# Y+ w0 P| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */; s& r4 f* w2 ?- @
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 i6 `+ c2 j, K2 N$ C- R; b
| MCASP_TX_CLKFAIL
$ ^/ Y- C. ^# W4 N1 U% d| MCASP_TX_SYNCERROR+ h' E/ l; H n! `" O# f1 U" H
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( N5 V5 c& t; f
| MCASP_RX_CLKFAIL \; c7 z, S' W$ _. R2 h a
| MCASP_RX_SYNCERROR 7 ?/ o% V5 n/ C3 J" O2 L
| MCASP_RX_OVERRUN);
" h* p" h. B0 n- r7 |# `) o} static void I2SDataTxRxActivate(void)7 R: W Y- E$ f2 B
{- Q5 p6 N& Y( D) M
/* Start the clocks */2 |4 q4 D3 i- }. F% _5 M. R
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
\7 h" h) I+ h0 r1 V: t) d$ b E$ fMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 D6 }4 e) o8 F+ X& |3 Z; F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 [, y) m& D5 k1 e8 p; s2 _
EDMA3_TRIG_MODE_EVENT);
: B$ u/ F- `/ o+ g% t3 TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 @- S. g* O* c/ G, l+ F' i4 vEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* S( I. @, L- h! Z, Y+ x5 {6 `) IMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 H) o v. n8 p! ^
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) T$ n4 j) K- t: F! gwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
' A9 J! l* ?6 D) Q; F4 f0 ^- VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);; W T9 y7 y, ~# `4 I0 L/ U
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) a! {- D2 o! d% T" @' Z1 h} / \9 E: i( D' G# S( F) ~# ]
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. # L6 Z# y' J: ]# y6 \" {4 P/ W$ G/ c
|