|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
# I' }0 g1 z+ Yinput mcasp_ahclkx,. D. X& Q$ V- q
input mcasp_aclkx, e' N7 a9 r7 D6 P3 i2 B2 r3 k
input axr0,
3 U' v- K! G$ ] P2 z% B' l* k( D7 N& ?( x, U6 D
output mcasp_afsr,# [& z' C( l S6 E6 r
output mcasp_ahclkr,
/ n2 L: L: u0 U& T/ p# goutput mcasp_aclkr,5 P* D4 U7 x9 o" [: |: {
output axr1,
9 T! k1 c3 b" X% I assign mcasp_afsr = mcasp_afsx;
% c" Y# W/ Y' k1 a6 K$ Bassign mcasp_aclkr = mcasp_aclkx;0 q. s8 q5 g; u: N
assign mcasp_ahclkr = mcasp_ahclkx;1 B$ K+ e. X. W, \ F
assign axr1 = axr0; 9 _7 r+ @# T7 Q: C& k# Z
8 e6 T( }" x, {+ L# B+ @; E
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
) Z+ ^' f3 z( [7 Bstatic void McASPI2SConfigure(void)$ l0 i9 L n4 C0 o6 I2 }
{
- Y; k7 Q% o' E v0 J( VMcASPRxReset(SOC_MCASP_0_CTRL_REGS);& Z: E+ O0 U4 P7 ]' {4 a; \
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
1 M& ?' \- f7 k' [3 n) h3 r& PMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 L) u7 Q f+ p% _, p
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
7 t1 }7 M* u; x6 K' nMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ `4 O- o3 u: P+ G) wMCASP_RX_MODE_DMA);+ B) a$ K) L# B
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
d' ]1 S! j1 eMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ b/ u; i* i2 X$ E% b& ~1 EMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , ]$ a! f) I; `! l- i% e
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ p8 o+ O2 ?" p! |" G4 k" J
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& I6 Q* Y5 l3 x- U% [ `+ _) |$ rMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */. v0 j# E3 A$ s
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) k& W# i! w" q6 g& ~& ~McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . e# N0 J5 e: O& R
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 g# i1 }- z( Q8 b3 i0x00, 0xFF); /* configure the clock for transmitter */ r1 {8 Q& ]7 Q' e: e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 C* u: ^! b: O l) T
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / N. `- R- Y+ E C% A9 ?- Y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ ?3 r, [- X2 U, D0x00, 0xFF);
+ s- P% K- P( j- h- i' A0 _
' A J: Z( c3 C7 g( K8 W/* Enable synchronization of RX and TX sections */ : D9 l: j( h4 p) U* ^2 W
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
5 V3 g9 Y0 F; V- [McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
$ n) J; B2 F: `: T. PMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*6 n8 D9 o, c; q% ?% k X: M; q
** Set the serializers, Currently only one serializer is set as
" p7 g" K8 I+ }** transmitter and one serializer as receiver.
C# O& e& F2 A H8 S# t*/
% k5 B# J. ]& \* N" q! LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) l. d5 v/ X- w, Q
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
5 ~, B4 S2 }" V" r9 x. L3 y** Configure the McASP pins 4 s1 t9 A) f( G0 [1 t* }' D" g
** Input - Frame Sync, Clock and Serializer Rx, Q# R/ c. P& ?/ I8 b3 j
** Output - Serializer Tx is connected to the input of the codec % M( u" \% }, r' [' w
*/. ~7 p1 M7 h2 ]! J" A
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) e+ Z0 K) |( G5 E9 F6 T1 ?% g
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, A8 p3 h7 Y, t! V0 O
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX9 e7 G( f! L! U7 ~0 t+ O8 g
| MCASP_PIN_ACLKX3 o/ l* ? k8 K$ q) {; J
| MCASP_PIN_AHCLKX
) {+ B; z1 z L- J' i' m| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */2 `1 I3 Q* C8 O. h
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR - \- Y2 u. H3 l9 Q- R, i) v P
| MCASP_TX_CLKFAIL 5 P# g s6 x8 i( f, m: `
| MCASP_TX_SYNCERROR
: k2 d4 I) x* m0 f| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - ~# ]7 `; C) Y) p+ E1 ~' B
| MCASP_RX_CLKFAIL% E: V8 D; L. }( I3 _1 Q- n
| MCASP_RX_SYNCERROR " T( A( \- j. {8 u* A
| MCASP_RX_OVERRUN);/ X( @) N3 i# _8 U' W
} static void I2SDataTxRxActivate(void) c& P2 a. G- i
{
/ h% w. d; l# P6 `, ?; K/* Start the clocks */( L9 t; _, j( Z% @; N2 h5 Z8 ^
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 _" Y- ^9 w" R+ T! i- Q- }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */" _% @, k8 n2 c9 K2 }1 w) b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 o0 u" W3 j$ @3 `4 @3 G, ^EDMA3_TRIG_MODE_EVENT);
. U# W( o) `( n0 Z0 ~EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 H$ n3 [* e" r. REDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
+ [- R' D/ j. J. jMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% x6 ~0 s# _- I7 k2 aMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */1 _- a& i* ?5 u) f9 v! N1 Z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ p# J' N* _! \
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
& s+ E$ Q/ B' V" TMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ G$ |; |2 s* j# D, _5 `" A}
A! c% o- z" ]请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 6 m" L: V7 F( V! E1 R. S
|