|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ b% c7 q$ [5 q* G8 s- d+ ?, d
input mcasp_ahclkx,
4 C- y9 v6 P! v. qinput mcasp_aclkx,
, X" N" R( Y& U, \& i1 W% {input axr0,% |: y* d9 S6 n( M% g7 @
I6 _4 z( y( ~) g8 i
output mcasp_afsr,
5 i( x8 d, D8 D V6 {4 Youtput mcasp_ahclkr,. m4 b1 \! U4 z, P* ^0 O& M9 H
output mcasp_aclkr,
1 q4 B3 x3 H! e6 u9 Ooutput axr1,3 M1 ]5 h4 Z/ E. q
assign mcasp_afsr = mcasp_afsx;
4 N6 d, j \/ J& gassign mcasp_aclkr = mcasp_aclkx;
. H7 M; q: h5 p0 t! _4 gassign mcasp_ahclkr = mcasp_ahclkx;# f2 k9 u" N! i8 C; q6 a
assign axr1 = axr0; ; a4 }% F+ Q* ?- D. E, M
7 O* S3 Q: d! q7 p/ n) r' `; s! G
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
! u& ]6 x4 u# i+ e( x4 Dstatic void McASPI2SConfigure(void)
. @1 V. }5 | Q' J7 G: M{
+ g5 u* Y( F5 m& P+ H% jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);2 S1 f! G" m. _* f+ G* t
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. c4 h% f2 h, N$ W; Z
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 \9 C# q9 F. @- }
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
' I8 u) o+ g+ E* h& xMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* j3 M0 w* E- q% V. |/ u
MCASP_RX_MODE_DMA);
0 H! Z* A$ b1 A6 fMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- x0 s* `, p( k
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 U* b( i) M- X0 FMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , c& [# V6 X! T; Y7 O" Q
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( N: r+ T! T F; d, R) c
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ ^( [. b) A" QMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# X' V* p$ w( o& G) iMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 ]1 p5 Y U# Y8 U, y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); x/ E/ e0 g# G R5 n: N0 b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# H' B7 H' F* N0x00, 0xFF); /* configure the clock for transmitter */
( r, R+ ]/ j1 e( Y" [McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! S' ]$ D' ^0 ~+ M1 s# w6 kMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ ?9 S; I8 d$ {6 [; g' HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 r2 F% f6 R: ]! ^, I. W0x00, 0xFF);, _) u4 ?$ h/ b4 E
' ~: m& W# ^+ w, s$ ], W/* Enable synchronization of RX and TX sections */
; v r0 \8 u8 o/ K2 t! F' wMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */! d* Y$ m4 R) t$ Z) a. m
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 }8 q$ |4 z. ~! d8 W% @
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*3 r# a6 D2 }+ _) m' y
** Set the serializers, Currently only one serializer is set as
1 C2 b. H) W- F7 `- b** transmitter and one serializer as receiver.1 J. h3 q' Y" k# H0 M
*/$ e0 {* U& S2 n- z7 |3 u: R$ M
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; l6 k" t4 v! s" D M1 w- y
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* V/ _1 H' q4 X** Configure the McASP pins
- c0 M8 D* e1 o$ h1 E. P** Input - Frame Sync, Clock and Serializer Rx
! O: ?0 g8 C6 X# q+ P* d) y, p5 d** Output - Serializer Tx is connected to the input of the codec
7 S/ O* u/ @+ d8 J$ o. o*/% Z% c0 k) a9 s0 u
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); j) h* k% [% T p0 C$ y2 G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* p/ C2 ^# y8 i
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. X8 z' D" L+ b3 @' i( B" j
| MCASP_PIN_ACLKX
' \. c; {" q3 F3 c| MCASP_PIN_AHCLKX) S; s. }! y2 z& P& _( m' g& C Q( g
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 K! |& c' S- R n) M- P
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
]9 G# q! O" x- F3 E. @6 O5 t| MCASP_TX_CLKFAIL 1 k2 n" a) H7 c# Y5 O
| MCASP_TX_SYNCERROR# I, H9 S4 p- w8 I* d/ }4 l
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 8 \) w9 i. M# a/ ]7 E5 `$ u: j
| MCASP_RX_CLKFAIL
& `/ Y/ ~ A6 C% E+ l# ]| MCASP_RX_SYNCERROR 1 f! g# }0 o& }- _" y/ B
| MCASP_RX_OVERRUN);
7 x" I5 ^. x5 R) j( g} static void I2SDataTxRxActivate(void)
8 b: a6 P3 }; E5 i{
6 ?# X0 z2 {8 h/* Start the clocks */( S4 C# H; E O& j i0 \- R
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);/ \: i7 b) T) m6 ~
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
' f0 H# f) L, `: {. aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: \% e' _6 j' }0 d6 A# @' M+ x- h
EDMA3_TRIG_MODE_EVENT);. N& Q6 h% l) t6 O; w: b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- r% D$ z j' hEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
7 {& }" W- [3 DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ X2 ?; G# u) @
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 q1 K$ V3 z9 J {9 m
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
# u7 r- ?- V1 K7 a$ w( dMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);! y6 C- {' Y2 y- y& @4 K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);) i7 G k0 u4 K$ m
} - i' y* _ g# Y' x( ~
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 B& U; k0 o1 y! ?. n% I; } |