|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,2 m# O4 F' [, W# K
input mcasp_ahclkx,
9 T6 s, r {& n! u ~: \! P' sinput mcasp_aclkx,7 Z6 c- O( N7 b. |4 [
input axr0,
3 m; M: f: f# z$ t% }+ m. X
4 n5 _! }( @9 L f1 z; ?# Voutput mcasp_afsr,: p' o2 k. D+ d2 |1 P5 D1 g
output mcasp_ahclkr,
, E8 }. B, c" M$ z% S8 d. qoutput mcasp_aclkr,) a4 \9 i8 ^) X$ ^6 V- m- R' y5 R+ ^
output axr1,
- D, I- Y! E* p3 |3 D/ H4 ^: O6 S assign mcasp_afsr = mcasp_afsx;3 Z1 V% B& \* d2 v
assign mcasp_aclkr = mcasp_aclkx;
/ @5 B7 S. }: K# kassign mcasp_ahclkr = mcasp_ahclkx;5 Z, j8 B: }! Y8 A9 |# e
assign axr1 = axr0;
+ O. j6 k9 p! a9 L# R, g$ w2 [, u% c, }* _! V
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 I% G, L% i5 E: `( |- k
static void McASPI2SConfigure(void)
( _4 q0 p; c: t$ a" b/ [! T{
, H i' K+ p0 M& ?* zMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 r/ C& g) c0 b; c* K2 UMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */9 u: b( ^, H3 N+ R
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, n4 R, h4 l3 g# i! t0 @McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) }* H4 e& }5 M2 z' {, R0 \
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 B6 l% r5 l9 r; j! N- QMCASP_RX_MODE_DMA);
: T' g0 h3 X+ q, }# u9 \McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! |6 Q8 C! E4 N8 [# y/ mMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" k8 p) J/ |- o# k8 g$ C' DMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 u$ \/ Q* {9 U! r
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
" o6 o2 A4 X- S+ \( Y) P# tMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. h2 E6 I: _; V2 DMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
7 u( p/ }9 O/ D3 p8 O: N) o4 w k2 VMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- u. }3 G" l+ G- ^
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . M E2 \$ A1 h" K7 t
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* c; \- t/ s+ G; c+ `: [: ~2 Z0x00, 0xFF); /* configure the clock for transmitter */+ j; ]2 `5 I. M% r
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" D* t& h; P; P% r6 W; J
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ L% \: u5 c- IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 n* f. V: Q7 g3 E( u% x* E" O
0x00, 0xFF);
& T8 R ~ S }9 b* \* r
; O0 X' Q. n" P. h9 E/* Enable synchronization of RX and TX sections */
M7 I9 [- K. r- [6 f; N& }McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ }" G' r l/ A8 _! q, M" ?+ S* AMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 o' e7 A& Z3 u$ q' s3 L' X, d' N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
, |" {6 K3 e" M' q; u** Set the serializers, Currently only one serializer is set as
2 H0 n% {. }$ G6 M) H% [6 Y7 Y+ G** transmitter and one serializer as receiver.# J8 ~. L' p! k1 }' [9 \
*/
( `, W9 O. }! J/ L4 J6 fMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# `+ w- P" m: ]' p7 x2 |7 ?McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*: `& j9 W: Y5 K/ k
** Configure the McASP pins ! t2 E7 @9 l; A/ ]& n5 X
** Input - Frame Sync, Clock and Serializer Rx
8 U D3 T' n% H" M, A** Output - Serializer Tx is connected to the input of the codec
& C3 j, h: S8 N*/
9 D/ T# @4 b5 H0 t+ tMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" G5 f" A6 ~) s7 R4 a) y1 jMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; \4 e% {" D ^3 Y, ^4 p2 B+ LMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ O( Y1 \: ^( V: D# ^7 ?/ l| MCASP_PIN_ACLKX& z, q/ b. q) F ?# n; {. J
| MCASP_PIN_AHCLKX: s" e* z6 X9 L+ z3 m
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 I& t; z$ h; f: O" `2 g7 tMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 ]2 E' K* X/ \| MCASP_TX_CLKFAIL 2 _ O7 |1 a5 r$ r2 d, d8 n
| MCASP_TX_SYNCERROR" l; z1 _! ]# x- `2 l& |% D- ^7 b
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* i6 H/ K3 e7 _0 |5 l' h| MCASP_RX_CLKFAIL( O, C9 B7 [& I+ j8 c8 F: Z
| MCASP_RX_SYNCERROR , d4 M3 C. C" k6 p, V Z& M, H
| MCASP_RX_OVERRUN);& ?, H: \+ h* x: ?
} static void I2SDataTxRxActivate(void)
% Z7 F% L. ]' w( ~0 u4 L" n{1 R* A2 a- L- d) u
/* Start the clocks */' x8 u2 F$ S* _) j+ n- z
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 o0 _0 |6 Y6 q3 R/ I( X% g
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
' F/ |! n' k2 h E) D) NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 r. V% F( |1 O; V' ^
EDMA3_TRIG_MODE_EVENT);# W; b9 H5 T" e0 l) g- b9 y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# e4 e) h3 x: w: Z) Y% f& OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 d/ }2 _ K: V! U0 l! NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% P# w) U7 u: n6 ?
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ E4 [! t% u, `* _& Swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
% l0 ~' C3 b* R) H& r- g" C' ~McASPRxEnable(SOC_MCASP_0_CTRL_REGS);+ W6 k2 I, M* Y, s' V( s
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
+ Q2 | H m) x F) Y}
: g& J- G' V, ]1 ?请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
; j5 X' A: C e+ @6 a6 j! K p$ Z) j% Q |