|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,# e( D( n8 N* E' E$ {
input mcasp_ahclkx,% v- K) R ~" ]6 v2 H- u- Z7 Q
input mcasp_aclkx,9 u E5 N# K% S5 q
input axr0,
( z& T0 l" Q+ m0 e' v/ H4 |- Z5 y5 E9 C0 x
output mcasp_afsr,& ~# `, N7 z ~, Y% D% S( C [
output mcasp_ahclkr,+ }( Y' w2 F9 \. v
output mcasp_aclkr,7 x8 Q- K) `7 [ I2 [' P
output axr1,
0 s8 _ ?: Z1 |: J* R( Y assign mcasp_afsr = mcasp_afsx;6 m; |# Z$ Z0 |* O b
assign mcasp_aclkr = mcasp_aclkx;- g0 N3 L; M; j
assign mcasp_ahclkr = mcasp_ahclkx;& v5 w; U* }6 C( Q8 F3 ^* x
assign axr1 = axr0;
. t1 i* z1 ^/ K
) i% D% U( N* ~. u3 G. l在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ( I4 O7 R2 M: y( Q. L
static void McASPI2SConfigure(void)
' W4 F; x/ y6 z8 }2 @+ }{* z0 l& N% J0 p0 K
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ k$ f( D8 o; p, g xMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */* I; ~' A; X6 b% e
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ l6 J6 r1 p/ J
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) t2 z) V% Z! P: u% k' J# \
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) ^" b) M6 i5 Y' U+ R9 y3 gMCASP_RX_MODE_DMA);0 `' a8 Z: e" Z3 |- z- C3 u1 h
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 T8 \; S! a. l$ R6 Q: xMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
0 {/ f# G0 {% rMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! j1 E7 q( B' p% Q O2 h6 G6 ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ f! t3 s! t" ?) u8 z7 d* ` ~' E, S
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 m8 {1 r4 T# v/ mMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */) ~* B7 [3 }% ^6 s2 d$ Y5 i* n
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 v3 O( _$ K7 z1 _, j* } u1 ?
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, U7 V3 `- g0 U# q' O/ qMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 S+ m& w4 R; H9 W0 i0x00, 0xFF); /* configure the clock for transmitter */3 C8 h+ `. w0 j: x4 n* H
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: b8 W3 R9 ]" `7 p4 ?
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 k# I/ \; c7 B) g7 a
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# X0 R3 S3 g( k4 t& G! @0x00, 0xFF);7 Z* M, F: R) D1 J% r6 W
! j5 G2 x% u- D5 c: A, t4 p0 m; @/* Enable synchronization of RX and TX sections */ 5 R" b2 D8 L; y) C. \
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
! J: E" z% I& iMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" h& v% k/ K$ p2 h) T
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
) j9 R: R' r' d# E** Set the serializers, Currently only one serializer is set as# |' l" [ \- F6 f7 ?; _& x+ I( a
** transmitter and one serializer as receiver.7 I% z4 G# }) S A8 r
*/
: Q; W9 X7 m" O$ u4 X! KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
* B. i" k$ ^, J2 M- Z' KMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 T; T, W/ k( y0 o7 U* s! z
** Configure the McASP pins
: j& @( V {) j" w& e6 v, f** Input - Frame Sync, Clock and Serializer Rx3 j; \0 l" N2 D( s. s4 Z* w
** Output - Serializer Tx is connected to the input of the codec 3 F, V# o8 S6 B1 K
*/
]# s6 ^6 p9 cMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 A. D. R3 q' N
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* j' U% \* P4 V6 p! l9 [McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ T& Q* p y# H' W! z. F2 K1 Y| MCASP_PIN_ACLKX
/ ?; l/ R- i$ d& o! v| MCASP_PIN_AHCLKX. _3 `7 D1 F: M- n
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
! A. u; L& ]) @5 R; oMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 M6 z0 _! W* ~5 J( E| MCASP_TX_CLKFAIL $ n" S/ L8 }+ }9 u: D2 Q& F. i
| MCASP_TX_SYNCERROR
3 W2 P# g W5 m" V) y3 N4 V6 || MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 X$ G3 f3 j3 ?, e* c) V6 m6 r1 u| MCASP_RX_CLKFAIL
8 f. p6 Z1 u2 M3 [1 a$ d| MCASP_RX_SYNCERROR
+ e7 C7 a! f4 U; P Y8 V- K1 `| MCASP_RX_OVERRUN);# { g- P7 F: j* Q* a+ l1 X
} static void I2SDataTxRxActivate(void)
$ d, M( m1 m3 `{
7 C" S; n6 c) O# j! _/* Start the clocks */
8 n" o. a) P3 B0 ~. d" l# I4 ]McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 f1 L: A. x: ?( TMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 @0 K/ m5 B* V$ v1 @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" e! {$ [+ B) ?0 I, i. vEDMA3_TRIG_MODE_EVENT);+ f- y. U" F/ Y# v2 H6 U. w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 p' W" Q& g7 H2 V G7 q7 x0 wEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */" @3 Z U: m4 z9 F' ~& m# ^
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; b5 S* F- [$ T2 ~/ @McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% R" l- U" k1 m% y2 Awhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
7 r" v! v7 u/ R. o' ?) SMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);; ~$ ~( U: B# v5 G# Z& v8 Q) x
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- T0 b$ V9 k Q4 z1 g}
- w* K- ?7 F/ Y* p, H9 {( }请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ; [5 W. ^0 @0 W: n5 x+ U; k
|