|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
) d5 ~9 h' R/ L3 x% Winput mcasp_ahclkx,
4 l, b5 `! _" N4 sinput mcasp_aclkx,
7 e8 D8 @; ~# l$ tinput axr0,
# Z/ o9 U% f3 q7 m$ _- y6 C# T T* o5 _/ p c
output mcasp_afsr,
- S6 k4 c# g, v# A( \output mcasp_ahclkr,
h! u* ~, i. ], t9 goutput mcasp_aclkr,/ a6 b9 E9 `2 |; r
output axr1,$ T! a0 e R p( O8 U. [# {
assign mcasp_afsr = mcasp_afsx;
* @1 q' ~: l2 R# }! k5 passign mcasp_aclkr = mcasp_aclkx;
( k' y, i. S0 i* B( K& X* j Kassign mcasp_ahclkr = mcasp_ahclkx;
0 a: X' {7 a% b4 Wassign axr1 = axr0; ( H \7 l3 h" }( U8 s) Z# ?8 D) b3 u
* z& E: |. ]# o
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
" M% n* n3 w v" p5 jstatic void McASPI2SConfigure(void)
! }) J/ \4 W" v& \1 d9 Y{
! u/ J, c3 X, M g! v3 |5 }McASPRxReset(SOC_MCASP_0_CTRL_REGS);9 d' X: i( D0 q; F( d L
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */2 [! B. T: @) N6 P/ Z: Z
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- v$ z- ~7 T5 T0 l. j
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: ?9 u( U* ]6 g. N) E: `
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, f+ Y- h" r/ y- T3 x1 {! VMCASP_RX_MODE_DMA);
0 S6 H8 I/ J8 J! dMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ I. _0 E" {+ |& f$ V3 iMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 I8 ?+ J' \" j: f. R
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 K* w4 C. g1 GMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. m# R% G. e& K, S4 M9 CMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - \( ]( O# B7 ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 @3 Q5 _0 \" p5 a
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# l; p( d9 l3 u* ]! {McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; s' l8 `, T' J$ C
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ p2 o) W, q" P9 z2 u0x00, 0xFF); /* configure the clock for transmitter */
4 V1 x& U- ~9 I* e3 g* |) AMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, D" ^8 a( R d1 u
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ m% @& f: Y% }! w
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 s. E1 {! v, B) l# P9 W9 p0x00, 0xFF);, K4 }' M# E- z T" f! C! V3 Y$ k
R" p0 G& j1 G% z8 N! v' k% J
/* Enable synchronization of RX and TX sections */
. }( f1 x- S0 J3 A- `0 f2 X3 ?' fMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) R& t$ w' [+ V. M$ G r# yMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 k# x8 \1 K/ K& ^# X# ^' l
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
8 C! b+ a! |+ \( G$ T** Set the serializers, Currently only one serializer is set as$ f. X) _9 `3 x; e; f! Y
** transmitter and one serializer as receiver.9 C* \& t8 M* E
*/
+ C2 m( s6 A# }1 IMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* C6 v5 U( {+ ?( R) @5 A
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*+ v" x K4 G5 G2 N9 d! G: v) i2 K" H
** Configure the McASP pins ( S6 v& [- }2 a) d
** Input - Frame Sync, Clock and Serializer Rx5 n) c3 ~! w J1 ]2 C$ e3 J* G2 Q, W
** Output - Serializer Tx is connected to the input of the codec
6 R/ c7 r# F+ \8 _/ [- t*/
9 ^3 \- P: U% ~6 @" e( g8 g. NMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ r. j, B+ C6 q) i. A8 ], qMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, c" K& L! U" L: oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: N4 J1 _/ I& q( E( P0 U. F" `% j
| MCASP_PIN_ACLKX1 u9 i0 Y; U, G2 ~8 t" g
| MCASP_PIN_AHCLKX
) S: T+ N' I" [& C, y# Z| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 \0 O1 N6 g' a/ p e
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 Q6 E" s. Y# a4 A% u4 J| MCASP_TX_CLKFAIL 4 @" ?, {: \7 e, Z# k4 }
| MCASP_TX_SYNCERROR2 b/ X3 X) v# W
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! K* Z" r& r# B1 _( S| MCASP_RX_CLKFAIL; Z! }, Y$ S$ G" ^2 `
| MCASP_RX_SYNCERROR
3 h5 s! N8 D! A3 I% ^0 B| MCASP_RX_OVERRUN);8 i6 I' M- f5 i+ B4 j$ \; W
} static void I2SDataTxRxActivate(void)
G; ]6 N* O( A{
' y! O" L9 r6 U* t6 A9 A8 D/* Start the clocks */$ r+ x' D5 g3 E! ^8 g
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
( X/ {& l7 ?: B, g8 TMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */2 X7 V. Y! w) U
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 }+ W% \! v H4 ]4 j8 v* VEDMA3_TRIG_MODE_EVENT);
/ U" u( g0 p" p* T& TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, U* L& \7 _2 s% A9 m) Z) e$ G5 g
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 K- V$ ]3 y! ]" c5 a% U; r& U
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( f9 z3 }+ j9 ]1 D# eMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 w l2 D# z- H
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# [2 ]0 E* r$ f1 H7 C$ @
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);3 C2 H- J& i% ?* Z% B8 A1 I1 w
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, X# B+ U2 s( E: \4 \8 J+ A
} 1 ?! a# Q5 g' a: I
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 E6 a _, b. z/ M/ l" Y |