|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,* W. C5 o5 K1 `0 v1 N C$ o1 i4 w7 S; O! u
input mcasp_ahclkx,
8 T3 d; Q d5 D4 pinput mcasp_aclkx," z4 q i) m6 @( e& @. T: i. I
input axr0,9 A3 {4 g$ B, N! ?$ ^" d
2 S. l9 o! s- k" f1 C+ ooutput mcasp_afsr,& j( @9 @2 o6 o
output mcasp_ahclkr,
1 D6 E9 ?! k7 I1 \2 @output mcasp_aclkr,* S- l8 W1 f# F2 i
output axr1,+ u/ m8 P* I, O" B
assign mcasp_afsr = mcasp_afsx;3 v0 U2 z/ W& I
assign mcasp_aclkr = mcasp_aclkx;
% c3 }; G% G8 r' aassign mcasp_ahclkr = mcasp_ahclkx;
( T( d, Y& e. U' P# I, u& T* j8 \3 q) ]assign axr1 = axr0;
1 N. R8 g% w; J) l9 a! f1 _/ N- v3 P$ z* r1 u: ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
+ Z( D" V0 `1 r5 pstatic void McASPI2SConfigure(void): T! }5 L3 e' L; I1 ~" d5 E# i8 \
{5 m) v8 v" Z0 I
McASPRxReset(SOC_MCASP_0_CTRL_REGS);1 X: q0 X6 A; Y' l5 @3 t4 w" e7 n
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */7 C( y: O8 }. d8 |' @1 u6 \1 ]
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ {# V* }2 W. Y6 q! x' |: a
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
- e8 M$ x5 t- X- q& h5 a1 U5 W. u$ yMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 K! Z! z' Y0 Z3 W- y0 LMCASP_RX_MODE_DMA);% s# n7 h) D: l2 | X
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& C' E) Z# E( [/ qMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 H6 J4 _* b t8 D: z: Q8 BMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, b0 w- t: s2 s8 E( p! X6 R7 j! m
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 \: U1 j; ` t% wMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! y5 @! J, d2 n# j5 J6 {( \* n1 IMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
1 C) E; e* K( }) Y3 `4 BMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 j' W2 Z7 {" J2 x) | @
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); v: _% r- U9 v2 X& V) _) J
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 F3 ]) t* r) A7 ]8 }( T
0x00, 0xFF); /* configure the clock for transmitter */
! {% d ?0 L9 E" n; ~, WMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
7 q! q/ P% _9 @. n8 N' G. JMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 ^8 l- Q0 ? Y) E8 j5 H" |
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( m" [1 { J: f2 _$ `
0x00, 0xFF);0 i- ?" {2 H- P0 v9 K+ g( `: i
% `, h6 A/ n# o, a
/* Enable synchronization of RX and TX sections */
! s& y. P+ n y! Y- @McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
% u: |9 P! S4 d5 q: N" ~% YMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# a; v$ n- t) T4 `8 V: Z) k! C! B, EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 L w6 u4 v( I3 [& D5 L
** Set the serializers, Currently only one serializer is set as" K6 B' X4 x- H
** transmitter and one serializer as receiver.
' S, ]5 y, X6 w {+ a1 m' N- E*/% c+ H8 A3 v, }& \4 v+ Y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: u, Z# L" }! ~9 C/ k3 \0 Q2 Z; Z! eMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*' i/ F) ]) P+ [! P
** Configure the McASP pins 6 I& [! m2 W% `7 ^; e) Q: ?4 o1 C
** Input - Frame Sync, Clock and Serializer Rx0 h! H. c7 L- h
** Output - Serializer Tx is connected to the input of the codec
1 g o2 \; e5 f1 k$ e*/
3 P! B7 e$ a# n# iMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 I! b+ D$ p7 O+ Q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* k. m7 a3 {* u5 r- u PMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ I/ y6 v* w1 p! S- y- \
| MCASP_PIN_ACLKX
; O( i' j' L2 y5 q& c2 `( m6 X| MCASP_PIN_AHCLKX
) m R" \. C, ~! A- ^| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 R6 }: H" o1 A* q7 F
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
/ U8 _9 i$ [ _: D _& U2 N| MCASP_TX_CLKFAIL
( t6 t0 n, T7 X! Z( L| MCASP_TX_SYNCERROR: l+ v( t/ z& a3 k
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. Z8 w! Y- y8 R! [ l| MCASP_RX_CLKFAIL
4 B. p, F- j" N k/ ~| MCASP_RX_SYNCERROR ! R$ j' {0 j5 ?& y
| MCASP_RX_OVERRUN);
" N( d* C6 l) x& `: J} static void I2SDataTxRxActivate(void)8 d0 B% ?0 S8 j" [
{
* H1 _1 M. \3 d6 k7 U/* Start the clocks *// n. |6 f/ V, r* ]/ K8 @/ P
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, }; I6 k6 \3 o, L$ uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 c; c- ?- q" V" Y, H K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# ?2 u2 p. E* i# MEDMA3_TRIG_MODE_EVENT);; o# J( A# @ m' |: _7 F/ E1 u" `
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % Q# C' s, j9 \5 i
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% D$ Q& t( d6 o" y- ~4 MMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ y. k' ~5 o: v5 sMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
9 ~: E) z+ j" w5 Z3 i) J0 _while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */8 W- h6 a# c i8 N( g; s
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 G: [! ~7 Q# S# l# ]" E9 t
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 p8 Y7 |, R; P5 z6 r- f
}
; ]: [2 F" Z/ F; @/ j请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , G. v5 J2 w1 q6 z/ p( K d7 p
|