|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
3 N! j5 s% H+ v8 v+ sinput mcasp_ahclkx,
+ e0 t0 V5 a8 c; J# `) {$ P5 P7 `% }/ dinput mcasp_aclkx,% }3 h( n9 Y1 n8 I" [
input axr0,/ D: m# i' p- b6 ^- q/ f0 X: p$ V5 p
; }7 }/ }( \" ^output mcasp_afsr,! f# c6 h! O# {) ?+ G
output mcasp_ahclkr,
- q4 N# |; B) L& uoutput mcasp_aclkr,
7 D1 [; T$ u; {$ n. x1 u+ u$ voutput axr1,
8 B/ I% H" k- O4 ]7 K assign mcasp_afsr = mcasp_afsx;
6 I! R7 l. Q% n; N% L% ?1 m6 }assign mcasp_aclkr = mcasp_aclkx;. `, s, a* E* ~7 n9 |2 H
assign mcasp_ahclkr = mcasp_ahclkx;4 x9 T; O& Z6 N) T( P" p
assign axr1 = axr0;
- v$ a G9 E \+ Z' o
/ \# h/ B; x5 T7 f在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 2 L! Q7 l ]. t: e8 S5 p) M
static void McASPI2SConfigure(void)
/ e! S, ^$ s" A5 m: t1 v{5 Y' n7 S B$ Y8 d* U/ _& m
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) C( K) L7 g. ~: w- ~5 ]+ kMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */3 `: y( [4 @+ S* v2 G% m; `
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' v! q. d( F( c4 E' VMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */0 s0 X" u3 ^* S
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( W$ m3 x6 s% z! D1 M4 ?
MCASP_RX_MODE_DMA);
* |/ K: j& w8 ^6 E; G3 RMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 u& m5 e8 F( F( Z) ^/ B3 m
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ X2 n( `- ?' W/ _9 O6 k; Q5 WMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 {5 y7 ^" d$ i" K/ d9 J! `
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
" x [2 m7 O8 E7 sMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 N( V2 H% N) Q' U$ |/ hMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 N+ {4 Z) P' k. OMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( \, k' l) w* H1 y% \# P
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 t v* J4 ~$ }' W6 {. QMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 O3 w0 ^3 k, }* i0x00, 0xFF); /* configure the clock for transmitter */
0 a# N& u4 v, h# BMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 E1 _% d1 A0 V5 R8 I' C* GMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% s- Q/ q) u* |4 m8 HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 M8 R, b$ }, P* o6 Y/ E7 ]
0x00, 0xFF);
+ L- }+ }2 K1 g# V- E; c( x/ F9 D, B$ M1 C6 G
/* Enable synchronization of RX and TX sections */ 2 Y* A6 z1 K1 \, B* c& L" }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* m( d/ U: q5 w& `4 `
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 P( c% ]+ t$ _! h* ]9 A: Q* lMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) R( n* c9 B1 Y
** Set the serializers, Currently only one serializer is set as
* \3 V& ?/ Z: ~. N8 k: @** transmitter and one serializer as receiver./ B" r) B8 ?- n( y
*/
# B. ^) g$ l/ Y) D" W6 SMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ ~! D8 W& m" ]/ j0 h
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*! y% a8 ^5 U. {
** Configure the McASP pins % E7 k, i1 X2 I# \
** Input - Frame Sync, Clock and Serializer Rx
9 Q( j" G+ h' f! A5 i/ t) S" Y9 M2 u** Output - Serializer Tx is connected to the input of the codec
% _, x# v4 b0 _4 y*/
- i7 t1 z/ k) ~, _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' o% \' V; n& ?
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' l: {* s+ m1 X- J
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* s# `2 {3 W6 {& B
| MCASP_PIN_ACLKX
9 v& ^) z' S% M+ J7 E| MCASP_PIN_AHCLKX
. d- D, I) g- [& a4 X& j* || MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */. O, {4 w1 b3 U: x! A+ _
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " t- B7 y r% i+ e% z5 x2 F6 g2 K" f; J
| MCASP_TX_CLKFAIL " Y8 N% y5 ~0 W& a, j! @- E$ x
| MCASP_TX_SYNCERROR: S9 v& ~. R) s, s- w) o. u
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, T3 V* h7 [4 p% B9 ~| MCASP_RX_CLKFAIL
! @0 ~4 i4 w% {* x0 Z9 ?| MCASP_RX_SYNCERROR
/ T2 i0 `, n: D+ a! ]' P| MCASP_RX_OVERRUN);2 ^3 T5 b) I; ]9 ]# }
} static void I2SDataTxRxActivate(void)( F; |- x K& ^$ p
{ ?; K- s/ g! P9 x
/* Start the clocks */- l8 Q$ g: ~/ M1 @7 Y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) h A4 x: h* C1 MMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */% f) a8 l! h* i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, y3 i% Z4 ^0 S+ X8 s1 B
EDMA3_TRIG_MODE_EVENT);" ~, J# K" W" e) |, t. s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 w+ u# K! z6 y' I* n9 S. V2 _% LEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */# J, H7 y8 X/ q7 a Z
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 I' O; n" z$ h; g
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
( I1 c3 o D& A, c% G0 jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, ~ E, H# ?$ g# k/ Z% fMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 \- B! D& s. i% i( A7 I& ?+ YMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);* a' v) F- `* y0 t3 q3 z* e
}
4 y8 v; ]9 x- h6 U, h请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ w( l; ?4 B" s( C! J4 R3 l
|