|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," A8 J/ Z$ r5 i
input mcasp_ahclkx,1 `( y1 w4 N2 |, }) V7 Y
input mcasp_aclkx,% s. S8 X; c. q) l" e# q/ }+ A
input axr0,1 `/ }. n- B) R* ~- c2 N8 w8 T. I4 b4 D
% \7 m& s. Y% s$ Routput mcasp_afsr,; S3 u8 a/ l) E+ w9 C- n: D, p
output mcasp_ahclkr,# h8 M/ P9 I5 C9 N
output mcasp_aclkr,: S/ W1 W, b& H: K3 X4 u1 i- J
output axr1,/ c& j- f2 `$ C$ X4 F
assign mcasp_afsr = mcasp_afsx;
$ H* I6 `9 s Y0 }assign mcasp_aclkr = mcasp_aclkx;
! B) X& L4 i( I! M+ L1 O) V Vassign mcasp_ahclkr = mcasp_ahclkx;3 q% @3 u7 U! d/ R) ?
assign axr1 = axr0; ' i. o; M( G7 V* e& c
1 M( }$ h2 ?0 d8 o, y# ]# F在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' A+ w5 @2 y7 c( A, d9 B! y6 Q; _
static void McASPI2SConfigure(void)3 w) D8 o; L, [4 i1 a$ q4 H; Y* v
{. l7 |; u/ x5 Z, X/ i$ Z5 W
McASPRxReset(SOC_MCASP_0_CTRL_REGS);# T0 B! d0 v9 I3 I
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */6 `( G5 d7 [' @, }1 C. T% {: l
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 D6 } C3 q( s6 Z+ tMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units *// G7 y7 ^0 M1 k. V ~& Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( Z7 J7 ]' W1 @9 w% p* F
MCASP_RX_MODE_DMA);# X+ l) w: f- Q! P4 Y+ E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! ?4 J" l# r9 Y- Z$ H/ E4 P- LMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% N$ L4 ^( E, n& p6 s6 n( _' \
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 f6 O2 d9 Q+ z% l. d. [
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);1 g+ q! E7 @" E# `5 B2 I0 {
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * @" o W* M- C6 d3 W* ?$ v4 |
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */5 R- I# W+ i; w# Y6 ] a
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; m! h0 o V8 K7 h: JMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 Z. B6 d$ L* {+ [/ _; ~McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ Y/ k+ y' U O5 ~+ B: n$ K0x00, 0xFF); /* configure the clock for transmitter */
4 A. N) Y( R' x% gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ X# Z( i/ d9 M* B" g* O' C7 m$ gMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! |0 N' w- @3 h& p
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) e+ R& j& Y) g/ y. m1 i0x00, 0xFF);# I5 a$ g' a& Y: i6 U
3 i8 C% {" C- e! D% }/* Enable synchronization of RX and TX sections */
* J4 q% f" n* o, H2 h. p' }McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
# A! m ~6 }( M: oMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 q; u( @* I5 k& p, ^McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*# ^0 X2 T1 c9 y! ~- @
** Set the serializers, Currently only one serializer is set as
# B) |7 v+ \6 A9 e2 D! Z** transmitter and one serializer as receiver.$ l: M4 m9 W. P$ f& Y$ z" |
*/) h& h8 v: H( a! R$ N) \
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! w7 k9 V- i8 \. @
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# u' t% s2 n% m. G** Configure the McASP pins
, C# ]( |. g* K6 h, ^** Input - Frame Sync, Clock and Serializer Rx. E1 [& l; |& P% a5 L$ {
** Output - Serializer Tx is connected to the input of the codec
, Z. o0 {0 Q6 C1 C# m*/+ d8 u; {! [6 ^, q; {
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! R: y2 S# A0 }. C4 ~5 t
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% C8 o5 v6 s! g' B
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) K2 v2 D0 V! R e s- X| MCASP_PIN_ACLKX8 ]' D. A0 s9 L8 `" j7 }: k8 K$ h
| MCASP_PIN_AHCLKX! O! r1 |% F q5 Q
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */8 ^: t+ ?; c9 z' }5 v& M. e) E
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ( K+ v& i' l- e
| MCASP_TX_CLKFAIL # C% [7 a& ~7 G! I8 O
| MCASP_TX_SYNCERROR9 T& p# l- D$ H4 r! E
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' Z- P9 u1 H* N% B% |
| MCASP_RX_CLKFAIL4 B4 Y* `6 n) J4 \$ L/ B/ Y3 k# \
| MCASP_RX_SYNCERROR
5 {4 j1 J; E8 a. l: p9 ]| MCASP_RX_OVERRUN);
) M8 s3 k# C, G/ ]/ Y} static void I2SDataTxRxActivate(void)$ p6 I& I, w: F9 ~$ L
{# f5 l" a) Q1 I- |
/* Start the clocks */$ w% ?6 H; U" }1 O" K" f% t! Y1 \
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; g) F# X) H( _" e* u) J* W$ r* OMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */# C* o* l2 h2 i; s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% I; W4 R; [. r2 E& K8 S5 `& v1 UEDMA3_TRIG_MODE_EVENT);
- z0 j9 K: W5 y, d/ tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* Q, d! d3 u: D1 ~$ g% P* [! ^EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */5 k& V2 w# d4 A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 L( T7 \& t# F) j8 |: F
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 I: y8 m' F$ f/ |, o) _: Gwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
0 M# H" c; Y ~6 T' HMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" v. k. |% d$ U; Y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);) p- L# D3 f4 w- _0 M8 k3 A
} , {+ M. w; V$ D# F2 A: d
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 |) X- }! n6 b$ g9 g |