|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
( b- M$ z( c( pinput mcasp_ahclkx,4 g* `( }& }; g U: D! D" e
input mcasp_aclkx,5 S& ]0 a1 A, j9 o/ P/ V8 l- y7 I
input axr0,# @, v7 g' D2 b/ I0 S. C7 E5 G
, `: K6 M% e0 S& S6 o
output mcasp_afsr,
& j- u* C7 y1 b+ O! poutput mcasp_ahclkr,
: U M* f5 x+ h! `8 s4 ^( n* |output mcasp_aclkr,
+ l9 g" k" `) s7 S9 s% youtput axr1,
( N0 c' r+ D+ Z4 F5 G6 h% @ assign mcasp_afsr = mcasp_afsx;9 s( j9 \! A/ B" Y# D7 U$ F3 E1 L; i
assign mcasp_aclkr = mcasp_aclkx;- e8 N( W n' t* {3 d2 j
assign mcasp_ahclkr = mcasp_ahclkx;( ^! r+ k8 f) A
assign axr1 = axr0; & E2 t0 G# P8 j- I
; z# A0 V# k4 ^/ a在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ! d0 w/ Y8 b. K* O9 W" ?; v
static void McASPI2SConfigure(void)
% Y9 r) k/ E: I' w{
( h4 N" h* ~3 [$ w3 q cMcASPRxReset(SOC_MCASP_0_CTRL_REGS);" C- A, t t0 U1 B9 M7 c
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */: y" `( r" m# f. c$ q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ a) a2 D9 i$ w& \6 @
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! n0 L/ _; I0 W$ Y3 P8 x- TMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 K5 U: H1 Y' C' w" x! k+ n4 h
MCASP_RX_MODE_DMA);
4 z. Z" i! Q1 u' F A6 H+ R. J! ^. NMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 z- t& Q6 ^4 i" B
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! o! C3 Z% S0 U" L! [) p5 XMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; f( j+ N' T8 w6 |4 \! F( r" ~, AMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
U- ], }- H4 B( DMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 h' |: j: e1 t) d! D3 {MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 W7 A4 Y; ~( G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
i: R/ F9 [' d" U: @! LMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 M. q% ^$ I; w8 o1 U& \; E
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 ]% t+ T* m# Z' \0 y0x00, 0xFF); /* configure the clock for transmitter */
% I0 u. S- L# ] a; p' `' a9 wMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
* Y, M5 N5 ^" F' aMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' ]. \( U; _% x0 v' @
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 d8 p& r/ E3 k( p0x00, 0xFF);& J& h# \7 n3 r1 R4 t
: o' @# z' D4 f' J/ ^6 M8 S/* Enable synchronization of RX and TX sections */ " D& J6 {& m( d. E8 |( J) M8 k4 J
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */# y! b: N' F. _1 l" C: `" P
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) f7 \* q/ \3 BMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*' e8 G, A2 _* Q7 k
** Set the serializers, Currently only one serializer is set as
- l3 k1 b: W. j) y* H. H** transmitter and one serializer as receiver.) T" ?6 V$ v0 s' @: V+ |7 c/ u3 z
*/$ K! C7 R" Q6 `, I" F+ h
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);4 W) t( h8 Z9 G' W u
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
- M+ A1 t( B, T" `** Configure the McASP pins
[& p. q1 o% l' i5 J** Input - Frame Sync, Clock and Serializer Rx
$ j& h8 h& f, u- A, t) b- l** Output - Serializer Tx is connected to the input of the codec $ q ~5 ]0 a( o' f2 i" x) H
*/* R7 i6 L) k( l3 _
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" X( ]) u. M3 X7 w
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 o8 {2 L8 T: l# E0 ]0 g
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 Y, m1 n* _7 h+ Z5 Z" s| MCASP_PIN_ACLKX
$ z% o) c# F6 q! G8 j6 ]- c. F& f| MCASP_PIN_AHCLKX3 C9 m5 h4 I; w3 [: t j
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- e5 }% e. r3 S
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , n8 ^$ T9 a; ]' j( W
| MCASP_TX_CLKFAIL
4 l7 I3 {% x y| MCASP_TX_SYNCERROR( b' O$ o/ b: P/ B* U( N
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 {" s5 D( G: ]' D: \; J| MCASP_RX_CLKFAIL
( n. u1 p/ F/ c( k6 G) @| MCASP_RX_SYNCERROR 5 E8 g$ s* _" m' Y+ n
| MCASP_RX_OVERRUN);+ P8 `6 e; \& D+ U
} static void I2SDataTxRxActivate(void)( p8 _4 U7 v# U; f3 v# [( y
{8 l; \6 ]; L8 [( F
/* Start the clocks */
4 r6 j0 R9 a1 T9 q$ ?: nMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 n, [" s2 _- a- dMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */3 ?# k- `! `# \1 Z Y+ t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
3 j/ l/ m0 c( qEDMA3_TRIG_MODE_EVENT);, i7 a! r) M2 z) q! C& P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
/ P2 G4 ]& P9 r7 y1 C- ]) w6 XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */, |/ y( H1 u' N7 J
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: Q& Z/ P7 \2 L/ k( v8 k3 OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
5 |& k7 r' ]5 `% F# v) H- z# X: kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
# v2 V! I( l4 w) h) U: Z+ iMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 l: ]/ s6 r* j: B9 LMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ d6 h$ E& i! u
}
! {; w( T3 U6 g8 f; H请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! p: G# \# O3 V% H0 x/ ? |