|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx, A/ M7 _; b8 @
input mcasp_ahclkx,
% E1 Q+ \: f9 C9 Z4 h7 ~input mcasp_aclkx,
- i* Z7 q. J& p7 \& c0 T6 d! Z# Iinput axr0,
+ H( J/ o& V i4 ]+ v' j5 h' P. o% ]1 n: k& F! P& J
output mcasp_afsr,
+ Z* m) e7 V( \ ~% P( v8 Routput mcasp_ahclkr,
' |0 r2 P4 I) [output mcasp_aclkr,: W3 i. Y* }8 _4 y8 R) P E: N
output axr1,
* K2 B* N- n) G1 h assign mcasp_afsr = mcasp_afsx;: V1 {/ H! v N$ ?
assign mcasp_aclkr = mcasp_aclkx;6 j2 k% A' E J
assign mcasp_ahclkr = mcasp_ahclkx;
9 R+ P$ n+ R( X: qassign axr1 = axr0;
6 ~% b& ^# v A& Y% Y: g7 }" ?& M; q
% x4 ]4 N4 x" J u6 M6 J% m9 H在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
9 G- J6 _5 k) q: q- _; Istatic void McASPI2SConfigure(void)% D* u7 }2 m7 ]/ h& S
{
. `* v* b8 n1 r: Z- t# o: FMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
; {# I7 g! L XMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
& i9 ]3 R" H" RMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 ^) z5 O: {: M; O3 ]) m9 t! L/ Y Y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */( Z- h' |+ K. u2 p5 E& y0 y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ T" h n) b7 t7 r+ YMCASP_RX_MODE_DMA);$ D# C0 N5 [/ T6 |% _0 O2 j
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 ?0 B& E8 Z% vMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */' {2 p4 Z% F2 c
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. L$ o& \5 C, GMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 f! y4 F7 E3 I } q oMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, B9 W* d c4 k3 F4 z! p
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 F. c3 n: r: F$ w K2 [
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( K p) H; O4 J
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + t5 l6 p) a) y5 t" `
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) A; @. \; K* \# s8 A0x00, 0xFF); /* configure the clock for transmitter */
5 n% G. `7 L' b3 n( I wMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, G$ }* v" H( ~' e5 z& W! h) M
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( H% i3 u' B8 p. p/ D, O0 nMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; p+ ~* n& L7 _/ s$ B1 c1 `0x00, 0xFF);
. N- O; K: s I# f2 G% _
* m! w6 h+ I7 j. y7 S" G8 y/* Enable synchronization of RX and TX sections */ $ ?7 q8 I& B3 i" _. P2 B, x
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 |/ ^$ q" X' R7 f3 P( q1 S0 iMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 q. B: \" ~1 g! `# x6 ]; r9 }" rMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 I& L' l8 m) S3 C8 o
** Set the serializers, Currently only one serializer is set as
* s* k M) q( `) W& F** transmitter and one serializer as receiver.
4 m6 U$ `/ Z6 D" I# }2 B*/8 ]- N8 [- q0 p1 d$ E2 P
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 a* `0 M/ q8 p
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*' A: q# E5 Z. H0 }: L# H
** Configure the McASP pins
- j9 j/ ^1 ?1 o% `4 Z2 `, o$ h$ X** Input - Frame Sync, Clock and Serializer Rx: u; _. D/ A/ o1 ?( N: \7 o
** Output - Serializer Tx is connected to the input of the codec
w+ [) `2 h4 p) o! E*/! P5 k7 d# B2 S# g9 B8 L
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 a$ m! Z4 G0 s1 }7 d$ m4 \7 g; NMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& m% q9 l/ @) e& J* Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" i' Z7 c; A2 b, Z9 u| MCASP_PIN_ACLKX9 X& V1 i: e2 L3 H1 |' [3 e) i
| MCASP_PIN_AHCLKX
/ R: h4 {; Q7 }1 ?5 L# o( `/ J4 y| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */3 ~0 T, V8 D6 t% o5 q
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 q& b* v3 i* b( u) @5 z U" H/ J| MCASP_TX_CLKFAIL / w" }8 J) {0 n, K/ |. n
| MCASP_TX_SYNCERROR- o9 f0 }% a+ G- a- R
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 n; E! P4 D P* f* R| MCASP_RX_CLKFAIL
! o) M% j) I! W# @4 z| MCASP_RX_SYNCERROR
+ a) J+ Q" V* V) H| MCASP_RX_OVERRUN);7 ^ V A+ I' @
} static void I2SDataTxRxActivate(void): k! ~3 H8 X$ X- b
{
1 T* P/ v. `* B/* Start the clocks */! h, _ B) Q: E' K+ B
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; i! i2 g! ~. YMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */+ g( |- U ?7 x- M! Z0 t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
3 n% V2 p$ a0 N1 W) {5 W9 NEDMA3_TRIG_MODE_EVENT);+ [/ C2 j1 s8 d& d; C( E: M7 B2 W+ Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
3 g6 }0 N7 x/ @5 CEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 U" ]& X/ v9 x. ]! W
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* T+ W! \6 p' k3 `3 Q# f' y2 XMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */4 U2 D+ p- H' I, v R1 p" t8 ^( g8 p
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
% x9 D! q8 h, _& a2 d$ jMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);) R& F" A( @ V1 |# X2 H V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) W6 C3 k7 Z$ {. |} + Y P T+ O# k) w
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. q. ]: `- z# Q# x y8 U" G/ ^
|