|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
' o7 Y6 ?9 ^& Cinput mcasp_ahclkx,! {9 H) J% j) r' r& e. U
input mcasp_aclkx,- t5 N, V5 y9 c% E; b9 x. @& b
input axr0,6 t6 v |$ q0 N n# F
1 k3 s. N: g( @ C0 y
output mcasp_afsr,$ g; z y. S+ H4 F* `
output mcasp_ahclkr,+ E& P" h& Y0 ?2 M
output mcasp_aclkr," ?6 i5 o! ~. i+ i+ f9 ]* t+ _2 j
output axr1,2 A+ l* F. x0 n$ T( t
assign mcasp_afsr = mcasp_afsx;
. v: z6 e- E' N7 F$ t2 d# Cassign mcasp_aclkr = mcasp_aclkx;2 Q/ C& y/ Z: L! k0 @3 ^6 `; L
assign mcasp_ahclkr = mcasp_ahclkx;
+ J+ D- m( P8 S- t' T6 n% Nassign axr1 = axr0; ) v. c6 A1 E m1 a; l/ C1 E
' w. S K% H2 {
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % N) }2 J# a# t0 ?% Y0 J- b# D( d
static void McASPI2SConfigure(void)9 `1 v- v9 h. d; V% y
{
3 P3 g6 V6 _6 ]! u& h+ P, h2 X9 FMcASPRxReset(SOC_MCASP_0_CTRL_REGS);3 \: F7 K9 d) E' T( y3 H d0 Y
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */4 l( Y( E% I9 ]3 R, E9 r7 Y9 \$ s: l- K
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 v, a7 o: o& D ^3 HMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
$ C- R3 N8 D( D5 M5 b. z: h7 j7 x% YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 h0 A) s1 y3 o# H. G
MCASP_RX_MODE_DMA);. ]- Y3 r! A, D8 F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. m) h$ U" S) \
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' k2 F; D4 a0 @) |McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) C0 p( e7 c/ f4 ~6 Q5 Q) |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ n! _. j1 J2 ~& P8 vMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! H$ }. Q7 B, d; J' ]8 W5 zMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */; |$ D) d$ T' L5 A# W' `$ _$ T2 a
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ U) g! p& C4 h
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% N# _) I& x& ^ w- FMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( N( {: }$ b- o
0x00, 0xFF); /* configure the clock for transmitter */% W& N4 `9 r. i. p
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 v1 }9 I2 T$ Q+ ~4 p8 GMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. {- H7 d! W" U8 Z$ Z: vMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 I* p3 ~1 v0 v! g, E
0x00, 0xFF);& ] w4 `6 s- Y( s7 u
8 M! m- h* ^2 i: d2 G: q0 G/* Enable synchronization of RX and TX sections */ * _7 j7 r$ f5 U& x; m
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */4 a+ Y5 R4 m, {+ T$ t. T
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; r9 B* j0 U. ?3 I
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
5 J3 o5 [. m/ p; A9 b( W** Set the serializers, Currently only one serializer is set as3 k/ I. P! Q6 E1 \
** transmitter and one serializer as receiver.
+ U. Q0 y0 ]* j0 [ B2 F4 z*/
" [/ j3 ^7 x: E, n8 t: S4 h6 BMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. u8 K- e% E9 G. s& QMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ R% x4 i1 `+ @. x2 J** Configure the McASP pins % H* H- q9 S6 b7 P6 @
** Input - Frame Sync, Clock and Serializer Rx
r& z% D0 M8 A `+ s/ D** Output - Serializer Tx is connected to the input of the codec
; e/ |2 x) U1 M9 T*/- E) ? t) _' d: m
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 ~ i5 Y. I/ K* ~McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# @. h$ [7 ~# o. J0 d l. W
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ r e# a4 q- g* M4 c6 t a
| MCASP_PIN_ACLKX
! S; o' g+ P4 ?* G) W) J/ R; E* y| MCASP_PIN_AHCLKX
4 c. \* P) J) e P| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */( `( Q% m% `, b
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 R8 f+ E5 }* K+ N| MCASP_TX_CLKFAIL
) r. P; L$ F! _: v- y# j3 [| MCASP_TX_SYNCERROR; ]5 s2 D+ h+ k2 I, F
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : W9 l: R; d. P$ C
| MCASP_RX_CLKFAIL$ A) N) w' L- [+ m
| MCASP_RX_SYNCERROR
0 W& Q7 E! B7 [| MCASP_RX_OVERRUN);0 U# p8 F: D: [/ \: ]
} static void I2SDataTxRxActivate(void)% h- h" c6 M; v2 P
{
; j7 b" b- d6 N. @$ V5 n7 H' S/* Start the clocks */
. T0 p! C8 m, _$ U4 MMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
N3 n1 ~$ R# ^) c, y# bMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; l$ j' q1 t3 B, Z2 V7 B$ fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, {& g+ }6 P1 t& |( v* \) z
EDMA3_TRIG_MODE_EVENT);# k# @5 I% t6 M S
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 g7 R& j, k/ Z3 y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
" M4 T' t& F& M8 p7 M/ \, W0 qMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 t" I( r e0 M$ @5 LMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
& U! v- v" M3 d$ ]# mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
/ m# W* q8 z9 \+ U: t$ \8 OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 O2 \: `" p& F
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 w$ ~6 T6 r5 Q" h4 E' N/ K
}
5 ?9 e. `8 s$ E请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. s O) z5 S7 L' m7 j
|