|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
4 A. U& U) o v- ~input mcasp_ahclkx,: \% R9 u* k( w2 S" H
input mcasp_aclkx,' j: D( D( K5 K
input axr0,* V4 q% J4 g- C D! b
4 P5 ~/ O' T4 _0 f0 i
output mcasp_afsr,
' `% U. _ J9 U2 Y$ k2 m0 v! O6 toutput mcasp_ahclkr,' E8 @+ B1 m5 ^2 n- v
output mcasp_aclkr,5 y0 p; Y9 }" [, _( a& v& m- Z, w. O
output axr1,
1 H8 ~3 \- E2 O O. w assign mcasp_afsr = mcasp_afsx;
; K6 q9 g# v9 E4 `2 c' ~assign mcasp_aclkr = mcasp_aclkx;
9 l9 w/ J' f. w7 E8 _, g# Nassign mcasp_ahclkr = mcasp_ahclkx;
/ v* |8 P. C9 v/ b1 ^6 x/ massign axr1 = axr0;
& h( d! T' a( S- D5 f t* n( b9 O$ h
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 . P, k" a$ o& C
static void McASPI2SConfigure(void)
% q/ {: d* i" _2 u* t7 j% o; x{
) q6 ]3 I5 ]# K- W1 c% X/ M" b# |McASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 }1 q9 p$ W7 v4 z5 T( MMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ s+ a# y+ ^7 U* A/ h' s
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' ~" x I" A" W) o' i$ p
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
0 b: y/ |9 D/ C/ k- b% nMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& y6 I( q8 B3 c! l& F6 u* U
MCASP_RX_MODE_DMA);0 I2 F. @ j( b( }' `
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 a3 Y: E5 S8 A, X1 @
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- ?1 Z d! z0 M% K
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" k p: W% @) P# s, |MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 B# S# R* o7 X' b& |
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + {0 ~% p/ }6 K$ s
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
" z2 _ l; s6 w# rMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" Q4 ^( X' x0 P0 x, D, SMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' y# z( E) K! c& h! ]
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! u1 q3 Q: r. c5 S4 _, _0x00, 0xFF); /* configure the clock for transmitter */
. }8 ^1 ]2 E8 f! }# w# TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 a6 |& ^5 P6 q9 d% f
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - `, J. {+ w, a; Z- |
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 c9 r, n% ]7 H
0x00, 0xFF);8 O! D3 j* {9 z/ M
$ J& u( {9 e; k6 o2 Z/* Enable synchronization of RX and TX sections */
0 f3 \4 }% y. Q! _3 k$ z) f# d6 }+ pMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */7 E5 U7 d+ \1 o* P7 J$ }
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 c5 I; R: o0 {! G/ Q: W" P5 i' B
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
; B+ j% w f% Y4 T) {** Set the serializers, Currently only one serializer is set as- W* a, i/ ?" l0 d& Z( c* T- p
** transmitter and one serializer as receiver.. h: K9 I6 L+ \# s- ~( l3 f. C/ ]( M
*/% u9 u0 U0 e# O
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" X) E6 @0 D/ S$ |$ n* F' P
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* a" f! ^. m: a+ `" x) B** Configure the McASP pins
& t: p0 d9 l0 r5 P** Input - Frame Sync, Clock and Serializer Rx5 U# }% a* `7 e; V- [$ x6 {
** Output - Serializer Tx is connected to the input of the codec , {% t, j+ d5 W- E3 S( J" F% r2 _
*/: c: K D! k- z' S' m$ b% R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);2 I0 N# y) z/ a! |1 U, l
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));0 i+ l; X* R" y, H" y& e* m F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ }, D. i# f# F0 w9 U+ n| MCASP_PIN_ACLKX
8 X+ ~" x+ @% F" u% J% I| MCASP_PIN_AHCLKX0 Y0 e4 ~! b' r
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
' o0 T" B6 B) G% U2 vMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR v) J2 o! M# ?& N
| MCASP_TX_CLKFAIL
6 m" W/ ~5 n0 b2 ^| MCASP_TX_SYNCERROR
2 _1 b6 Y5 g( p0 e1 Q% [ b| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" h6 H8 o1 ^1 E/ X# x| MCASP_RX_CLKFAIL
! ?7 L7 m0 K- Q8 r" g; O| MCASP_RX_SYNCERROR 7 o* f6 H4 B2 k- x5 q* H
| MCASP_RX_OVERRUN);& P6 k% ]: s) N. e
} static void I2SDataTxRxActivate(void)! r) i) c, J# ]- L# l- w
{5 B" l# l( q. W
/* Start the clocks */
, f" z4 Y# Q; ^McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, N' w8 I: u, U6 `, \McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 T& ?0 D7 w% e
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) s3 h# P3 d" x# j- MEDMA3_TRIG_MODE_EVENT);
" p2 T% a6 O! M/ b. h, z, ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
" p' m0 S+ o+ w2 d8 Y7 W( } SEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
) x' j' R$ J) @! O3 w- PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 j9 u) T' i* x
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
7 n. H. W, D( g; Gwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
7 }( S$ R) X- w9 A bMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. @' F# m3 Q* O0 mMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 N/ B- r: c8 d} ; S# H& s5 }, U2 Q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 _1 w. ^: F4 a |