|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,5 z' J+ d$ h" k% ~
input mcasp_ahclkx,
+ o3 {: C6 m7 F/ {/ m/ T4 y- C* Ginput mcasp_aclkx,
6 D6 t) K1 ~+ A# u3 sinput axr0,
( G+ a1 x) g- c- X; \. v; u Q) h' n
output mcasp_afsr,( Q1 n$ T# H: U
output mcasp_ahclkr,
1 b# f% }3 o" v y$ Joutput mcasp_aclkr,2 L5 w6 P, S. s( G
output axr1,
9 v2 \# l8 l5 P/ [: C" X4 K# {, b assign mcasp_afsr = mcasp_afsx;# u, b. c9 ~6 P; k6 z
assign mcasp_aclkr = mcasp_aclkx;
6 b' a" k$ a6 G+ U% F3 Xassign mcasp_ahclkr = mcasp_ahclkx;
, h1 ]; S; \" a2 j) N) vassign axr1 = axr0;
( m9 q! o" O9 c- _7 ~
" X$ P0 ?! n- i) H3 j6 E在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ H, y. r2 q% J; gstatic void McASPI2SConfigure(void)
/ }9 J. E+ X- c) {{
! W. o- Q$ D" eMcASPRxReset(SOC_MCASP_0_CTRL_REGS);# a) k J) k& G& w( H
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
/ [/ h& c* l6 i0 gMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ \2 Y& B3 y9 C, Z. A/ _7 `" R
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: w% \! y, g) \- b& s
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; ~+ h, t- n7 P0 d2 g( gMCASP_RX_MODE_DMA);6 \ g- |8 Q( y3 P g9 s$ }5 F% x
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, n+ g; H/ J. C5 l# F' y# N0 w; @
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- v7 b9 ]! S: _. Y% h
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 N5 B* x; z/ e; c/ s' Y
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# l0 `: R4 t: ^( A7 z( f2 m2 t! zMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. g: ?) |2 ^& D& j" M; WMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */7 ~3 O; A' t4 m% c& \* j B z
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);+ e# S, u! U& u" n) ?/ J, F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ ^6 q ~) b4 h2 A/ T8 V
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 Y" ?) M _6 f0x00, 0xFF); /* configure the clock for transmitter */) k* h3 T3 w" m6 g, F; d
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 f7 p: e1 D5 R( l3 r K
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " m/ `1 G- \% ^& P. q* S8 X
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 Z0 O% j, `' {: c" w, m) O
0x00, 0xFF); u& v9 {1 G1 {, ~. X4 q
: x g' D" u) ^- U z, v% `/* Enable synchronization of RX and TX sections */
, {3 u* m# b, X" SMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */$ G- z: V) _% T8 A. t
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& C& N) g5 S3 V c; i/ P0 BMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 U/ k: W8 d. }6 L2 ]$ h** Set the serializers, Currently only one serializer is set as* ^& F8 z) R/ W v9 u
** transmitter and one serializer as receiver.4 V9 C$ \$ y; j* H! `" J
*/
7 f! a V. Z$ Z% n' ]* C" Q, TMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 Y* J5 t0 ?' V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
3 R* X3 ^, d4 S8 R1 |9 N3 h1 u** Configure the McASP pins
8 ~2 G" A' g/ ?** Input - Frame Sync, Clock and Serializer Rx
' X$ ?% \. a7 [** Output - Serializer Tx is connected to the input of the codec
: @8 Q) j" c* ~8 r; }*/$ ~ s3 M" c- j# F8 W" z' V9 G" }
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! l+ N, w4 S5 h, ^* y7 j3 r* ?McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 l$ G Z5 g2 d. u8 p5 WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 I5 U# t) X* _7 M
| MCASP_PIN_ACLKX( z! j, t$ j7 g6 N a3 E) S5 _
| MCASP_PIN_AHCLKX
, t, Y2 e/ a0 f8 R P| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ {5 w! |* v; Q' N
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ ]7 {. T; b( p| MCASP_TX_CLKFAIL
; \/ V" v8 N* {; I8 ]5 X0 m| MCASP_TX_SYNCERROR4 S- e( f/ N) e7 V
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR / f7 s/ A& g( M) X
| MCASP_RX_CLKFAIL
! D; g D5 u3 {5 B( r| MCASP_RX_SYNCERROR
, i; v9 T$ p" i6 m6 m| MCASP_RX_OVERRUN);$ \! D+ e' C% ]3 X! ?5 ~
} static void I2SDataTxRxActivate(void)% J; K- ^( [7 T6 T( B) v, O$ B
{% e( {0 h6 }+ ?* G7 y5 o. e0 D* c
/* Start the clocks */
" T, Y7 m1 e) f9 ~7 oMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);1 h9 C0 @: T- ]: ]5 \
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 d; B0 m: J' E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ r' C- ]2 g9 {) G8 [; }: }9 R
EDMA3_TRIG_MODE_EVENT);& D, z4 Z# y- b5 c
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 T% F' B$ B( R& G3 @; p
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */1 u7 y% V* V* B3 Q; [4 _- H6 f. W
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
0 G4 A$ E. z" e& Q- ~0 ^McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
' B. t4 A$ P. x* \0 b. s& x5 Owhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
6 N1 t$ B: G9 N) K4 VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 g) t9 I7 T( R7 Y4 f8 MMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);" W3 N/ ~7 \# S1 ?1 X1 t
}
; P- K- j6 f; x9 O请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. z L" b4 l8 R& @, e
|