|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 A2 G, a- ^* R: h. j
input mcasp_ahclkx,4 c% K. m @) x# W5 @# g
input mcasp_aclkx,, \1 _% q; g7 y0 K/ A* T" ]
input axr0,
/ I6 j3 p: h4 Q( V5 w0 s3 M0 d( @3 c* k6 v: u. _
output mcasp_afsr,
* o6 {4 G% q. Moutput mcasp_ahclkr,
1 h* ]2 U+ Z. K* _4 noutput mcasp_aclkr,
+ ^+ h3 |* r" v# F6 F R/ Joutput axr1,
: K% _) j$ K6 v% A- i assign mcasp_afsr = mcasp_afsx;6 u; x X+ r+ B* ~+ p2 Q; `/ W
assign mcasp_aclkr = mcasp_aclkx;
6 D+ m) I9 [ ]assign mcasp_ahclkr = mcasp_ahclkx;! K+ l o2 ]. F+ ]
assign axr1 = axr0; 2 b) z- \' ?8 R" [
0 x; `0 E6 w. J
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 . H, B# ]. m1 l, [
static void McASPI2SConfigure(void)& w% f$ Z. a5 E
{+ J7 G* n H+ c7 D8 U: c
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 X: _8 S" q- T( V0 N$ Z# IMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
$ S2 I* X8 l5 Q& U. g7 J2 kMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 z9 L4 \8 E! V3 m I
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */. ^2 S! u, n& E R) Z: k6 U
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* C$ B" [" B! m9 Z' EMCASP_RX_MODE_DMA);
5 H2 c, m6 R& i7 i8 HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 L5 i2 ~5 c) p NMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 R& P/ f5 F* t- O, w0 z$ p
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / _. I# f8 G- s+ S
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 P" ]7 t2 g! C
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & R' i) t* P" {) b' q
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
1 p7 d% y3 Y5 ^2 pMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
* v; a5 r( s0 ?: d& W3 zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% w8 r6 {' q( _! Y. a$ `McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ a& D% I: N) g5 q9 K* ^0x00, 0xFF); /* configure the clock for transmitter */
8 c$ @ p7 k% Y8 g9 E2 G5 @McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
# X1 K$ C" m) M) F4 a3 ~McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + i, ]& ~( j8 c1 Q5 c* W$ r
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 j% \2 }) o, z4 v& a3 q: T7 W0x00, 0xFF);' S' e& b9 E0 l) W. P3 t" U1 R
( A6 B) n- D5 L! k0 }; }! X/* Enable synchronization of RX and TX sections */ U# e8 O: h" I8 i# O
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; x1 X9 T* q [! N) ]# r
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 `4 a6 A1 _# d: A+ H W0 f& K! HMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
+ m6 y% g8 N- B$ ], ^** Set the serializers, Currently only one serializer is set as
- ]7 Z: m f$ Y4 W8 ?% e7 k** transmitter and one serializer as receiver.
1 l; K7 R/ C& P9 J*/: Q$ O2 o, T8 u" B0 R9 g3 ~# C
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' }) N0 X/ q$ e' G
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*- `/ h. O- I1 S5 l8 u1 e* P
** Configure the McASP pins $ d7 i8 d, R6 J3 H# \
** Input - Frame Sync, Clock and Serializer Rx
: H- j% ?$ i: Y* W' F** Output - Serializer Tx is connected to the input of the codec
/ Z, h& U5 C& l# @6 |2 r6 U- D7 J" G*/6 M! S4 E z$ t1 n4 ]3 P9 ]
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 ~- K5 z) P. U9 G1 r/ ~McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! C5 W3 q7 B3 f+ p7 ^McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: @; S% S) c# z1 J: i. {
| MCASP_PIN_ACLKX
/ s$ L* E5 i) L0 g. l# Y| MCASP_PIN_AHCLKX
8 W, K1 Q; i/ Y1 }) n| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- p' r$ q* W7 H% r& T5 x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 N, j9 o) _8 d7 x6 g& G| MCASP_TX_CLKFAIL 5 Y3 {; \9 |( d& x* M" v: Z7 D
| MCASP_TX_SYNCERROR
. j4 l8 j7 U4 P| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR / O$ [4 @" b4 }5 p7 \. |8 X2 g3 D1 M
| MCASP_RX_CLKFAIL2 o- B( D$ t3 |0 {# E
| MCASP_RX_SYNCERROR
* C" p9 |' Q5 I- n4 N3 A* B| MCASP_RX_OVERRUN);+ A0 z' Q; Q1 g# {. k6 n2 U
} static void I2SDataTxRxActivate(void)* y* d! y& K! K/ f: \
{
2 c2 I9 b8 {- S# X$ }/ s# N7 Q) v" f/* Start the clocks */' \6 X7 [& `; P
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);1 F4 g" e# p- ~$ ^" F' }
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */$ Y. ~, s+ ~+ b5 P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- B0 ?* V7 t- T' O: IEDMA3_TRIG_MODE_EVENT);
. q8 ^- T" e- n6 h% h6 p3 q* }: ]$ KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' Q+ p Q9 y0 B! U- o5 l
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */* K" b' O1 X/ d) B# C
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) X8 S7 v' V, ^) DMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */. [3 p9 v8 Q( ]
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */( ^% P9 X1 y3 d: g+ h( Z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! j3 T$ l0 o2 p( M( r% X
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! T9 M0 ~$ `# ?7 o. Z' I, L7 g, C0 Y! E% T}
- X3 s/ d" S. z B. ~# r" v请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. x) L7 f w3 K- ^- s: q8 |
|