|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 K8 g3 \% v& h, l9 ]$ Ginput mcasp_ahclkx,
7 X" j% j' H z4 t6 U: m jinput mcasp_aclkx,9 u4 S. T7 N; `" {8 B9 Z
input axr0,
7 m% K( l" N& v: h$ U0 _$ `
2 @7 _ F1 N* Loutput mcasp_afsr,7 s+ m" a4 G( E
output mcasp_ahclkr,5 F+ C& ~7 v J( z
output mcasp_aclkr,, z# G6 H! M* `0 T9 N. ?* w
output axr1,
# F8 \. H5 C. a( f$ w$ U7 j assign mcasp_afsr = mcasp_afsx;3 _ U. O" J! e) u( ]
assign mcasp_aclkr = mcasp_aclkx;: S' K+ {# K+ {; c
assign mcasp_ahclkr = mcasp_ahclkx;
$ H( j% C. E G* Sassign axr1 = axr0;
' P; E. a: r/ b8 p. ?3 ]- S" W+ c4 b+ Y R8 e
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) o4 \& |. O" P: y. `, n) M
static void McASPI2SConfigure(void)
6 H3 P- M& x- h7 `1 S- X9 t& w1 k{5 O& m; n; g3 o# g
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 Q+ X8 X S3 ~0 wMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 O4 I/ y2 J0 j k/ l1 Y, H& a6 L: b
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, e+ B) o u% z6 P1 }2 V' @* _
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ y3 b/ e, X+ e) J0 m( vMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ _& R, G$ C) y+ C+ {MCASP_RX_MODE_DMA);- y4 Y/ c0 z) o. S% L- U* S
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
z- y% c ?' WMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 W6 k: o( J9 W: f, a+ t2 d# WMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, : U1 b; ^5 W2 i# ~5 i
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 X s5 m2 c1 }4 j, s4 c
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 b% K8 O$ }! I: C7 A# Z5 J
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 D0 R+ G9 J3 E' e# g
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 n+ ?5 Y) R5 o+ B# V
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% _$ a' N2 |8 G0 B$ bMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! u7 g" J7 \, f, V( t% U
0x00, 0xFF); /* configure the clock for transmitter */* t0 b- t& _# U$ r: K v
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ W+ ?8 ^# e. ~3 C; v! `$ bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: F4 l8 J# P! R! e& F% Z2 ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) c. F: s0 }4 E, w! x) k: u
0x00, 0xFF);
% P' v' d! _; x" z$ o; J' S' y/ w7 I. c5 D$ \
/* Enable synchronization of RX and TX sections */ " d" @6 t/ C9 n& I+ [0 Q; K7 N1 ]
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
& s# `7 Q% G' F- YMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 V- o+ A" o8 vMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) c) `- Q! p: W R' L% t
** Set the serializers, Currently only one serializer is set as
2 f4 X- z# e. N( O4 ~% y** transmitter and one serializer as receiver.
: v: Z& c3 ?+ o" C' H1 u*/
$ P" Z% g" f+ S; yMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 Y# N0 R4 |) g4 e/ q* p, HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*. K* L2 d8 K: N0 N3 h, H# W; d
** Configure the McASP pins 1 z# \9 }6 z/ I) a5 L* u9 G8 y8 {
** Input - Frame Sync, Clock and Serializer Rx" f& Q5 w, X( ^2 e" X p& z. g
** Output - Serializer Tx is connected to the input of the codec
: G# Q+ U+ y0 x" U6 a$ Y& L$ n*/
8 A3 |* m' L: e* t Y% GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! P1 O' v0 c! r5 G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 A6 h4 B7 @1 fMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 j: p/ p. K* q. Y
| MCASP_PIN_ACLKX2 q$ B! K) F0 ?/ d4 W- P
| MCASP_PIN_AHCLKX+ C5 b% h0 [5 r/ g z7 U8 n1 _
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
1 u2 W; I$ G2 c# o+ L9 XMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 B) `* D, a6 @4 j& K$ v
| MCASP_TX_CLKFAIL
: l' Z5 h; @& E, i9 y4 z: O| MCASP_TX_SYNCERROR# ^3 E l( P/ q8 I" w
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " X. ^$ C, ?1 @8 k# C2 |* Z4 j# O: }
| MCASP_RX_CLKFAIL
) n8 M6 Q: Q7 S) t3 A7 I| MCASP_RX_SYNCERROR ; N3 \ q% w5 l9 L/ G
| MCASP_RX_OVERRUN);
- I$ M& w5 A I} static void I2SDataTxRxActivate(void), K; z* {! w7 T4 h, S
{$ }' o# d; D* e! C8 ^2 e
/* Start the clocks */
7 Q* y7 s/ \% _McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 A* N G! O L }
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) I8 Y7 E7 d6 P% @8 bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 ~. n/ f& b* \8 X: i* _% I; j' ~EDMA3_TRIG_MODE_EVENT);/ o1 g- b& ~9 I. s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 Y) t$ `$ ?3 `/ ]( k# uEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */* ~+ d! ^$ z/ _' U! ]. w
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 {6 S8 t c8 q+ D9 k" v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */* O3 `+ @' m) }4 f4 y2 B
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& w9 B7 f$ d0 z! [7 O
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, w+ n# \( h* ?' q) hMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ n8 |8 e/ L m; @, a( X3 F6 p8 l
}
" U( w; v# h/ N" W6 u# h1 W请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* n8 I) I% f/ X' {0 _/ c; } |