|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 Z7 e2 b7 F3 W5 O q+ K! o) m3 |9 T& yinput mcasp_ahclkx,2 u1 R" w- W# A2 }
input mcasp_aclkx,
- j+ |6 O$ I' u9 t3 z& ?input axr0,. X1 p* ~" l5 s, v6 Q$ ?2 f7 P
- C' _( |9 ^3 o/ S, Youtput mcasp_afsr,, A) C- d/ ]9 u9 t0 b% }
output mcasp_ahclkr,
- T. I, q( T: O! U% M, L' x+ R8 Uoutput mcasp_aclkr,
0 t0 [$ R& b5 r; c8 xoutput axr1,
0 R# ]1 _7 f" _" K; m assign mcasp_afsr = mcasp_afsx;; [; }4 j+ k* ?+ v% n
assign mcasp_aclkr = mcasp_aclkx;
* ^1 f1 Y8 J. M- h1 S! x( xassign mcasp_ahclkr = mcasp_ahclkx;; B- I9 p4 J+ K, Q) D
assign axr1 = axr0;
/ f6 k* ]$ l( |2 [# {' j I( ~/ i1 u
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 5 C4 H* z# ?6 m6 e' H
static void McASPI2SConfigure(void)8 g0 ^% b+ J: N, P1 n
{
! E# g; i$ `9 ^" b+ V* [2 D$ u2 lMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ t: `! e+ x0 d. j2 n! B8 IMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. e8 T: F; S) Q8 F6 L6 M
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- a' }: A1 d7 m; O
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */% l) U. B- g/ N2 @+ R
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! ^1 o1 D+ e) z1 W; ^3 _0 pMCASP_RX_MODE_DMA);
5 j) D0 s' x$ i0 yMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& ]) T- Q" L5 T0 T! ~( y" fMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 Y- R) T/ ~4 q# C" a9 f
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! _6 E: Y W) I ?6 YMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& o- x& i/ @0 s& X0 ]) f& E
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . H5 d ~$ }& L8 f- O, z( V: M. Z# M
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
6 k& D8 S( J5 j) Y) W8 jMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
$ T% n6 q, d% E; q6 `8 oMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& J4 `# p' ]# kMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; a/ u1 _9 {( R0x00, 0xFF); /* configure the clock for transmitter */
. `) t n& D, Y) v& D7 t8 FMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); Y7 |: _% |( n/ B' q' J
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - I) \2 O, l: Q; \7 s
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," f2 z. @* K8 q+ y3 L, `- W7 \
0x00, 0xFF);
& [6 d' \8 e& J" f8 g0 ?
% Y; `1 D; H2 J! Q& J: L+ _& ?5 c/* Enable synchronization of RX and TX sections */ 9 y l% x9 f9 o0 d+ s% y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
- j( ?) }. R; J& r( I! n% @: v2 ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ n8 W q8 L3 d' r- f5 t
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*! C j# ~# n1 }+ c) A: ?* o& k
** Set the serializers, Currently only one serializer is set as0 K% h* g0 U8 L9 X+ n) Z
** transmitter and one serializer as receiver.
6 E" p1 |8 Y4 A, M& |! S; |*/# A- l% B1 Z( J; w; C
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: [* A1 ?" j8 Z! n: R3 C, d" U4 WMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# ^+ U- n$ z* }: i** Configure the McASP pins ; g, S& C& [! A1 _: w
** Input - Frame Sync, Clock and Serializer Rx
/ v4 K. K2 N( X# g2 l) `! O J** Output - Serializer Tx is connected to the input of the codec 0 C4 t N1 ]" Z' u
*/9 b2 D+ Y! O( Z+ z7 h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) v6 _: V( E& T" k! U% G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ a# {2 J( [: L( ?3 g& q( q! VMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 z1 }8 K) | f* H; b1 K| MCASP_PIN_ACLKX
5 O9 Q( I1 `0 L- r% F+ ~5 F| MCASP_PIN_AHCLKX' `( S$ x- ~* B( Y5 w3 X9 K
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// {4 N; X$ F$ u9 C, X
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
/ W. D: Q* W1 }1 N0 M& q) t| MCASP_TX_CLKFAIL
9 u" D4 _' q8 T8 b| MCASP_TX_SYNCERROR8 K6 V6 V8 i& `$ ]" V2 q
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ l- O( \: F/ X4 Q6 ?' _: P| MCASP_RX_CLKFAIL
. Q v) {" J# @' t| MCASP_RX_SYNCERROR
* _; J) Y; k. K# r| MCASP_RX_OVERRUN);8 G0 V! r4 _; K# m) L8 z
} static void I2SDataTxRxActivate(void)
" c z& x' D) p1 s8 {( R8 X{
. `- L% T. |6 e k! V- q/* Start the clocks */5 c- B% Y6 U4 F6 D
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. p) S5 p9 j4 BMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// ^+ m1 a: U, t0 h+ a; F1 }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. S2 l( t0 T, w+ ?- Y
EDMA3_TRIG_MODE_EVENT);+ Z8 I. L3 m3 r- e# m* {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
|8 H: i' K, J; b) G- V9 qEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
]: i$ I! S/ x) RMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);: ~1 y5 I U9 S: _ h0 J
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */3 N7 j4 c" W4 M0 P E
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */0 k+ u9 ]+ |: q5 V. @
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' _$ ^% q1 O" i# V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 ?) \* ^+ x2 f$ Y7 M; N" a} 3 |. m% N. {. K
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, }: _. U( h0 g C) T0 c' c |