|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 g8 t( \/ T. W$ Y8 y# T% o
input mcasp_ahclkx,
% y' I) j. n& |0 pinput mcasp_aclkx,
D, M! ~& B Y3 n }& F7 winput axr0,/ f \2 q/ p3 ?- \, U
+ h' `+ F! I; ` z. i# houtput mcasp_afsr,
8 _* G I& o7 b2 H2 S) l; ioutput mcasp_ahclkr,0 H' `# ~4 j) U* J- A! Y) ?
output mcasp_aclkr,
/ X+ E/ ]/ ~" @! U; m! K# |# \% joutput axr1,
4 e7 f5 o* }& j1 R' H! E6 o+ m( @ assign mcasp_afsr = mcasp_afsx;4 e) S( H' ^$ [, Z. P3 w4 X. m
assign mcasp_aclkr = mcasp_aclkx;% t6 ?; m3 R+ W* ~- Z
assign mcasp_ahclkr = mcasp_ahclkx;8 F' I) M/ l9 E1 Z
assign axr1 = axr0; : \1 I) D. k, Y
$ M6 O3 C J" l* H9 K! I! c在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 0 [ T7 P5 Q6 Z9 j; X' f. l3 U
static void McASPI2SConfigure(void)
; U7 b& \+ G8 f# B2 o5 G. E{: X/ L* x1 k. x* j
McASPRxReset(SOC_MCASP_0_CTRL_REGS);# \4 A9 I0 y6 \; h) l
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
$ _3 v" f1 B: DMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- [, A! ?) Y) h4 Q3 C; ^McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) O0 t5 j2 V6 [ h1 J1 g8 g+ y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, `' \# n! L& t+ Q$ L3 S: P, G2 U( M
MCASP_RX_MODE_DMA);
( n( i% T+ q6 Y+ yMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; ^5 C O9 x! p7 }' b
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: Y1 C: x/ p: ~) V, i5 AMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ A- Y: l7 M8 {* W) ]7 z ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" r% H9 \3 D& t1 v
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 R; X% k0 X0 E8 f, vMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
* f" } g8 v3 yMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 a' X9 H+ y; o0 y. ~( D
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 j/ b7 I7 e c* KMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: q& [1 ^" ^9 k% h# _0x00, 0xFF); /* configure the clock for transmitter */0 t) D8 v {9 v1 f
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& x+ A, O8 K5 h9 D9 ?. Y7 f
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) T+ }$ a: ^6 X" @
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 b& n+ I+ ~- w& K/ h D
0x00, 0xFF);
) R) N9 N' i, `! @; l. T8 h9 E8 {, F' S' I/ f6 Z$ K
/* Enable synchronization of RX and TX sections */ ' V+ h2 w2 a) f8 |4 D# L
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; l* {, N# P. r5 w: JMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# d3 ?2 z y. D# k# g+ _- S3 V7 j; u
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
4 v& V8 Q3 R4 [! v** Set the serializers, Currently only one serializer is set as
; r9 Z: A( f; T- t9 i** transmitter and one serializer as receiver.( c: T5 e' ^; u7 ~8 Y
*/
$ B3 Z0 E5 P3 ^( w; G [8 `McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 p0 _, p1 |) o1 R
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*' }( J) n# ?, Z Q+ R% a' [
** Configure the McASP pins 0 k, b& x9 D* l2 N
** Input - Frame Sync, Clock and Serializer Rx
8 n; G$ z; m1 \5 {1 y8 E. e' ?** Output - Serializer Tx is connected to the input of the codec
, s' ^: c7 Q+ \0 M, o*/, S: O/ C: ?( Y6 ~# P7 [
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- |7 H* ^, F5 v. N" Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
/ C; U5 Q# J; e ^' U. CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 k- y, ]9 o# F& N& x
| MCASP_PIN_ACLKX
* q) z' j( r, I2 E! _" O| MCASP_PIN_AHCLKX3 `/ t/ Z% B" P7 {5 ~
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */( [2 R7 r+ P3 r8 p$ i
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- A! K' \ f6 W1 @ v! A2 \* q+ \7 O| MCASP_TX_CLKFAIL , c) x+ S% b; K/ C* [& r- S* D
| MCASP_TX_SYNCERROR
- t5 [1 t5 a! V I| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
4 ?3 n* e/ v2 Y: f- h! K; w| MCASP_RX_CLKFAIL3 a9 h9 X. Y; v! y+ b3 I j, U3 Q
| MCASP_RX_SYNCERROR
; t+ `7 x- ~! |! A% m' t| MCASP_RX_OVERRUN);
. ?* h4 l4 K3 ?" e} static void I2SDataTxRxActivate(void)
; N8 q( _- z1 f8 B9 y V, ]{
' x, l% V9 ~: h! S0 S/* Start the clocks */1 B9 ^' K5 y3 k# m# c7 B" T; e
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);4 L, R- X0 R2 l( K/ z" b4 P7 Y( a% B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// [7 W9 I6 n6 F' [9 O4 x( R
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- d" k+ c, x0 E4 }" _, T0 i. {EDMA3_TRIG_MODE_EVENT);6 `# v7 p# V) j+ W" ^2 ]( \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 X% A( ~" t6 \
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */* c0 T2 E: a# W1 O) D9 V, s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 B. i- I$ h, n1 u
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */. W# s1 j- x# @4 Z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
+ ~4 N0 D4 \, [ Q' eMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
7 B5 O/ ?1 s( b# t6 |McASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 C) L' y, N$ c
}
# N( N: e0 W: E5 a+ {请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ t8 [& }; v5 A' F7 k; S |