|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,' S1 m! V( U: U! d1 A6 q( X
input mcasp_ahclkx,
$ p0 |6 @) h) c; p* T* y0 Iinput mcasp_aclkx,
' X5 Y1 S- w6 \4 e0 s9 e9 |, p! uinput axr0,& F4 O3 ]) f3 ~. V' r* N
3 n4 G7 B; z3 S' Voutput mcasp_afsr,5 g5 s: G! H) p
output mcasp_ahclkr,9 L% Q* M; R/ C2 H! {2 o
output mcasp_aclkr,
+ H v4 z# B5 Koutput axr1,
+ ^+ ^; y6 X2 C+ ~6 G assign mcasp_afsr = mcasp_afsx;
1 ?7 N8 }* ~/ v$ _/ W% Rassign mcasp_aclkr = mcasp_aclkx;) g& C0 d% r5 M& |6 E4 ]& L
assign mcasp_ahclkr = mcasp_ahclkx;
0 C" \8 t! x9 d+ ?assign axr1 = axr0;
% \& \; F1 }6 R! J5 @8 M- E# L" e; d( _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 . [9 I1 k/ }( U& t' h* j! v1 Q- O0 d
static void McASPI2SConfigure(void)7 @# P# U8 L3 O Y8 |3 v* F$ a
{. H: r# A( \7 Q/ \
McASPRxReset(SOC_MCASP_0_CTRL_REGS);( o! N3 t" N% C9 A* G
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
: ^. \% G- v) L) V/ q8 b: bMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! h- C1 D. s9 oMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
( u2 z4 T. w ~3 d( y% Y/ m: M& M; L, u) VMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ g3 U! D# I) j. x
MCASP_RX_MODE_DMA);
% I8 J. K+ F- `' KMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
v5 K, |8 h/ L+ J% PMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: w- h' K- x2 ^- W( XMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ S7 R$ T# b. _MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! d1 R. W! Z5 UMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
E0 v2 T( d; F# u3 AMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */9 R8 M3 f# S- J+ J5 p# J; t
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ f% o8 d( p* {
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, p8 n* `0 o/ P; DMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ `# U$ w, z) W5 D9 {0 q
0x00, 0xFF); /* configure the clock for transmitter */! P! r" ?) W7 T
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
# X8 u, p! Y8 P% w& _0 }McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ y' z4 r! m; C& E" T) {! S- q" {McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,- x0 J9 I p; i( F& o; Q
0x00, 0xFF);
* L4 D3 ?* R- }3 E9 T
/ p6 y' `0 s0 d! `/ h/* Enable synchronization of RX and TX sections */
& X, I9 \7 F% B7 CMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
J+ V1 t* M) d# |# t) l9 c; FMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% Q( f# T/ Y5 Q. J: c
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*" \$ ]* W; p1 p" l+ @) g0 ]
** Set the serializers, Currently only one serializer is set as
; l1 |# _0 R7 Q# j) ^** transmitter and one serializer as receiver.
! F' w, E0 i5 ~' c7 v# e) Z*/9 z: U" W6 ^8 V* K0 W0 x' v2 q* a
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 z7 n: C( \: R5 JMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
! h( k Q6 [4 t9 F! X/ }** Configure the McASP pins - O) x4 h, ~# Q7 f2 N# `- {
** Input - Frame Sync, Clock and Serializer Rx
% S! B/ ?3 _1 ~# k( z** Output - Serializer Tx is connected to the input of the codec 2 @* L* ~+ C" S; i% K+ \
*/5 t+ C4 k" w* J9 H) c
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- y# U- h$ a1 ]! w8 }McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( [ E' L- I W7 S& m
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 z1 }. r( R( i# Z+ X( g| MCASP_PIN_ACLKX2 i$ d9 W/ V; [9 I( r& s* E
| MCASP_PIN_AHCLKX
1 b/ s5 A7 w9 F( z0 {6 L2 @' L| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */! P" p7 ]/ V1 `
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ [* j8 S" u: G1 b3 h- U| MCASP_TX_CLKFAIL
! }' q( d1 ~4 Z6 M ^9 T# n| MCASP_TX_SYNCERROR
! @3 ]* _3 ~2 }& J5 R! D8 E| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % A" r1 b$ p6 K1 C4 t
| MCASP_RX_CLKFAIL
% G& E* O7 |6 h" _& d* j/ M, J| MCASP_RX_SYNCERROR
' x+ B. }$ s5 f, Q| MCASP_RX_OVERRUN);! g. K/ d8 o& n+ n6 w7 B" K. s$ W
} static void I2SDataTxRxActivate(void)! p: b7 O5 w9 J# i
{
) y* ]8 `( N) c' Q8 O/* Start the clocks */; |5 h8 V; L3 e1 o( |2 [0 q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 C8 b9 q' p& w2 ^0 I1 o# dMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */! r/ z6 H a2 q5 j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( \1 Q' w8 p* x- S5 P5 s u" i$ L
EDMA3_TRIG_MODE_EVENT);
* i5 O8 |& ?# c+ s0 ]; E5 t+ VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ W/ z2 g5 w5 kEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% p$ V5 V2 H# F4 F6 f/ |0 [/ jMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' R1 V- h0 N- ^1 ~! v5 R& pMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# ~% P9 w! Z1 d, H" ^while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 j( U/ @: o" XMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
& Q0 o" t9 C' \5 \# E: OMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 d' X I% s$ h( R* O n& ]& r
}
- ]& q+ s9 ?4 i1 b7 Z w0 ?请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 6 P# S9 ]6 S7 @6 v( B4 A( X) t
|