|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,/ K$ w2 T- \3 h3 ^+ @
input mcasp_ahclkx,2 h# X& d. B0 l- b4 t! N3 {
input mcasp_aclkx,, ]/ T: A7 k7 z# r" |( N) w
input axr0,( }, g- I+ x& T8 c: g. o! r
$ v0 Y$ \/ l+ Y) s# N( \' \! Zoutput mcasp_afsr,
' s6 v" Y8 r1 H' houtput mcasp_ahclkr,
; ~" Q) Q; r1 }( k. goutput mcasp_aclkr,
' D- P! F, T9 p4 s, K2 Foutput axr1,+ l; i7 V% U$ V4 E) ^3 t
assign mcasp_afsr = mcasp_afsx;
. }$ h/ V/ A4 _5 I4 ]* Rassign mcasp_aclkr = mcasp_aclkx;
* k4 M: M3 r0 G4 U0 l: iassign mcasp_ahclkr = mcasp_ahclkx;7 n! l" w8 r7 Y$ K
assign axr1 = axr0;
d- [7 n3 K! n d" H& [ v/ ?
6 S9 x; a: \/ H! x3 x在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 4 H- O1 Q. B# a7 G# f
static void McASPI2SConfigure(void); }. `5 u T3 u$ K
{
F" @- B+ C- _' |: n3 |McASPRxReset(SOC_MCASP_0_CTRL_REGS);
_( l& B4 _% C0 oMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 | F6 b G* ]9 n& Q- yMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) J4 w: s8 Y4 N5 `1 C
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
1 x: Y9 [3 a2 h' K l. S' jMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 U& V( r7 N+ p, s \MCASP_RX_MODE_DMA);/ m0 Y: S; |. [2 {! \# I
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 R' p/ d/ ?. V- K
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ ?# X7 S& R0 A9 J5 f, v& J
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ g& N) U8 q& i- n% e& Z- k0 V* ~' SMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& L+ L; u: j* ]% Q3 C" G& y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 G Y. H% \2 |7 z' [MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
) N4 _, T+ d3 u0 i$ ~McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ a6 ]3 ?9 M! y# D E4 v
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); / x0 z5 B( `/ b# f( t, U
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 L; q7 l7 Q1 ~0 j4 R0x00, 0xFF); /* configure the clock for transmitter */
0 S `6 l/ ]1 zMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" o8 H% z) J, f# o0 J* B
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) P& A" B" a6 G
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,! ?# u7 x3 E; }) r# l1 @
0x00, 0xFF);
/ r4 Y4 D7 a; k( ?% d4 ]9 h3 C! _/ _4 K
/* Enable synchronization of RX and TX sections */
- X+ J0 }# G+ K* lMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) E( @" R1 {( f2 iMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);5 L& u* k2 u8 C, ]
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
V* B' [6 {' B- O |** Set the serializers, Currently only one serializer is set as4 z( z- r; X# i+ T6 }
** transmitter and one serializer as receiver.
) I) i) B2 Z4 z*/- k6 p1 U1 X7 K& ^3 _' O; _( ~
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ R2 d5 X% x& n% Q/ ^$ _5 \/ |
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 \5 ?# V' ^ F+ H- B** Configure the McASP pins
/ x* i. \; d; k9 P/ m$ N' T; h: k% e** Input - Frame Sync, Clock and Serializer Rx1 @4 K& z; q4 Z
** Output - Serializer Tx is connected to the input of the codec
9 V9 `; I4 [0 _, c*/1 e- v# U, f' ?' h; F. D
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 L; B$ F# q8 F- @
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& e" D0 y0 f* U+ @( e/ P; W
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 B. Z9 n8 T$ Y+ Q; Q- L6 S" N+ h8 o
| MCASP_PIN_ACLKX J& l% T2 s/ N- o7 x. y) k
| MCASP_PIN_AHCLKX
4 H: e* E. T% n1 T| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */: p6 x- v+ v+ f& ^. e3 o
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 s. p# E2 [8 R4 D& r# [; C+ ^
| MCASP_TX_CLKFAIL / \! B& r' {- N. a1 M+ A8 q
| MCASP_TX_SYNCERROR6 E- o0 V6 j+ Z+ m
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ f ?% i: }( ^* N# D8 C& q
| MCASP_RX_CLKFAIL
7 b! p1 b3 A% b. R6 n. B| MCASP_RX_SYNCERROR
* D( X# S- b) T| MCASP_RX_OVERRUN);+ t$ I- h1 j2 Z
} static void I2SDataTxRxActivate(void); t) w. Y$ u7 f1 P1 T7 s* o
{
+ [3 m) ?! f+ E5 `& M/* Start the clocks *// |% n% ?" `! V
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, O5 c! y) x% L2 x/ x8 J, v! `1 M
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! F# t4 j0 M$ M/ ~6 rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; d! u; i; n- V+ r" U
EDMA3_TRIG_MODE_EVENT);8 ?: r& V' M- P& M' m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
1 L5 g; A7 e- s* Z; o r8 YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
! d! |9 l1 D) J4 O* r% OMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); C& c' U: G! r4 C
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& F# W: S9 t, T" v$ }5 S
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
2 G# w( u: Q" s! ?% |- H4 }: eMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 O8 |$ h% ]& Q# c6 f4 J- u3 uMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);* T( v* S- x& T7 v$ K9 Q
} & g/ B$ h; [- F* x
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ T1 b2 x- V; N& Q3 M% G |