|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
# s1 V* L2 p* {9 B2 A, b" {3 zinput mcasp_ahclkx,1 z# k+ d2 o5 |, L v& B. I
input mcasp_aclkx,: r) j8 Z- F- y( @' {9 o
input axr0,5 \$ }9 P8 J ~% L0 G4 L" @
9 H1 }4 Y5 v" G
output mcasp_afsr,: [/ J- z0 W) i4 X1 J5 E% }
output mcasp_ahclkr,
5 v! |, l5 n* _2 noutput mcasp_aclkr,2 M$ @8 }6 ]) i# `5 L" Y0 m* @. ]
output axr1,* ]7 R8 Z8 i8 Y: ~) R$ T
assign mcasp_afsr = mcasp_afsx;' b5 O4 s& j* A ?
assign mcasp_aclkr = mcasp_aclkx;
( E5 J- X' F: i) k0 uassign mcasp_ahclkr = mcasp_ahclkx;- r( E& b* F. z: j5 @2 \3 } j+ I1 y; ~
assign axr1 = axr0; & \3 p5 C( F, X$ f7 m
8 @+ T: p4 X4 g D1 M
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 4 H# t) M3 v% @- c# {! m: A' g% W+ b1 s' x
static void McASPI2SConfigure(void)
" ^3 v8 P A' s9 V6 y( H{7 `9 W6 U; n8 h+ R9 C
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 W% S( D) E" H' CMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
+ o/ O) I7 C; H6 V$ BMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' y9 J+ e2 @1 j3 TMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
7 t% Z( v, q4 u* k tMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, \6 m& ?2 V# f& c+ _/ \MCASP_RX_MODE_DMA);# k, a6 q+ n- d# Z* T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ h* _3 ?1 g# y( T# `- i% ]! T. U
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" Z% V0 v* z5 ? e" KMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 x& ]* F& w2 l2 d0 }9 g
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% f0 `/ q/ z) z. _! p0 D
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! s/ ~8 B g( x5 U
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
( q8 b% f4 U8 ^3 R0 S& |2 ^McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);2 C8 r. _. x% b
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; y7 ?$ g6 k1 ]" ^3 D$ yMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- o! Z. Q+ M0 X E
0x00, 0xFF); /* configure the clock for transmitter */! ~- `& U( L9 H+ S7 N
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; S3 d4 I: ]2 y/ a# BMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! J u) Q" \1 h. m8 G
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 [# E8 e" \) Y0x00, 0xFF);
, |* K! P; x. U! T6 q
, p# i$ F& f+ X; {0 M1 b, U. u/* Enable synchronization of RX and TX sections */
* I" E7 g2 o8 @* _1 p6 D8 QMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */8 V7 A) J* ~8 t' F% C6 L
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' \# Z: ~! g9 c4 O( @) e* |" WMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 g! [/ r9 @8 \( f* X2 B% g
** Set the serializers, Currently only one serializer is set as
3 u4 L2 `1 T& Q( q* H, z** transmitter and one serializer as receiver. z) i2 y& V& Z/ u
*/3 D* J; q q9 N" a7 w
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( g/ p+ `' D2 s" Y. U
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
: {4 O: Z0 u0 F3 C** Configure the McASP pins ! R6 Q) L* g) L5 D
** Input - Frame Sync, Clock and Serializer Rx% J' v* o1 W. Q: o) m: j5 V7 t7 X
** Output - Serializer Tx is connected to the input of the codec , u: a- Q. S2 H# `: m6 e
*/
5 \# r- {, q" ^. j! j- y7 cMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) K' b" r! {! x+ V$ x) Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ h% m [0 J4 I
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 |: \8 S( [( C9 z6 Q& }% x% Y _) n| MCASP_PIN_ACLKX: A( K2 I9 ]7 ~ F6 a
| MCASP_PIN_AHCLKX- D/ t j, q) o2 `: @
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 l% i: s" k) ]1 u+ h7 dMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ( n2 S( b2 r8 z/ z8 Z- X& S
| MCASP_TX_CLKFAIL
& t% R' y6 K/ ^: M* W& K| MCASP_TX_SYNCERROR
/ \1 t, Y% {7 S- ~| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' ?8 ~6 o2 o9 H| MCASP_RX_CLKFAIL
% R" i" l0 W% ~/ z2 C| MCASP_RX_SYNCERROR & I g) _; m5 R. Y2 _' a6 J+ |
| MCASP_RX_OVERRUN);" C7 o2 q `0 I$ J. y
} static void I2SDataTxRxActivate(void)
. P @9 h$ d9 G# B& |{% B+ P! @! I9 G$ k( t
/* Start the clocks *// }/ c- u* f4 B' X2 }# r a
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. m- _+ t d6 j6 s7 c
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; W, u. Y: S6 ~+ |! M5 ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 s. t }. g0 g* G
EDMA3_TRIG_MODE_EVENT);
5 j5 b, M6 J* A4 z0 V' X; o$ iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
! c* |% x8 I! M, l' I( rEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */+ W7 r/ u- C" n- D- [
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); Z& E6 z+ B1 J
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */! R1 B4 U7 |0 z4 D% P4 c: y7 L
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
/ ]! a5 X1 i Y9 U8 E8 o/ hMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ n6 {/ `7 V: ~3 SMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% t H, m( V7 |( k6 T) J9 q* V! r} 2 k: r2 W& a, h( u* m% n* X
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' p9 q# I/ t# V |