|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
* a( c' h: l3 _# oinput mcasp_ahclkx,
# N( e$ @ o1 G" Tinput mcasp_aclkx,
. a. \ \) c# g) h C) cinput axr0,
a7 e; b0 Z8 o d# h1 W7 E
$ {6 H" q# v& {3 b) ^, V2 {output mcasp_afsr,
! a+ t/ f9 g& O9 I- `3 Woutput mcasp_ahclkr,
2 g% s! P& v9 R- w0 Boutput mcasp_aclkr,
$ k8 W. f& _& U8 V+ x3 moutput axr1,& k' j' v" t. |# T- d$ P9 E
assign mcasp_afsr = mcasp_afsx;: ~- H+ H; v& r0 v# G2 [1 u
assign mcasp_aclkr = mcasp_aclkx;
. b/ c" ?; M* H1 ^2 t' wassign mcasp_ahclkr = mcasp_ahclkx;
9 j! T' A! F8 B5 v) B9 [assign axr1 = axr0; & B2 p8 B- g. x- W U
0 r" i1 V" a+ U3 S1 S
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 C9 e) b- V" b) H' A y" cstatic void McASPI2SConfigure(void)
0 Q$ P1 g, S }7 W2 j; @{
3 N. h4 O" J4 ?+ H X; v! P4 @# z2 K$ [McASPRxReset(SOC_MCASP_0_CTRL_REGS);* w* G% C# }+ S' e
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
# R7 z# O( w3 S% qMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 Q A, j C- H! vMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */, U7 w! a$ i+ d, J
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( m7 w& U$ h' r) Q' m UMCASP_RX_MODE_DMA);
# s* o) b |- `7 J2 cMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' F+ I) {/ L. X3 vMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 l+ L; ?' _0 t
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; a6 ]3 z, o, R) {% nMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% y" i. _, g5 C4 h- l6 H* cMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ {! A6 X+ v; I# ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
1 ^' ?7 `: H% s2 V2 s; b9 TMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 k+ P2 I4 ~; `1 J# s5 }3 W1 n
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
0 w1 J. H: g1 w' ~. Z: j* x% rMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( K; b: w: c7 o, K6 d2 A
0x00, 0xFF); /* configure the clock for transmitter */0 p% L; W `* q0 a9 k# _
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ C/ r! v$ Q7 d$ N1 _: A
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& B0 V" q* y7 l' o3 V9 C3 UMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 }) H1 z7 @8 r
0x00, 0xFF);. M4 _' \( M$ k1 j2 H
c$ [( X/ I1 x: v3 K/* Enable synchronization of RX and TX sections */ 6 [# L7 m/ C1 K+ a, A! S% c' O
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
! ^6 k: s; Q- K/ b5 zMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 t0 I; h3 Q' @5 l4 h. \2 I/ ~6 N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*# c. {) u( e) X* g$ q. U) v. @
** Set the serializers, Currently only one serializer is set as! {. J# ?1 r4 \; b
** transmitter and one serializer as receiver./ [0 j. N7 q: J" y4 k
*/- Y, |" D. V) e5 t, x
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) b$ t% v0 g' v) Q+ C O: G
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*- I+ k2 u" ?5 y6 [' d- v! T' ]
** Configure the McASP pins 5 V$ ~( Q" C; e
** Input - Frame Sync, Clock and Serializer Rx
0 j5 \+ s1 E7 ^8 s( R$ p** Output - Serializer Tx is connected to the input of the codec # i4 N7 Q( K( D K5 C$ z A( C2 x
*/
3 ^% J" O4 p/ M. v6 p% g, |McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- x6 J1 D0 e F8 J2 _1 u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 a3 n" _" Z% {- {# a; w
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ k+ n" q* h7 b
| MCASP_PIN_ACLKX, [8 r) R; k5 b' i P, l
| MCASP_PIN_AHCLKX
4 R/ M# P! _; f( ?| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
' K [4 T) z4 e0 L1 OMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' W' C2 [: }: U; M6 b
| MCASP_TX_CLKFAIL
8 B* e) ~, _6 O( U+ I2 y7 |- q0 G3 S| MCASP_TX_SYNCERROR
+ {4 n9 L& [( ?. \( D| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 W- V4 |- {% z {2 I6 r* |
| MCASP_RX_CLKFAIL9 S. y4 H6 a2 H9 f" {: n
| MCASP_RX_SYNCERROR
! l' x- ^+ j5 i+ T| MCASP_RX_OVERRUN);7 a0 H0 k* I' x5 ^
} static void I2SDataTxRxActivate(void)
) @) M6 `+ ]2 j# t- i7 |4 j7 z{
% |- u0 D0 H& I8 T; }9 T2 }/* Start the clocks */
; E5 D7 }! Z) M4 BMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 }' w1 B! C" uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 e" s& L; Y, A; f# b; E6 UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ b2 g0 o4 f4 ?9 B; I- N
EDMA3_TRIG_MODE_EVENT);
( k# |# N P$ M- f5 y$ w- lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
9 W' T. ^6 ?2 t2 H0 bEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 _" L/ i% G% T" y1 s& r' d5 H9 rMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ s3 v" R8 z+ GMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 U' a6 S8 s4 qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
' R ?) \5 d+ k& B! OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 M7 L, t) E: z2 ^6 `# F! B" U
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. ?4 X1 F2 o+ N
}
8 T; m8 @) b F* d7 z请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& {. W% ~5 F& t, K, R. V |