|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
8 e& g* p; a. V( N w6 t1 K2 o* Vinput mcasp_ahclkx,5 T6 u; I- ~6 w& a0 \( ?
input mcasp_aclkx,* d8 y& h' V0 x! G
input axr0,( }; p8 A. p$ h1 t
! M4 {/ `( G# \0 y
output mcasp_afsr,
9 O# C h, B6 g/ k/ |- g* boutput mcasp_ahclkr,
: O& K( N6 M# f! {1 J1 }* boutput mcasp_aclkr,/ E$ Z8 s- w% t W8 E& ?
output axr1,, e, x! t" n! }3 X% o
assign mcasp_afsr = mcasp_afsx;
4 N. Q. b9 a) s8 k B* `assign mcasp_aclkr = mcasp_aclkx;. S. ~3 C: \1 h U' z# J. m
assign mcasp_ahclkr = mcasp_ahclkx;5 g/ [9 A6 [: v* D" }
assign axr1 = axr0; 3 q3 U4 r0 H6 O
9 `0 Y' T [! n( n* `: L" f6 ?6 y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 R4 Y1 }4 }( H- }- S. {2 astatic void McASPI2SConfigure(void)
' S$ K2 v- K$ J$ i{: E' k$ k/ y1 t7 e: Z2 [
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
% f* J0 N' {( a) S1 ?) ~McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 o; b4 ^4 b7 D+ }3 W4 S% uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. r0 Q) S* a9 K7 _" y! V
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! M) L: e1 N# ^, SMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& r X6 d! m: `6 B4 n0 y
MCASP_RX_MODE_DMA);
& M @( l, }; }( q" q4 WMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* M0 u5 a# N8 S/ Z1 TMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 `7 c9 X) f1 |& V8 q( z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 f6 }; S- T) Q. e* B) sMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 z$ x3 x5 @; y0 mMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & v$ m- A2 K) o, ?# j
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ \$ ]8 x3 G" {8 {
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
% ]: N! o; K! q, F4 n5 JMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. ~. i9 i1 B# X& c# y2 T% `McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 x1 u# X a. ?; X+ p- X
0x00, 0xFF); /* configure the clock for transmitter */' c* a" K7 T5 _# V, c1 h
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 u# B/ g" a; q+ v/ s% y' |- zMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
8 e4 D! m! h! h& f! O; mMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 V9 _2 D) C/ T& \6 _( c* U. H5 V
0x00, 0xFF);
" R$ r4 n; z/ U! Z2 V9 P" ~6 j& W/ I2 p& K" q
/* Enable synchronization of RX and TX sections */ 4 g5 L: K( D& z# X( b0 t( V
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; Z# r0 M9 V+ T& E9 _McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" {9 v2 W( v# CMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
3 b/ V0 f# V$ e$ w* t" z) s** Set the serializers, Currently only one serializer is set as
1 l! B0 g$ T1 t, ]* k: Z' e** transmitter and one serializer as receiver.
5 N& N/ r1 Z: a+ |4 ?0 @6 Y! ~*// k9 x* e9 O$ X" `- k2 v
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);4 s' h6 R1 u8 X: p) x
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
- S" v$ X- W, v- D# z$ Q** Configure the McASP pins
8 f6 E. a1 E, d** Input - Frame Sync, Clock and Serializer Rx
" f; c2 A) z( K** Output - Serializer Tx is connected to the input of the codec 3 B: U+ i* j: m4 ]7 _
*// f$ S# U2 C: I4 e
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; A9 C) ]5 b- E' d6 j) U6 F5 nMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: c+ j+ q* Z# V2 |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& ~$ _) i) a& k+ G& q. B" H
| MCASP_PIN_ACLKX& C: [" t6 p+ F% D
| MCASP_PIN_AHCLKX) B2 }- F* X; {* Z# s
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
) W6 Y4 `( d* D) A8 P, Z" H: _McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) E; x6 O" N" L5 d. w| MCASP_TX_CLKFAIL
/ s$ K. d- Z0 G! [0 F| MCASP_TX_SYNCERROR
) Y+ v1 c+ l) f2 ~4 X| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 C9 ]* G8 z+ a9 z| MCASP_RX_CLKFAIL
+ |$ H9 f. X! D4 E3 f3 u1 P| MCASP_RX_SYNCERROR
" d0 g4 J# |$ Y: `9 R| MCASP_RX_OVERRUN);% {1 h T _% j& j* u: P7 V `
} static void I2SDataTxRxActivate(void)
, h' h9 g* q5 M8 n2 i2 ?{
( A4 H0 m: m- c! k/* Start the clocks */
! i1 {! r4 j# L, C$ c, S3 F7 E, XMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 U- Y6 W: g6 N* |# Y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 K; u! o* U$ y+ R* VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% M/ [4 F b2 o1 x" @) d/ ~5 Q
EDMA3_TRIG_MODE_EVENT);
: Q8 e- B' }) n1 l4 Y5 UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - P7 k* b" x; W' |4 b
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */# |0 h. m$ z5 T0 r+ `4 Y; s3 P6 C9 M
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 z G/ l3 J6 A. GMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */' ?, Y/ k' c; K _. p6 }& F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */4 n' }4 \. s- J% E; i
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* f* k& ^2 x$ U% XMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);. ]2 Y# a% j9 k( N
}
6 h* s' p) p/ R2 u请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 2 t+ o5 I0 ] f
|