我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 f& r( @9 H5 Kinput mcasp_ahclkx,2 @% x$ j. D9 n/ l( j) {
input mcasp_aclkx," e& Q8 Z8 y( \7 \8 u
input axr0,
: r4 [6 E( j5 ]3 H, }' r& W. [9 @( R$ y. U+ m
output mcasp_afsr,
) c H& _- B4 y# Noutput mcasp_ahclkr,/ F. R* @" H1 {, e/ _# G7 o* s; D
output mcasp_aclkr,
9 A( C" j5 c1 U9 P5 E/ s4 Joutput axr1,
, ^& P5 M- T. d' [ H( n5 j7 Q assign mcasp_afsr = mcasp_afsx;7 e. e8 X8 p5 N. Z
assign mcasp_aclkr = mcasp_aclkx;& x& S; b; W* c2 e
assign mcasp_ahclkr = mcasp_ahclkx;
4 C' [ ~; C8 U9 F% B, Zassign axr1 = axr0; ( O2 ^8 o/ h! D5 g7 ] T
+ \& P/ F1 t4 R0 m! M- N J
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
9 N: f: `. c4 `; f- z, \* b3 Xstatic void McASPI2SConfigure(void)' L! k+ d O, A2 s) v
{
; ^: |' b. p |0 ~McASPRxReset(SOC_MCASP_0_CTRL_REGS);2 G' }$ H* h% i5 ?, N
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */2 {" j7 m0 y3 l+ e1 m% y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, ?9 H: U$ B& E7 {0 t4 ~McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */" t9 \9 l) ^) o* G. u1 e
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; v# R! o- n* ?1 c7 Y
MCASP_RX_MODE_DMA);: o8 u2 I) K$ W8 m0 I
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ }4 Z: \3 j" n1 U8 ~+ |3 \* H* u
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 S- l: d) p9 S7 O2 _; n3 ?8 A' `# E
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) Q, k& ] O' j( o
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: \' z+ K( ]$ V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ E0 S: p; @. |* E$ g4 @# V6 t C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
/ A/ O" r( k+ s8 N2 H; gMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; `9 o2 \" \- X% U1 J& L! @McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 n; R% u( E& s8 w
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 h2 u) j7 Z6 ]' B3 X2 E# \0x00, 0xFF); /* configure the clock for transmitter */$ ?5 L! H4 t+ w* R, Q/ M- q0 ]
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& f, g5 a+ r8 j- m( f. h" ^5 g
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 V) z5 `; E4 g4 I7 u% vMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 s$ y2 |6 i( o' w: T
0x00, 0xFF);% y+ ]$ c' W, i2 k6 y
H; y" w$ C2 n, { T/* Enable synchronization of RX and TX sections */
9 a3 c. I5 r" P4 |) JMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots *// ~3 y" r4 L5 _% W4 }
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& r! b/ ^) g# c# u: K8 e9 |McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
) z# r* n: R: }1 r5 X. z** Set the serializers, Currently only one serializer is set as
. n( Y1 |; Y2 y1 D: _# x) T! C; b** transmitter and one serializer as receiver.
" i; l `* m- U0 Y5 k0 e*/
" x p, N( X9 N+ L9 J: E* v+ N6 dMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 t, F8 L4 B9 p: d; t2 m g# j( x7 ` NMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
: D/ E9 a* n: w, O0 v** Configure the McASP pins
, a4 X! V% Z6 y* i** Input - Frame Sync, Clock and Serializer Rx) j1 _5 i! r) e& L* [
** Output - Serializer Tx is connected to the input of the codec 7 T. a& J# x' t
*/
: o; c: D7 r5 i* G* |/ AMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% r" ]' a/ D, R% y. C- L; i6 sMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) J H9 L* o4 j0 e0 Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ i, R. S; s/ j$ x5 n" \
| MCASP_PIN_ACLKX7 ]4 J+ t: B% k- I
| MCASP_PIN_AHCLKX2 M2 q* {! X+ e1 U% U, |9 S
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
/ r5 D- l, q4 s; W6 BMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' p$ Q8 a9 \: P3 T
| MCASP_TX_CLKFAIL ) t9 n {4 L$ }2 d) T, k
| MCASP_TX_SYNCERROR( y0 u; E7 w0 x3 z! w
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ) V7 O4 E' C/ \5 O: A X6 X1 X% @
| MCASP_RX_CLKFAIL$ {- G- b6 d( b$ x* s
| MCASP_RX_SYNCERROR
+ z! F5 h* ^, b* ^! F$ j| MCASP_RX_OVERRUN);2 Q" l) G% C, u5 Q. w6 o
} static void I2SDataTxRxActivate(void)
; A! v: \8 ~4 |; R W, q9 |4 a{
; l1 h" f* m% w9 F0 d/* Start the clocks */
( e0 ^ q6 X9 Y/ j" C2 {5 HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' Q: g- a9 m* R6 o7 b8 i; VMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
% @, \7 B% j, w* f' E$ }9 [EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
. p9 t& z/ S' Z( N. F0 O }) g6 ^( _8 bEDMA3_TRIG_MODE_EVENT);
8 N( i3 }9 ]6 ~9 ~EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( v! }# n% z# Q: ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */7 A$ b: z! s' m6 F
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. ]5 Z( `- [/ R7 G0 P2 jMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
- J* @& e: m4 N2 V6 i0 Swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& s$ h9 Z( }( `: [0 R* \7 R
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 M8 T7 E% g4 d2 u8 |3 G4 Y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; g, S1 j8 G I. c- t. i7 Z* ^$ Y
}
! G3 w0 R/ l) |; u5 H2 ~- K$ D, a请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ R, f# K4 l4 d
|