|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,5 h( ~) k% x' W( D, [
input mcasp_ahclkx,
7 p% ^; a7 Y! u3 n. s6 `0 o: R8 o1 ~input mcasp_aclkx,# s" H2 N1 M+ J
input axr0,! [2 `8 H& o p% x
* d* \" L" w' G/ N
output mcasp_afsr,8 _* O! a m# t
output mcasp_ahclkr,( h4 J0 p2 A: f7 S) v0 e1 H+ G
output mcasp_aclkr,) d3 e& I [, C- A( {
output axr1,
$ P! U' v9 l+ K1 R- u0 S assign mcasp_afsr = mcasp_afsx;
6 `( T; G( v! G+ u2 K$ tassign mcasp_aclkr = mcasp_aclkx;* i6 J% Z, }. t2 ]3 W- ?
assign mcasp_ahclkr = mcasp_ahclkx;1 a1 T7 I4 ?" C7 O0 ` s; [
assign axr1 = axr0; ! S0 e7 z; M( N8 Y* x4 {0 A% D
+ e" l$ ?1 l+ t7 n: k0 d; s$ T
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 _: |: Y+ }% g. Vstatic void McASPI2SConfigure(void)
+ l- i9 N( q% `5 z7 e{
0 v% p( J# H* J+ K7 U4 e+ M7 aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
% A3 A" x: U' A. W( Y7 m/ ^McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */1 O6 `8 g4 B J# `. o8 \
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 p- x# ^( q, q4 \, v6 \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; d# I1 e' h( o, C7 aMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ k" l( h v0 P9 Z, I
MCASP_RX_MODE_DMA);2 b7 P3 H6 O# Z$ E: V1 @9 R, Q$ r) o
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 l7 m( q1 F' ^' y- X. ?( [
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */! b6 D* L2 k* G1 ~3 U m: p: o4 ?
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 R+ n% H' O. V4 TMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
" ]3 n% G" W: EMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" {4 H$ q4 z2 q! i1 g* r$ MMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ M) p; r( M) `( x
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( Z* B) y1 D" r; k- V
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 1 O* F R4 C! s8 n/ p/ Y; q3 w
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ Q1 M Z3 y/ E( K
0x00, 0xFF); /* configure the clock for transmitter */
& s) X# f& v2 ~" rMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 R5 @& g! j& w* }* M. L2 C7 s
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: I0 g9 ], \' {* p# SMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" P; W2 i0 j8 a0x00, 0xFF);+ D7 u A! e' H: g& g& c
0 ?9 g: m6 B. }, A" F: ^, m8 R5 \
/* Enable synchronization of RX and TX sections */
/ s8 V" h, O) m( [2 [McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ \3 g9 j9 A1 O2 G* C, f3 @
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
v1 Y5 @8 z( [& G; f2 EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
4 [& C6 x8 U$ e4 k4 C& R M: _** Set the serializers, Currently only one serializer is set as. ^; q$ j1 l+ M) N# q
** transmitter and one serializer as receiver.$ E7 i7 Y6 i. {: h
*/ I2 ?0 t R! ^: G' t0 Q' h4 M
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ T5 u( C% X. eMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*3 k& `1 t6 E7 z% L
** Configure the McASP pins
3 w# h7 {! g4 l8 [8 }# M: w** Input - Frame Sync, Clock and Serializer Rx8 Y( j+ s9 B; L0 m: T/ s& K
** Output - Serializer Tx is connected to the input of the codec 0 J: C7 \. X' D3 I
*/
2 a! P$ M3 I" k' IMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! o! @) k/ T4 B) C m/ p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ i( ~0 d, E" b( T; R0 d8 T
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& w1 k) `# @2 `, U8 |
| MCASP_PIN_ACLKX
# u/ O# w4 o+ A0 y0 y| MCASP_PIN_AHCLKX. s. p( _! k8 O; b- B7 ]. v
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */ d( y& v- h. c, m. h# q
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 Y$ D0 H# w" l X ^| MCASP_TX_CLKFAIL 4 q* z5 E& _6 Q, b1 r& O5 r4 V0 S
| MCASP_TX_SYNCERROR
- P- {0 m ^. X# @& x| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
$ i9 _) Q3 g# m* F- D| MCASP_RX_CLKFAIL
, Q: i5 W( n6 |) Q6 d2 Y| MCASP_RX_SYNCERROR
3 X: B4 L, V2 V3 K8 I) [| MCASP_RX_OVERRUN);% U; ]; F9 }& W& i& {/ _& u; T
} static void I2SDataTxRxActivate(void)
6 E. q* i; o9 `: Q2 |& T{+ x! R3 _) P: [' K3 g
/* Start the clocks */6 C7 {- j! i8 H+ y8 R( I
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ g: @3 }, e& f2 B2 y( n) \ F8 G- ]
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
' ~- x( j: E3 l: h5 iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 o( d" x) k& K" ~
EDMA3_TRIG_MODE_EVENT);
3 P5 q0 D0 I$ R* z0 x) JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, r9 K. C0 `0 c' ?EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */8 o" {8 y7 D7 T; R. J, X+ p
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' V/ }4 _$ q5 } C" K- g& XMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */6 d" M/ E1 X* t# D$ ?1 N$ f
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
* g' i& A( y& w( s. b% VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 m' \7 r: I% X8 U! b" d- s3 zMcASPTxEnable(SOC_MCASP_0_CTRL_REGS); R9 W! [9 _! _, f0 f4 E4 H
}
: s/ {8 n; a' `7 [请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. # E3 \/ S+ f% e2 p, C, r
|