|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
& B4 C4 |, K& q8 q$ _input mcasp_ahclkx,
' z1 ?5 f4 ?: [0 C* [( xinput mcasp_aclkx,
9 w+ {* t, @$ sinput axr0,
* [( @7 s7 x# }9 x* x- m- m- [" @5 Z1 O, [/ r5 k
output mcasp_afsr,$ g* L$ i1 p5 @, M+ b, a
output mcasp_ahclkr,
8 {+ U% n( H( j, ~4 l* ooutput mcasp_aclkr,
6 B" I( {/ B# o4 V2 `output axr1,
2 Y# Y7 K M4 S; c7 U: t assign mcasp_afsr = mcasp_afsx;
1 }" W5 M9 z" S7 x5 Z' yassign mcasp_aclkr = mcasp_aclkx;) K0 U$ a7 i- e
assign mcasp_ahclkr = mcasp_ahclkx;& Z3 G! A$ _& ^4 t3 D. I6 B1 _) `
assign axr1 = axr0;
' b! D* @' o5 k; J4 P* I6 Q
( q9 L% `4 h7 b4 T- Q8 B( J在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
! A* U5 Z) n3 g m% o7 Mstatic void McASPI2SConfigure(void)1 Z5 |* F- X; |7 d6 w
{1 \ H: w0 c+ b' M$ ^: X
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
# ^) _3 ]# \1 }1 x" ~. fMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */# _( ~% f# c% w
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); [! F d* H: I: _ A5 Z* i) v
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! u9 G9 ]$ }8 _# E! QMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
R6 p1 t+ c+ T2 i2 _% D- QMCASP_RX_MODE_DMA);) r8 x: A. W9 G2 v" d/ l& L9 {
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! E- Q! p* B1 N$ K K
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* O) T+ F* T \+ ZMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 k+ l) V( d3 `! s9 i; C5 i
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 @6 V1 R8 T6 }McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % V' M* W% C+ w6 e! L
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- \ V1 l& s4 e' @+ n! {# Y) o) s. NMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; W3 h9 l& d6 hMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
: ~0 o3 K! l3 y( r! V, w2 c; f; H5 jMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 y5 n+ o9 t2 e
0x00, 0xFF); /* configure the clock for transmitter */9 V" u5 L% B$ j r7 e- ?
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! m$ U) _2 g; N \% yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / K8 e4 P; b; L" ?
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
& N. i2 I6 `& h- E9 i0x00, 0xFF);
; q( Q% P) o. w3 }
% r6 K: I* ~% M. Y$ W/* Enable synchronization of RX and TX sections */ 9 Y$ Z* Y5 W- s6 c1 n2 r$ q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */) A8 X: j' F9 y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. S/ v) Z( n0 ~! b0 o& h
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*" U" [1 I0 u ~* {
** Set the serializers, Currently only one serializer is set as% \1 x: C. `: ~. c2 V4 ]. S
** transmitter and one serializer as receiver.
2 k3 ~! c7 V t1 @3 W$ I# y1 O*/
: S# t/ d0 u$ v, C+ Y; Q. ~, qMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; }* |( l/ C$ ^1 XMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
% Q% n, b: k" O D$ K** Configure the McASP pins ( _8 \$ a& t! l) N0 s/ W# u
** Input - Frame Sync, Clock and Serializer Rx' T9 B8 w- H" j/ e. J" W
** Output - Serializer Tx is connected to the input of the codec 8 p ]2 P5 j" Q1 l
*/2 H2 m1 X1 l! c6 C1 ?9 h7 h( ~
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ D) b/ R) y' @% i4 d, hMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! {1 C2 I+ P0 J% R& \1 c$ }
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 v: K# M% g$ m6 ^
| MCASP_PIN_ACLKX5 k5 N" e4 _/ x4 ^
| MCASP_PIN_AHCLKX
! p$ h9 Z1 F9 ?5 i9 {| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */& q w/ r g# d) m q: Y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, b2 c6 u0 L& G+ t| MCASP_TX_CLKFAIL
; V% b; j+ L& o9 |/ n* {) u- J| MCASP_TX_SYNCERROR4 \* d/ d+ [! j) F2 c8 g
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) w, o3 g* n' _| MCASP_RX_CLKFAIL
! W6 q1 w2 [% X4 ^* m% e# r| MCASP_RX_SYNCERROR
" K! k! R. h# | E# K| MCASP_RX_OVERRUN);3 Y. v* e* @. x2 l `9 G: e1 ]9 I; A
} static void I2SDataTxRxActivate(void)
1 w* }9 {2 q3 C{
( }6 M T/ p1 k- B/* Start the clocks */
, N; I |1 i) j0 n5 o+ L: ?McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 A2 x+ M. a$ y# Y" T& i2 D
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 C5 U5 H d% w; j% a$ F4 i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 Z- i0 i3 I$ o6 a* hEDMA3_TRIG_MODE_EVENT);
2 `* p. j" w' B2 L9 V/ ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
/ O0 S5 i- T& M. B8 [EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */( u/ `0 ~/ b! W9 z" X, v
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% o! n' C: n9 G! BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
- ^* L1 O7 H, H3 x3 [7 xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, l+ |% ` A8 [McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( P: }( r. y* n( N6 A+ z2 zMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 n; H/ U" _9 ]! |$ d/ n}
m- ^' k7 c) K8 X请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 h [% _. x) g% L$ T7 }/ j |