|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,0 N& \ [9 P( N7 f. i! h' C+ ~
input mcasp_ahclkx,
/ L+ n0 A* I6 I1 j+ V+ r; qinput mcasp_aclkx,
/ W1 b/ h( h2 S) |input axr0,9 M7 j# k" z, U
4 Z) Y0 o+ q- s/ _% n- g
output mcasp_afsr,4 L/ b. C* ?/ K
output mcasp_ahclkr," ]6 l% l( t; D6 n3 P, }
output mcasp_aclkr,
* @3 O- v" @, F3 M0 ioutput axr1,
4 p8 S* e3 w) u. W& |, S assign mcasp_afsr = mcasp_afsx;, _ X, i; i" |% A$ Q8 t* {: `
assign mcasp_aclkr = mcasp_aclkx;, b! r; ]/ [# P
assign mcasp_ahclkr = mcasp_ahclkx;6 g( ?, w {* F$ R7 {& h* u
assign axr1 = axr0; + e8 ^ X/ ]' M/ [
: n- e0 t) [# Z; r( z在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 , C) o; {4 m& E; ?4 U
static void McASPI2SConfigure(void)
$ v% T- a$ G2 a. j+ n. z{5 b: ~+ @ N9 [: z$ g+ l
McASPRxReset(SOC_MCASP_0_CTRL_REGS);3 V0 v: k& t0 q& Z/ c& b4 _" N7 N
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
. P0 m, r( O/ E- ~McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* z( T4 q' k3 m, q9 GMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */3 I6 L( b9 L! B$ j& T6 A
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 ]; d. T7 ]4 Q9 s# G
MCASP_RX_MODE_DMA);, b. C8 g, E, i
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. ]1 B: ^7 P+ \4 y/ O0 iMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
H' a1 T/ N) }4 j+ h% rMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" \8 X7 l9 n4 ?+ k/ DMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! @- i9 _/ o+ b4 _: T
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 b/ b' X- L Y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
$ i+ E2 a+ X$ P% |2 ?McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ Z5 h9 s3 O+ ]4 m pMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) l+ @* U1 T. U- x
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: ?1 i% b; Y5 i( w1 x; g5 S
0x00, 0xFF); /* configure the clock for transmitter */
, j4 H* `0 a0 Q. gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! ]2 c: A) Y4 @; g
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 p% u* G+ f* z9 s7 e
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; q f2 V2 I1 r8 s0x00, 0xFF);
) V; G( y5 a4 \0 |# {
' W9 L) c0 l! U4 x0 b/* Enable synchronization of RX and TX sections */ ! A X9 C. ^* z9 u6 H. C
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */# y# P% e; E* ]9 ?# R
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
I" n+ a9 W& q3 Q9 s8 Y9 sMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
/ U2 J2 }$ h3 ~% T( A** Set the serializers, Currently only one serializer is set as
! |3 l, `' q9 x8 l** transmitter and one serializer as receiver.6 W% z/ V+ F2 e, N# Z) x. Q
*/# i( q x' |9 ~5 s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& \ |& R1 v, B" N& x s+ XMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*+ i C" {3 V- s- z/ f. N
** Configure the McASP pins 2 G% k# \1 ]+ B. f- P
** Input - Frame Sync, Clock and Serializer Rx) s. ^" b- J1 ]
** Output - Serializer Tx is connected to the input of the codec
3 W* d u' O1 t*/
/ ^6 Q2 ]; r1 }# aMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 y1 k4 A) x1 ~' W A
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
" t* \: u# e [' _" b# [/ ?0 ~8 xMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( H! P8 `- S( h6 B1 G# t
| MCASP_PIN_ACLKX
) k& g4 j5 s- B5 k9 E| MCASP_PIN_AHCLKX
. c. l+ l- {! s: _& y# V% s| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 ?% h! V0 |4 ]9 ~+ i- ~0 M2 V. XMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 1 B2 s9 \+ k" L
| MCASP_TX_CLKFAIL 3 C8 m4 I# n, q' s
| MCASP_TX_SYNCERROR! i A; A; U4 p: J/ w$ V
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : \0 E# `% U3 o7 r h
| MCASP_RX_CLKFAIL p3 W3 w6 b1 s( e# \/ C/ w
| MCASP_RX_SYNCERROR 9 B2 P7 O4 a% n. w# H
| MCASP_RX_OVERRUN);- u3 I* T* y- l+ Q8 H+ `
} static void I2SDataTxRxActivate(void)
$ b. q" t9 d6 G2 [) m{5 W M# b9 Y6 m x4 A
/* Start the clocks */
& W% v+ l, U9 r! {2 m4 \7 QMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 W" u% g* O) HMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
: O) I0 x: a7 x: P4 S8 `/ LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,* u; L* P# [; M8 q0 B% F
EDMA3_TRIG_MODE_EVENT);: Q3 M8 P& Z) O" X6 C
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " E- U: Q1 N' m: K+ y; \$ V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; i2 }$ T8 a$ ^$ kMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 a+ ^3 q8 }: ^2 n4 [
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */2 u2 M) Z A- a+ ?1 ~6 |
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */% K' M2 Z$ U& t! h5 K7 S
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 L5 T+ `7 A2 ` JMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);. e+ H7 [( `4 v# Y+ `1 f( [5 @
}
: q/ w' y- j7 k1 b5 g9 l2 ^/ N" B+ M请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. * T$ Z2 j. C0 P; W8 n
|