|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,# c0 {6 T" U2 P( |+ R; |8 ]
input mcasp_ahclkx,# \0 j6 L7 \7 N- ?
input mcasp_aclkx,( e% N, F; n$ E
input axr0,' i4 t# d) U6 j* u
% T' u8 ^" t- S) I" ]+ o9 O1 d
output mcasp_afsr,
* |! V5 c% d9 h5 Uoutput mcasp_ahclkr,
+ J7 j/ T$ b1 x( }- F3 Poutput mcasp_aclkr,+ I+ T9 W+ P! D9 Z
output axr1,
, r2 [8 e" `- t& b' n' g, @% B assign mcasp_afsr = mcasp_afsx;
: z7 I, ^+ G7 n- H+ Y: `assign mcasp_aclkr = mcasp_aclkx;; n' y, ^. ]* i# x4 F
assign mcasp_ahclkr = mcasp_ahclkx;
% A2 S" y* \+ f9 s2 \assign axr1 = axr0;
; U8 o$ d4 V v$ {2 _$ K7 l2 b' t$ }+ a$ `# J( H4 V1 v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) P% l p8 M& S2 v& m) o( z
static void McASPI2SConfigure(void)
# B9 U7 O3 _1 f$ s3 r{
, f9 Q- e; E% m1 }, a DMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ a" B: C7 ~7 O$ p1 N3 [/ F2 _McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */) w. A/ x0 `& M1 `, i+ ]4 U" w
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 D7 Z( i! y9 T/ z( FMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */6 Q0 V* S( U1 ^- }
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* n* R+ X" R/ m/ W2 E/ ]
MCASP_RX_MODE_DMA);) R( Y+ }" k8 E# o; `; O
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) @9 w4 y3 U1 L! m6 e+ @1 \1 lMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 A, @2 j& p s0 R- W5 yMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 |7 _6 ^+ e @2 {, jMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. ]1 G, y: H( _2 I+ I+ @/ i# \, BMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 @3 O6 j& N: e2 [' sMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
, X! d% L* o. y3 BMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 c7 a) L7 Z8 Q2 ?$ j& |McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 a3 q7 L4 l8 w4 y( ]3 {3 ?; F9 C& m# `
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 K) ?1 E+ ?5 `, f$ c. P& d0x00, 0xFF); /* configure the clock for transmitter */, z+ p$ t( @: l9 M
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" k& U9 g- m4 T* M7 |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * Q5 ]& q. R0 j' L1 ~7 z( Y% D8 {4 C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 G1 t- \9 ?2 }8 i0 v
0x00, 0xFF);; [9 s, g: z$ Q
3 }6 A7 _+ E# o4 v' U; J' O+ s0 O8 W
/* Enable synchronization of RX and TX sections */ / Q) s5 I: _0 {- |6 r: [
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */8 W2 O" f( r7 P0 Y8 v# x9 D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 l+ |3 f1 @% r T4 A, I
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) x& Q4 u+ Y4 h" ^& b
** Set the serializers, Currently only one serializer is set as$ Y) c" d- o, ?$ @. r; c7 `0 p
** transmitter and one serializer as receiver.
# V0 i: b: F& i& a*/
6 d* I) T) B* m7 f! Y9 _McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: A, _, d1 A' z" ^- U
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*8 Y1 w% S8 C" D' x4 v+ O
** Configure the McASP pins
1 _! X0 K( ]4 j2 o0 B$ I: U( B** Input - Frame Sync, Clock and Serializer Rx$ p/ M8 K) ]& Y; S( A/ Z% L! C8 o
** Output - Serializer Tx is connected to the input of the codec
: k* k& v' a3 j- u*/1 U! x: g. y. G
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. ]9 \6 a2 \2 j% K. _
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 ^ w3 A+ A# Y- B% f" s0 \McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) ~) f5 k# v' b% m
| MCASP_PIN_ACLKX# M% d, r; v3 O1 ~* P
| MCASP_PIN_AHCLKX# n" M8 W. f2 q/ n/ r
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 O6 v4 X0 G- @) U' P0 ], U& o
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; s# p8 s3 G+ s9 ]9 R' b
| MCASP_TX_CLKFAIL
4 ?6 o* C; i6 o/ a) B& ^| MCASP_TX_SYNCERROR+ _9 p. u0 u/ ?9 b) i; U6 ?% o! {
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 V: b1 b+ m5 a7 a: {" l- P% k) u# }
| MCASP_RX_CLKFAIL
0 ^0 ]; W( y- S+ s2 F. q| MCASP_RX_SYNCERROR
& z1 U9 b, u: S% h) A/ G| MCASP_RX_OVERRUN);& c8 k1 Y( q- W! X& o4 g! _4 ^
} static void I2SDataTxRxActivate(void)5 D; t# ]3 P7 ~# F2 K7 w- ~' O
{3 M* v- Y' t+ S# F7 ~
/* Start the clocks */
0 n/ x1 i! I% v2 qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! b) B2 @/ X. J% |7 {3 a# LMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; F2 ?" A8 } a6 J! r' FEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) M' p; w7 }8 `# X
EDMA3_TRIG_MODE_EVENT);4 K; i# G. v! r0 _5 _' Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, `* v* }# H) e. ]3 G4 i2 \7 c. HEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */3 K2 R0 {/ Y' u# O; d p' M7 x
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& f& @; Q9 t1 D
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% Z" }1 P# c9 m W4 S5 Nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */! x, R) Y D& [& ~6 b
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);* b8 J# M3 H! x3 @
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);: `0 ~% R" }1 r* g. E) u
}
0 ^ m+ z0 {* L; e) L" h6 X. W请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 Z( o$ m8 d4 k, d |