|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," _2 ^& j7 x& X3 L5 v3 e2 _
input mcasp_ahclkx,
0 L1 b8 o3 m A: |9 b* Iinput mcasp_aclkx,
: ~4 N/ a D3 ?$ I5 _" @input axr0,
`* j! b, ^5 Y7 m0 q* a/ P
2 q5 H0 I5 r- o `% }/ g7 w7 `output mcasp_afsr,) M! M* v8 J; a+ U3 ~
output mcasp_ahclkr,
- N% A' B5 g) ]. Loutput mcasp_aclkr,
c* g2 W1 {* A2 W4 l+ ]) X ^output axr1,
- A ]# `" s+ ^' x& C1 _- P assign mcasp_afsr = mcasp_afsx;7 `& j, z' n8 w2 P
assign mcasp_aclkr = mcasp_aclkx;
! @4 k" G( `9 t D- Wassign mcasp_ahclkr = mcasp_ahclkx;) I, T" Z$ Z0 o/ X( U' q
assign axr1 = axr0; 4 M' q) M/ X4 ?* O( C
) x; W U3 @7 ?( ]2 U) }9 B
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
3 Z$ {# G* {: [static void McASPI2SConfigure(void)) y9 ~6 b, o0 J
{, e5 k; H/ E7 ^4 T& p3 C8 O- ^7 m
McASPRxReset(SOC_MCASP_0_CTRL_REGS);* M2 H. s, Q# K. x
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
; o. ` R$ q6 ]5 ~# a1 cMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
$ z% t9 u+ N& {& B* H* F4 r. OMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
* R. l8 s9 U2 LMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: K [0 w+ M, C1 n& l, y; C5 }. o
MCASP_RX_MODE_DMA);( f0 J; v/ L" ? o; \
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 c( W4 B. k- [. A W8 Z( I
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */: T$ S3 ^5 M( h2 d; p
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, v# M7 _5 G1 g) C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; `) r) r2 d7 A
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - X6 A1 q% C8 K
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */ t8 b/ Y3 W4 [; T; G( j
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ W3 V k$ k) I' S6 GMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 \1 r9 F4 Y$ X; x. ~: V, v/ V J! D0 [McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& W8 @7 |+ k- E; @" G' ?6 u( C0x00, 0xFF); /* configure the clock for transmitter */
$ `& G7 _5 @1 P! P# ]. rMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ _) I8 L. Z" t) U9 bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# k- h- |$ Y) f/ {. [' CMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 f5 B, M- ] @+ b
0x00, 0xFF);
7 x& p: }7 r: R) D2 N- m( B- ?( u* R7 h' ^6 |9 ^# p
/* Enable synchronization of RX and TX sections */
% f+ K8 G; K" c oMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- W( |5 U/ z2 j
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( U( h2 d& y" q4 h
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! S4 X$ x- T7 h8 E( _** Set the serializers, Currently only one serializer is set as' a+ B, s& t' I* O- r9 D
** transmitter and one serializer as receiver.
9 {1 g% P7 S( X*/
$ G/ [. Q4 f) m4 ]) h1 R" kMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% e- g2 @# H) e/ ~! N% M/ cMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* o9 y3 s' A O0 m9 K7 Z** Configure the McASP pins
% C' n' {1 I3 V2 ~** Input - Frame Sync, Clock and Serializer Rx) p y& T( W9 `# L
** Output - Serializer Tx is connected to the input of the codec & z4 v4 t/ I; l
*/+ C* Y9 v: X$ n: A
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 H6 R9 B1 ~1 J' g
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 W2 L$ }( u: K7 P7 n2 p& L3 jMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 d% m: q' Z' ~: |/ S| MCASP_PIN_ACLKX
$ a2 |9 ?) R* |) R- d& `| MCASP_PIN_AHCLKX% D# y# |; r$ o' F
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ {& e9 c& |. }6 k. QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
1 f) c8 G. H0 q$ l0 A7 A| MCASP_TX_CLKFAIL
" T D& e/ R7 g' L0 P: `% x| MCASP_TX_SYNCERROR& l+ { d6 n7 Y3 b0 W# M: f
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% X- ^6 k- Z0 _* Z2 u7 U" S( F| MCASP_RX_CLKFAIL& {/ m- Y$ B0 U6 G
| MCASP_RX_SYNCERROR ; \% V5 M/ F+ ~& G
| MCASP_RX_OVERRUN);* i' v. w6 E# {1 x/ {( y
} static void I2SDataTxRxActivate(void)
) i& O; i l6 @! v{
+ @0 P$ L7 L( s2 ?/* Start the clocks */
! p/ @, c y2 q' I+ Z' U3 j. R, EMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 Z& P3 H) o8 L7 JMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */3 x/ h5 L0 Z1 N, l, N8 o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 w0 a5 v5 j e3 t+ hEDMA3_TRIG_MODE_EVENT);
. p, P* M# N- a: y0 s* W; I! OEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
. B. a: o5 E2 V' l- D; o) c4 {4 @EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */8 u o8 |8 q% J9 _+ c3 F I
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) i, A2 c$ Y& J/ y/ N' Z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
' H9 e& _1 A; zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
1 z2 U1 c9 s( Q1 r. Q% jMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' J5 ?5 U6 k) E9 |; MMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 i- Z, b# i8 s# A8 f" F4 K
} $ f3 d$ q5 l' R) ^& |
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 r; ^% N/ p& \0 Y' m |