|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," e) Z( ~5 o7 _6 z. Z
input mcasp_ahclkx,
7 r6 F0 G; M% Zinput mcasp_aclkx,
- Y7 u! B `# o, Cinput axr0,8 }5 Q/ D8 I" W9 }* }1 D
, t/ e2 |) K3 p
output mcasp_afsr,- p2 L% }4 V: F+ f+ [
output mcasp_ahclkr,+ p3 t2 m2 s. F. O1 a' k0 k7 u9 B
output mcasp_aclkr,
/ i+ a# Z7 T1 D5 L# doutput axr1,5 U5 y" a# N* B1 ~5 f7 R$ V2 v
assign mcasp_afsr = mcasp_afsx;
" Z' t4 w1 p# R C2 x6 C# X3 K, oassign mcasp_aclkr = mcasp_aclkx;
3 A2 S# E8 F5 \4 k& K# rassign mcasp_ahclkr = mcasp_ahclkx;5 a4 w; n% O$ D
assign axr1 = axr0;
. d- }: Z/ i, z% d
8 B- M3 g' G! ?) A在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
' ^; {8 Y# J1 R$ S+ Sstatic void McASPI2SConfigure(void)
1 p2 H! p' N. s2 N9 a{
9 S- `3 ^% @3 k8 ~& E& F( K0 e6 g- xMcASPRxReset(SOC_MCASP_0_CTRL_REGS);9 ~' b4 _% V& p+ J
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 i' O& U1 t8 u4 A
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- |' z) x1 t S3 Q m+ ~
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */, D2 O( G* \* @0 o# y1 g. @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* X6 S: N# M9 H8 Z+ e' c$ d
MCASP_RX_MODE_DMA);
5 i1 A) U7 Z6 V! `6 zMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% P7 }7 Q3 ^+ X% ?% v4 `! Y+ ]MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% M$ q8 O. m6 k9 FMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ n1 P% y8 Y" }# m# CMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
|4 ]; V j% `3 |4 TMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- O- O3 ^# N! B7 O: O# _+ u) ]MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 i/ \ i" o( V4 K
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ W5 z& U6 `: T( W/ C
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); F" N3 X) ?% a: L3 L5 Y8 x, l
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) n [% K! T9 ~' }( _3 E# u) r0x00, 0xFF); /* configure the clock for transmitter */
/ g9 l' Y0 \; B* cMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* t% u+ I6 y$ u' f6 z8 V
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 a% C% |! W# O/ h5 W7 M: AMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 W8 q4 e) j% q) }, C1 S
0x00, 0xFF);
4 F% t; w+ N7 \# T/ D% h1 e9 a* T3 m2 p) c) g6 x! G+ J/ P1 Z+ M, D6 u
/* Enable synchronization of RX and TX sections */ + r, y0 Z5 S: j
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; L& N% {2 Z+ H4 Y; Y" _) h4 r! ^
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 m+ c) q1 o0 e" [4 f) [
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*! V) E! _9 O0 |) n
** Set the serializers, Currently only one serializer is set as
( m4 X2 P0 |# `) `** transmitter and one serializer as receiver.. `" ~" ]' f7 u4 R! R7 E
*// f P7 [, m2 ]$ E) h) }
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% b6 ^9 ` B6 x: l G+ B* |, tMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 V2 }7 k( n$ h** Configure the McASP pins 1 P0 p, D* P$ }# X0 Z; i
** Input - Frame Sync, Clock and Serializer Rx/ P) b5 S& Q6 m5 C/ S$ S
** Output - Serializer Tx is connected to the input of the codec
# q- N5 K+ p; u*/" J1 z* M- B' I6 S* U+ [# W3 f! t
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 w- b: v: y; }* V3 V
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 R' b7 g7 i9 z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% m" c2 v1 C) r
| MCASP_PIN_ACLKX
8 h" |4 }6 {* Q M| MCASP_PIN_AHCLKX2 b* z( X2 U- ]
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
3 v) V! ], m h2 K* Z$ {McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 O. ^! c$ Q2 W& o
| MCASP_TX_CLKFAIL
* [2 m7 _9 e8 E# G% A9 s1 N- x# p| MCASP_TX_SYNCERROR/ u- g& x& i+ H0 Z+ r! V8 t' @ m3 @
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; a. H$ d5 ^8 J6 d& H' n
| MCASP_RX_CLKFAIL
. I. l5 v/ U4 G| MCASP_RX_SYNCERROR
4 i: l$ B3 V% X& [8 V$ ]) L| MCASP_RX_OVERRUN);
4 D" O/ O6 }! Y' a} static void I2SDataTxRxActivate(void): w/ m+ @5 T8 [* c* m
{' k) u* D% y, G& ~. {* Q( {
/* Start the clocks */
; S$ Z0 k1 V, l. J4 n' O. NMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 {+ U. N: a# L2 C( rMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
6 b9 M o6 J- i$ \' p& QEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, q1 `5 j7 q. B0 i; T" K
EDMA3_TRIG_MODE_EVENT);, M. N: X8 e( |- l, Z# v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / T& N: w E6 }7 C
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 _! h0 M7 m7 P" B+ u1 F9 B9 B( hMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ y0 V: p% F( ^4 [) HMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero *// b) B$ O- c* Y8 _% o, D' `' H
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; L, w% _' v' l# C# i8 l* {
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. l6 G. N5 e( g6 d- W9 f
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
^ x& |4 S1 S6 A: O}
3 r& }* Z1 R, `# g* w/ B请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 3 T; t+ B( E, T% s; S# n
|