|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
' l9 f( h- X' u- d; W. c" P6 Iinput mcasp_ahclkx,* d% ?4 l, H# \( O' Q, | a' a
input mcasp_aclkx,
- G; }# c. _5 |+ q! tinput axr0,
( _3 F% i. T2 ^5 [/ {5 ~ B) ^$ W$ D4 w2 j0 c. K
output mcasp_afsr,
( G% ^. a* B# r. F5 A8 t9 j7 l; aoutput mcasp_ahclkr,
h! k8 d" C7 x9 Z q4 uoutput mcasp_aclkr," Z+ ]+ j% @" N" [7 a, O
output axr1,
2 _ U. S. g: Q9 `6 }3 D& y assign mcasp_afsr = mcasp_afsx;: v# E( E5 ]! {) {
assign mcasp_aclkr = mcasp_aclkx;) y. {( q' l2 @; c
assign mcasp_ahclkr = mcasp_ahclkx;" i* X h- h D, f5 m7 \5 q
assign axr1 = axr0;
; F( d) n7 i2 a) D
+ l8 B! P F' m2 d* u: @- N在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 4 h# K# g; e8 I9 {
static void McASPI2SConfigure(void)0 b5 p+ k% x+ @" i. ^! o
{4 H9 E" ~, A( _' k2 C8 n4 ?1 J. q* y
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 @$ C$ f. ]) }; K! L* UMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 U% n0 z, A# F! c6 nMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
$ I& ?( A8 X3 c, {+ yMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
2 v! b Q( P1 p6 A, x8 ~) x: j ^McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ f) ~* v+ ]- f. m- t0 ~; \MCASP_RX_MODE_DMA);/ }3 V- W2 {& j- Z( I8 i4 T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( l; x- f# t4 B f. M q# UMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! g2 p7 ^! ?4 E7 X) X: ?McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' I5 _& E( K" L( U3 I2 F* `MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 k$ b2 a. u6 a9 y* N W) ?* X: h
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
5 K- {; ~' w' G9 y( ^$ FMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: Z: b1 h6 j0 O4 q3 G D3 Q' t! ~7 M
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: A( P: W# y, g j, t4 k- B) e7 T
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* e" r+ o/ d$ m5 ^McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 M% j) Y4 r7 c; l' u( S0x00, 0xFF); /* configure the clock for transmitter */6 A6 r- F1 o1 F* [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 [( k+ _7 Y7 q4 z9 K8 n2 b6 O# FMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 b9 y5 j- ?4 p7 D2 z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ H6 X0 J0 S9 `5 ^& I0 }0x00, 0xFF);+ E! L- A5 V6 Q# f; A. k
& y, @+ b; H; _* @$ k; f/* Enable synchronization of RX and TX sections */ ; e0 J% W6 Q8 k% L
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" ?: `2 @- l/ P) z7 M5 M3 X" O1 j
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 @1 }$ N" X; A4 O$ C' V L5 z8 jMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*# I7 b. v( F( P3 I/ c; D3 N9 l
** Set the serializers, Currently only one serializer is set as
8 U- O/ x$ ?+ {) N0 ], B** transmitter and one serializer as receiver.8 ]/ O6 _- w- J9 |+ `% P' p. |
*/
0 Z3 I) }6 l! zMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);2 C& P- J. Z7 S/ Y+ E$ T# N
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 {+ j' a4 e+ M. ?** Configure the McASP pins ) F0 c4 M/ x) j+ s4 G3 \
** Input - Frame Sync, Clock and Serializer Rx
- ~$ N( {/ L. W: \6 G3 ?** Output - Serializer Tx is connected to the input of the codec
4 ^1 b4 g. n& ^0 g1 _2 A*/7 r1 p& \ }; \
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ U/ w8 p- ]( m& D% u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 B% T, @! P* Z5 S, a! rMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ d" D- E2 `6 B3 K% H P) H| MCASP_PIN_ACLKX
% l9 W% A: \. q C) e| MCASP_PIN_AHCLKX
5 W0 m: G" q: v9 M5 O| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */* h6 O7 p* y, M" G. s) G5 P
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: I9 N6 e6 {0 L. w, ~| MCASP_TX_CLKFAIL : p0 r6 n. p) |1 S' `
| MCASP_TX_SYNCERROR
% n% L0 O+ s0 {" x. || MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: ~) }1 B1 m6 v, l! J; S| MCASP_RX_CLKFAIL
- z* ]6 i$ d+ V v, b3 O" r/ ~| MCASP_RX_SYNCERROR
0 R t; F9 A# a4 t" \| MCASP_RX_OVERRUN);
6 i9 w7 [- I5 ~2 ~( D% ?# ?% ]} static void I2SDataTxRxActivate(void)
5 i) _$ u2 }- J2 l{
8 V+ n. r* u# [6 i/ Y/ B! D/* Start the clocks */3 G4 O0 H3 I; H6 f G; _/ e5 e
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" N) o1 c& H9 RMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
: K9 J: \( E+ d0 N* xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: U V2 [- P: eEDMA3_TRIG_MODE_EVENT);& h# N1 S z6 ?- f. W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, T4 |; \, ~/ s' qEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& d; e3 w8 x4 {# t4 c5 I4 {& S7 wMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);6 a3 W% _* C# m
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */5 P" |/ s0 s, ]- W. u4 Y, w& P( D
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
) p$ A: e5 m% O5 I5 |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 E- |7 W4 ?6 ]6 r4 _* N
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 b! [1 m0 U4 Z' ~+ F7 N
}
2 @( _0 i+ G7 v$ _/ G4 \5 H请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' ]8 {0 T3 P' @% F* H! \; V
|