|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
; x% B# ~: i7 Q6 C% L) finput mcasp_ahclkx,% ? w! r( ^- I; R$ P) F1 d
input mcasp_aclkx,
1 [1 V7 B" I# n" X$ }) x. zinput axr0,3 ?% a8 [4 [' l8 N# A
) I! m% c- h8 O8 Zoutput mcasp_afsr,, s" X. m4 G& Q# T0 N; y
output mcasp_ahclkr,
5 h) x( Y5 E5 Q! Voutput mcasp_aclkr,
- b# Q; h% _: J' V3 B* m! i5 \! doutput axr1,
# _. E" J3 L+ `) F assign mcasp_afsr = mcasp_afsx;
0 F2 d' Q/ k) u* Aassign mcasp_aclkr = mcasp_aclkx;# V( @$ d1 d! `6 N5 G9 l
assign mcasp_ahclkr = mcasp_ahclkx;
, W- H# w" e/ A) }5 f. q; Dassign axr1 = axr0;
+ M# [- Q8 Y, w) }& F$ ~' m
. V1 U ?% C0 V3 d! D& }% X在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
4 _ Y' F5 C6 k0 |" H. i& x+ Zstatic void McASPI2SConfigure(void)
- ?" j u; g' ^& u7 ~{; @: }! E7 a; r9 ^- ]
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
& `' d8 R: B/ rMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. ^& A) B+ t1 w" V) z; h0 Y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 P; P+ H& H4 w/ Q: w9 U/ R0 }+ h0 ZMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */5 ^+ ~3 P8 {8 p6 A1 k/ s
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. {1 t$ g: R" r2 [. }MCASP_RX_MODE_DMA);9 I0 f R# C; i' H5 J$ T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% R7 z$ e" x9 oMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 c$ S, A% j1 }9 d% c- r$ QMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' N0 k5 C7 U' i% [; L% Z$ T) _- QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
9 s9 K. x( Q( @7 D$ c' P' y M- O# `McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % l6 }) I8 [4 z# ?1 \6 @' `
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; H7 U0 A7 R6 x( j. HMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& W. G: V; U# Z1 |! T
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 t; c8 D0 S) C0 vMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ R, [1 P& D0 ? u5 E5 R+ z1 L
0x00, 0xFF); /* configure the clock for transmitter */# a8 \" r, i- |$ O. g( ^
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, i( Z3 H, U; n0 ]
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" _- Q4 K( J- S' M, MMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 o' x6 @' m+ w& e6 p$ k( J0x00, 0xFF);: R- }( I9 D% z2 T9 q* J0 T
1 s9 W l! }7 r0 H/* Enable synchronization of RX and TX sections */
- m" Z! h8 |- {5 R7 V D/ s- X$ BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; _* F% B5 F8 X% a, W1 jMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' z& H. b5 c4 ]2 v
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
: |# I7 d m, r** Set the serializers, Currently only one serializer is set as* d9 t) F, y8 u
** transmitter and one serializer as receiver.: E- Q; s; d! u* H. W6 B3 s
*/
8 B0 b+ c/ h- d/ K3 ^4 h; g+ LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& j, ~; a" g5 Z1 ]
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*% u& X& A$ x3 l8 ^) ^8 ~
** Configure the McASP pins
$ d- H, I4 S* e' b' j& U+ n3 a" Q** Input - Frame Sync, Clock and Serializer Rx
" t& c, @) e2 l9 V9 E- n** Output - Serializer Tx is connected to the input of the codec 0 ]: r/ q. S& A4 P7 N
*/
7 C% |* \# x) c$ `* NMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* V& Z: n% W M& P% V; \' _
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ @, L, U {* s- a6 \! Y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# }9 R5 q2 F. {4 J6 s9 x: ~
| MCASP_PIN_ACLKX( Z2 \. K; j7 N! \2 S6 B
| MCASP_PIN_AHCLKX* ~' C, l$ x: Y
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
* V) ]& u9 `- ?7 V) D6 q% m. [. O' S. vMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 a6 o0 }2 `# N) @* \. ?% q {
| MCASP_TX_CLKFAIL
. U# J) w, c8 Y) }( {3 Y" S| MCASP_TX_SYNCERROR' P, \$ u5 Y8 p3 N- W2 B/ p- k
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! B4 h- s' }0 s7 N
| MCASP_RX_CLKFAIL
0 g' s; B1 K# y/ P( u0 U0 Q* S- ^| MCASP_RX_SYNCERROR + w1 C4 t2 O+ i7 j; @
| MCASP_RX_OVERRUN);+ t- Z- Z- y/ b) d, K
} static void I2SDataTxRxActivate(void)( H4 h" w" L& M& K1 Q: I: n. j9 N! Z
{
# i; E+ h0 z! t2 T/* Start the clocks */4 Q/ ^ z I4 q& f
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, @' I4 e9 X6 i! A; W6 Z6 Y4 q1 T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */& y0 N: \! G. O9 m, Y8 e* r+ y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, S, z' i# I* a! V2 w
EDMA3_TRIG_MODE_EVENT);# N' b* s& O1 _* O5 b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
; e4 p- p& R* p& YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
" ]# P1 k' O" U- @! r2 {4 K6 RMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! |- C$ S8 \% ]0 D) z, X
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
. T. L) a. r8 P2 i1 s" uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; x( K# z# C) y5 R8 _5 I/ c
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! C7 e4 m2 X* c# {5 W
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. {- A0 ^8 ?) f @( G& [
} ' X+ g9 y3 r6 S0 c: m3 c
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
; ~3 m: p6 \( d. [- j- n4 o) D |