|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ ?% d! l: }7 o( }
input mcasp_ahclkx,- ~# S& @" q; }. q0 g. E; R
input mcasp_aclkx,
2 R2 ]* M) ~9 Oinput axr0,/ a, Y9 R% J; G) w
- j/ v8 p, s- @1 S6 C0 ?+ W- w
output mcasp_afsr,; P" |* |+ p( u2 k
output mcasp_ahclkr,
9 U. n4 t1 s5 R) e, \3 @; Houtput mcasp_aclkr,7 I8 _# D' W+ p: j) I
output axr1,
# e- ?/ P' ?4 _ assign mcasp_afsr = mcasp_afsx;
' W$ b0 p$ T2 N5 O# o2 K) zassign mcasp_aclkr = mcasp_aclkx;
+ }9 K4 U% M& l1 T' }, Z8 Zassign mcasp_ahclkr = mcasp_ahclkx;/ E$ [4 K, p6 G/ c1 X; n! k
assign axr1 = axr0;
* h' B' y/ v1 x( a6 K B' i' q4 }) k/ k- ~% Z) q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' {: C" s6 j1 B( M5 J% E; i$ C. I
static void McASPI2SConfigure(void)) A8 t4 g1 p$ |. j3 j8 Q# }! u" ~* \/ v$ ?
{( \8 b# n4 C& k6 F
McASPRxReset(SOC_MCASP_0_CTRL_REGS);6 X# f1 o; k, n- Q# Q3 a9 J
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 r1 w. x/ J6 T+ z: W/ |# X7 d: h# IMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( O; D8 ^$ G( ~; ?McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- R* @! W o i" [+ j: g
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) {* P6 N0 R% X# G
MCASP_RX_MODE_DMA);
; m7 K5 U# K7 K, j6 n. TMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( }# N. Z @, F) v# g; ~/ q% uMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' r( Q2 E' P9 N& Z- X1 d" k& T2 jMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, K8 q! H+ g* y* ~' E; L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* r2 X1 a, g' `4 `! Q
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 A8 [$ n0 e. D! M8 }
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver *// W- N$ ^+ @% }) n( p: n
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" V5 [2 `* F& W+ ]McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% |) V3 g! u6 P. I! y: gMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, x, |8 i( H. o' d4 F: m
0x00, 0xFF); /* configure the clock for transmitter */
" z$ ?* A% ^3 X5 [6 L. zMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 I6 Q5 ]: I+ w0 Y+ qMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 g H7 v# J$ T1 c, D$ O
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 y8 T& {9 w c$ r* ?' ?8 y1 a0x00, 0xFF);# Z( d8 H8 r% H# v9 a: A" e% o
% {" ^9 F4 ~8 p! ^0 `/* Enable synchronization of RX and TX sections */
- K: o& J( k) T, l1 ~6 [/ |McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 Q8 k# q# P6 O8 \2 |/ IMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); Z5 x2 z1 G2 N0 _1 S
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
0 w1 L( j* H, P6 ]** Set the serializers, Currently only one serializer is set as( n1 O8 p. Q! \$ ?/ S4 y
** transmitter and one serializer as receiver.
7 _1 q( E8 d- D! [4 } ~*/
7 L- u; P, C; b r% mMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 s0 k. x0 j2 n, Z3 ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ l% H( e$ ~" v% ?2 r! ^5 a** Configure the McASP pins
a% o4 |; U. |1 h( c** Input - Frame Sync, Clock and Serializer Rx* ]4 c/ f0 z9 j- z% g9 m5 Y5 D
** Output - Serializer Tx is connected to the input of the codec - ?" ?3 ?/ h2 F |; I1 x% [
*/4 t, h6 p; V9 E% t: R( t
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 ^1 v$ l2 @4 z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' U c- v. c5 B$ _! C
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 F4 C, k1 |# q# b" J! J| MCASP_PIN_ACLKX
4 Z' m+ d) l; X| MCASP_PIN_AHCLKX
) @3 p; j N4 I$ s% F' _1 t| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 f% y1 Y$ M' a' C
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , @5 f: l+ I* m8 ?- _9 R0 {( o
| MCASP_TX_CLKFAIL
$ ?7 s. U( ~" `/ w| MCASP_TX_SYNCERROR
' w( B3 M: ~% ]| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% @( { ]$ g0 Y0 m, I| MCASP_RX_CLKFAIL
5 y- V5 o5 [9 a0 s; @| MCASP_RX_SYNCERROR
4 `# `% Y+ V& q. |9 \. `| MCASP_RX_OVERRUN);
* V! S5 p- b$ W} static void I2SDataTxRxActivate(void)
. z0 R+ W; Z/ i- m! e: Z{
# Z: Z. x2 f1 N' {8 S/* Start the clocks */
* `; c% t' G5 b0 J- G3 g0 B+ }McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" M. E c- W1 v- Y! FMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
1 O4 ]) k/ {" O. T- UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) E* \" _$ U3 |/ L L- e% S, FEDMA3_TRIG_MODE_EVENT);
$ ^/ ]2 T' g7 ^% J# X8 ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) e, U- B! }& i
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */2 r1 h' N7 T" H" P
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);+ A" m2 U: i: g4 Y3 b
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 N- J' h: p3 H4 L0 ^, ~" [) x3 Nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
' l5 a3 V2 D7 S) a1 Z& b( q& @McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 X: k+ }/ p/ G6 u9 u4 T8 s# yMcASPTxEnable(SOC_MCASP_0_CTRL_REGS); `# {! Z. d8 ?
}
/ W# k7 u& o8 C9 u* `7 m请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' q* F1 n* Q( R2 H |