|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! A' |/ M V) q
input mcasp_ahclkx,
0 Q |# ?8 c5 h9 a; D+ e6 a1 zinput mcasp_aclkx,
6 P: Z* |: s( ^" }4 t' z4 Einput axr0,
' H6 {# p, s1 `1 m$ I9 L' H: B& Y1 h D* {+ c+ {& ~9 t' t
output mcasp_afsr,
& r; k2 z2 `! f- ioutput mcasp_ahclkr,. d6 l! c: T8 o& I, A4 T- v2 j( L
output mcasp_aclkr,
( x" f9 u1 k& R% q( Y9 v( r6 ], Toutput axr1,
# ^ p- X1 y y: I0 v( n assign mcasp_afsr = mcasp_afsx;
. Z1 i" R+ q. v) ~# X" H+ [4 M T" fassign mcasp_aclkr = mcasp_aclkx;
! f! n1 \# H, R8 ~7 j& Qassign mcasp_ahclkr = mcasp_ahclkx;
# X9 H+ Z/ ~! f5 k9 D/ g; m8 Tassign axr1 = axr0;
5 N/ t+ h5 U/ Q. q1 C7 |+ @7 J0 \$ J+ I/ l% f1 ]) x' l @0 `
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 $ U! L# g9 P8 ` |5 s
static void McASPI2SConfigure(void)% |' o6 D" V& J! a
{
_5 w V! \9 r5 b: D# d tMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 h+ k* C# w$ C7 l! S9 sMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
9 D' f, r: Q7 L8 Z5 T+ Y9 c0 NMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 r1 `7 R' l& t" P" z) @9 m' |
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */1 C6 M, R u$ H, I9 y( Y n3 G
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% a, f' W- |- A" A+ o7 {/ d! Z
MCASP_RX_MODE_DMA);: N2 U4 v, s1 t# O
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- p3 k6 t' ~3 \ oMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; v. y& J5 [# uMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, K9 B3 j9 s9 k0 @/ LMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ A/ h/ e8 [+ q; z" XMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % t, i! ~0 I& C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */2 p3 @3 M, L! A# ?8 O$ P0 w6 r s
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 E; o3 l3 { X/ `1 Q, w, RMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) y& {$ b& _" {5 P. \! e6 E |
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) S, f0 q% R( ~2 f
0x00, 0xFF); /* configure the clock for transmitter */3 l) F, `. G& T
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: p0 h- x9 W5 u! P. ]" M/ q0 cMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 D, _- H9 P; q/ z* |McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: m) k% O8 Z) o7 _7 o0x00, 0xFF);
1 ^+ X# q. Y# J) N3 T @- J/ o4 i
9 b( W* }5 P V; A% F" j& S9 W- x; b/* Enable synchronization of RX and TX sections */ ; I4 \: F/ k, q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( D' v- }" d, V) [+ Q9 m1 d9 ^
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 B: i5 P4 Y1 w' x c* ZMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** p, t, w# z$ ~! S( T1 P6 K- g
** Set the serializers, Currently only one serializer is set as
: T7 e! U* R$ s6 |** transmitter and one serializer as receiver.8 F" d$ i$ H! j
*/! C. ~+ T. V! V
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 A! J" B+ z' Q" u& vMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*" {7 }4 o5 E' J; U: h
** Configure the McASP pins / s, i7 O& A: G% ~$ p/ G* h$ Q- M
** Input - Frame Sync, Clock and Serializer Rx/ X$ p( B+ k/ ^$ p, {8 K
** Output - Serializer Tx is connected to the input of the codec % M) j; x% B! t. Q. r: Z t- N6 q
*/
) ]3 K% ]& j+ L' B; ZMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 O' i4 |& p- Y, o+ K' m
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 ~2 k9 V" \- S* nMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# D% w, A4 A9 k8 N- C$ r% ~
| MCASP_PIN_ACLKX
' c( ^9 b5 Q0 ~2 `5 I6 f| MCASP_PIN_AHCLKX- U! f' q! y5 S1 R" l( D6 }
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 s3 }0 r6 {; m/ A8 w
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( f8 D& q8 R, N| MCASP_TX_CLKFAIL
/ I$ C; H: L/ q| MCASP_TX_SYNCERROR0 [8 O1 k4 M o3 c+ D+ j3 z2 s
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR + z! ?$ h3 A, M: f
| MCASP_RX_CLKFAIL
. {( I8 G9 v Y A: C- f) h| MCASP_RX_SYNCERROR
' G3 j: ]$ X( v, ^( @. _% @2 _/ w| MCASP_RX_OVERRUN); {9 s, r+ m# d0 c+ g7 `
} static void I2SDataTxRxActivate(void)
& c8 @+ W0 `* O5 p9 g, D7 h$ @{
( n5 l- d+ R' f' Q/* Start the clocks */
, ^" B: |1 h( kMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% e: a5 M& e) t9 X/ X
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
0 {0 C1 i, S4 ?: e6 uEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# U2 `! g5 S9 D, O
EDMA3_TRIG_MODE_EVENT);& }4 }9 M& `+ ]+ E# ?6 K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 `* J! T) c( L( W: R
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
: h. D" h0 H) h. I' fMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; S- P( ^# S, m( B' r9 ~McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */$ j6 p3 L, j4 v8 \: Y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
) H/ j8 o1 V2 x# q1 P! D$ P4 `McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
& r! B1 w7 S2 r1 |+ w c1 ~McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( J7 h8 H% a2 j: f% A8 O
}
( }9 ]7 g$ d7 \请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 _8 z7 v/ g1 d4 J Q
|