|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& | i* K8 I; m0 {# k
input mcasp_ahclkx,
* d- J0 ?! m w/ Kinput mcasp_aclkx,8 A" [! w# W/ R3 R! S7 U" d
input axr0,
^; b* y Q( o
, r" B# d% N# f W) D0 X* Poutput mcasp_afsr,0 A- M5 |0 R# M
output mcasp_ahclkr,
: S* D% ~; ~0 q( Y8 H* ~/ v; soutput mcasp_aclkr,
8 I* x' k) x8 ^% m$ F. [ Zoutput axr1,
! ]- p. a3 ?8 k: Z6 J- U. M6 T assign mcasp_afsr = mcasp_afsx;) t6 n& i2 s- U e
assign mcasp_aclkr = mcasp_aclkx;$ H( I: @* Y, B
assign mcasp_ahclkr = mcasp_ahclkx;6 @* m$ p5 |" O4 L( b5 y
assign axr1 = axr0;
* ?; k" x. b) P$ K
$ D& I, e( O) ?. z2 W7 G在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 [5 E& ]# B+ I
static void McASPI2SConfigure(void)
* v" |, a: I. s8 B4 m$ k{
: G% ^$ i! ]1 }- R# o' mMcASPRxReset(SOC_MCASP_0_CTRL_REGS);7 g6 @$ P& }) z8 A
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. {+ d, r9 y; O: o& R1 v- r: t
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);( W8 f, x! Z$ M) M
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */1 D7 C) R; Z) \/ i! E+ P: F
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ A! g8 Q# H6 K D- o8 [' n3 C8 K+ wMCASP_RX_MODE_DMA);
4 X+ t! c% }% ~# p0 ^, s6 g. BMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 T2 Z+ k9 e& N# ?. fMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 M5 t1 Z4 D. M( H! Y; |McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 p/ s% G& [; C s0 T p8 G" p
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* o) F, z( f. qMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 e/ ?7 Z# g* K6 x. W/ }, M
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# J+ d# r @/ V
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: @! R7 L( i5 p9 \" l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, |9 N, v0 ~# a% j6 m7 W( fMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: q# W: d: K2 i- P* H* [- o
0x00, 0xFF); /* configure the clock for transmitter */
8 K4 u( k; w' z; N- qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! ?* x/ B% h- O" p$ o/ C
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. e, j3 N$ E9 G2 {* _. _: cMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,' V, Y9 D: l L3 I1 m8 b y: `
0x00, 0xFF);; M7 K. @/ b% p: D0 b
/ F2 t' \. C7 I$ q' L: Y' k
/* Enable synchronization of RX and TX sections */
. W( J ]# L& E/ YMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. Y; f3 t8 P K+ R6 h2 gMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* M- e* ^4 {& b. c- |. `McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*( X; C6 M; m7 N. E' {1 B+ L
** Set the serializers, Currently only one serializer is set as q$ V. m; y2 O
** transmitter and one serializer as receiver./ T/ O- U9 Q6 q4 X( L: H h& B! Z
*/' ]' Y+ S } J
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 H" j' |+ a% i7 f
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
: ~" b) u# S7 T e6 k# f0 K** Configure the McASP pins
3 Y' u* y2 t! X5 X. P** Input - Frame Sync, Clock and Serializer Rx
0 }8 W9 _, d' V& ?** Output - Serializer Tx is connected to the input of the codec
1 M4 [. A. Q! I' R8 k) f: s*/
, A; A. d' O; @; N/ eMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, j% Y8 n# @9 u) h' q1 J) g
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: }/ e2 v. z- k6 g% _4 p/ \, oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- N1 F6 [! n6 O2 o. Q/ Y U| MCASP_PIN_ACLKX
/ m% C% u& `9 p6 r0 p/ U& X Q" _| MCASP_PIN_AHCLKX ^# o ~- ~5 S+ L. p8 d5 @$ H
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */1 c; I9 V7 r5 D- y5 B b+ N* z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
/ P5 |4 R, {# X' u| MCASP_TX_CLKFAIL & L& ^2 q4 b% K& ?3 {7 w7 Y w8 K
| MCASP_TX_SYNCERROR
: M$ S! X6 t0 b/ J* A4 g5 ^| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 q( J, s" T6 V/ G
| MCASP_RX_CLKFAIL
* N1 w. D- R$ v| MCASP_RX_SYNCERROR & P% X3 Q- ]/ F- P
| MCASP_RX_OVERRUN);, b% E1 K. A6 L e% Q( E' j
} static void I2SDataTxRxActivate(void)- S4 E+ d) J4 c$ t) }
{4 R" R7 \1 X- Z- o ~
/* Start the clocks */
5 L8 S. y2 G4 IMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 L$ N$ J4 ^* O C/ h6 m
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */6 z; V: ^: M' @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 k& a, X9 c2 g8 l) IEDMA3_TRIG_MODE_EVENT);
4 G6 \6 T8 t: ?& j' wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
/ I6 V: O: E" K3 L* L3 r |7 b4 JEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */! X# b0 h z0 W$ B* ]+ Z6 H" F
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% t* P6 I/ l: K* k/ ?% N3 H% @! K
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */2 u4 `. o/ J7 C! X3 k& U- ?
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */ o g0 h5 Y) O$ n: ]: i
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);) p I+ s6 V8 `+ i! y3 e- M+ j
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 T( v% ?. p# N
} * k5 ]$ P0 j w, c6 g
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. / x$ H* [. C4 h- l! d
|