|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
- ^; [( T' t/ g0 L6 h1 _# pinput mcasp_ahclkx,
) N, g; D1 s. M6 _; |input mcasp_aclkx,
( j# f! E; z2 U/ T8 s6 zinput axr0,/ R; F2 \) N9 T' o
' J1 `8 u: c) _0 F$ y7 y
output mcasp_afsr,/ `9 _6 N" b0 _. M) B4 d
output mcasp_ahclkr,6 n* D7 N' @) }
output mcasp_aclkr,
! a& M; N: h: Y- S! }5 koutput axr1,& p$ F# X; ]4 ], v3 J" i
assign mcasp_afsr = mcasp_afsx;
0 W, Z0 X/ I. b$ uassign mcasp_aclkr = mcasp_aclkx;
5 f6 A7 N4 j( d* Y( w' jassign mcasp_ahclkr = mcasp_ahclkx;
5 l% H' ?$ u- I* C a+ |: S9 P3 Uassign axr1 = axr0; # B# S2 i; q2 x3 G
9 U1 _8 X. ^9 s8 c4 t ]8 N在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 9 H6 v9 V0 n9 }) R
static void McASPI2SConfigure(void)
0 L7 M' R l6 o5 x7 j# s" ~ T{( x2 ]5 ]$ q- X8 v& C
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( r' ]) _$ G& n0 w; b% tMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ V/ o$ a1 S9 F) T% ~
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 c: q- b7 I# G+ ]8 R
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */$ u- v0 d7 A0 E/ N1 ^. U' R$ r, c6 G
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; X/ _2 Q+ E; ]0 R5 I2 v" X" L
MCASP_RX_MODE_DMA);$ ^9 z6 y y9 u4 a |7 K$ d3 ^
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 ~* {) Y, g) [$ lMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 [0 J- U3 u( M3 i' n6 iMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) T$ C6 l% c/ j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' v( w6 n/ T' O; H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: Z, V2 f3 f- z/ ~: {MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver *// a ?' |5 T1 Z: j
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, t3 S: D1 a: s* { C% W) W$ IMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 q# @7 P% K v$ m7 \1 z6 G8 S, hMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 k$ k. m0 V) { b1 R+ {
0x00, 0xFF); /* configure the clock for transmitter */
: b# p- \: c6 q. TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 n+ W& F o( d( [1 e4 MMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
0 z; E$ t) u5 s: m6 [McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ e0 O% f$ A3 O) \, E' f) {
0x00, 0xFF);
1 w0 ], f. @4 v' S* K
S7 Z$ B$ q& o, j/ p* l; P4 [/* Enable synchronization of RX and TX sections */ ; a$ f; a/ o) @
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
* I8 i5 A& a. ?: i% ^- rMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
t+ i0 ^+ N( F( KMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
( u5 b8 X8 h( t; U2 ~** Set the serializers, Currently only one serializer is set as
8 W1 t) Y* s' G, n8 k** transmitter and one serializer as receiver.
9 I; z) {" s( r*/0 p* {' d! ^# [+ U5 D
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% ]5 K* ^8 ]1 \, \ bMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
' Z. I9 ]3 F7 c** Configure the McASP pins 7 [2 g3 d* o- o. v' C. |# g* @
** Input - Frame Sync, Clock and Serializer Rx9 y4 c+ j) I5 V. P7 H+ }0 L
** Output - Serializer Tx is connected to the input of the codec s" [! V9 ?5 Q+ b. \) l" Q, L2 Q
*/
' S) N$ h; q4 r% P; ~McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% x% x0 o0 U" i# ^
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% _6 {$ V' ~3 O2 p: b
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 R. u9 z0 X3 R" E
| MCASP_PIN_ACLKX' a& Z4 h2 X2 R* R3 A9 Q4 H7 m
| MCASP_PIN_AHCLKX
* Y9 `: [$ c u7 [! l& v9 Q* Y8 Y| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */9 x) I6 [; y7 w- |! z0 A4 P4 L& f
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ L% ~# ~6 n) `9 e* {3 H| MCASP_TX_CLKFAIL % |" h& @2 v3 Z4 M
| MCASP_TX_SYNCERROR
w( `0 w& S2 ]2 c| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 [' D; P$ ]: M+ |9 P| MCASP_RX_CLKFAIL
5 n) ~" x* B: G0 s6 i8 X% ~| MCASP_RX_SYNCERROR # B* V: e& F1 i# K
| MCASP_RX_OVERRUN);
- b2 J9 m$ k( E& O# G l F, [1 k} static void I2SDataTxRxActivate(void)6 n5 L/ R% w5 q8 ~8 \
{
9 b/ w( i! A, q( Q/* Start the clocks */
% ~) j1 o. Y) Y6 jMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* t! h! [8 v* A+ X/ I9 DMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
1 U7 O) ~* n& Z+ c: O5 d! X( M; MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) k3 `" K- h9 T2 m5 r/ KEDMA3_TRIG_MODE_EVENT);2 d! _, }# Q/ p6 f# j/ g
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' b) l. Q) n9 n: l( H1 {/ rEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */* S% K% X: b/ y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" n( H7 s+ _* ~6 v* K- `
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
, W/ l5 u6 |4 i' h. p$ D2 S. gwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */, P& B. z# [6 ?! q" O, M
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 a& C+ |% T1 j$ t$ kMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; z5 _( {7 A: s+ y1 Q1 [4 y}
7 G( J6 P" F# {% N4 F9 X m请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , \: @! |% i$ t, D* E) d, s; M
|