|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
( q' \4 Q0 k4 Q4 V! A; f! r( {input mcasp_ahclkx,
& T F1 W/ d# `! @! `4 I; {input mcasp_aclkx,
x9 q$ m( Y' xinput axr0,
% k! u l9 ~; b" [' e
# w, q6 B+ s1 ?. K0 \+ Boutput mcasp_afsr,' {- ^& @" {/ n2 q3 [3 b* c! Y; i
output mcasp_ahclkr,. `; x* J- \4 w
output mcasp_aclkr,$ l; R3 ]6 b' A# U( \( j- y% s% E
output axr1," P H) ]' `. ?- L* B0 [
assign mcasp_afsr = mcasp_afsx;5 ?# m/ e O, S2 J5 t5 Q' n K& Q
assign mcasp_aclkr = mcasp_aclkx;
) S* {3 f; J/ U6 X% l. N# Xassign mcasp_ahclkr = mcasp_ahclkx;+ H/ z$ ?4 c3 l
assign axr1 = axr0;
! p/ ?( l7 }, v
$ M- J0 i! K" \3 t' b! {在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
. C' A* L s+ d* N x6 S/ M1 Ustatic void McASPI2SConfigure(void)
4 V7 T; w* \5 i$ Z$ F' s4 Y{
$ v5 @/ L+ ?/ K- \McASPRxReset(SOC_MCASP_0_CTRL_REGS);* g1 m' O! q6 f
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
% l" p5 l6 [ h( _% Q5 w% Y# rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' Q1 ~* X: a F e
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# Q1 ^4 s5 r& b2 [2 G
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) a& E e y! {; l4 [# VMCASP_RX_MODE_DMA);. ]2 W+ a- I" k/ n$ k; e* J# j
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 s# b6 n0 V! @: Z6 k4 I2 rMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ x+ F: Y4 J& }) b1 m& rMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # b! j8 `( K: I
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( s& Q3 I5 t; Q3 K* D- N2 q. @
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
% D2 ?) p, F5 L5 \8 iMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" l+ b- `# _$ x: o8 y$ Q% h! b
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& k# F0 k2 b8 R6 fMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 N* X2 C- Y0 o% `4 m
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# n+ j" G9 t: ~+ Q$ g6 q* P7 s$ J
0x00, 0xFF); /* configure the clock for transmitter */
9 e6 a4 M7 G: C9 i9 a. ~9 J# o DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. @) x! f4 k7 }% p1 D3 p
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 R& T$ I$ h! w& y/ b2 MMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
5 ~& f/ d# d6 L$ r$ ^- {5 _- {0x00, 0xFF);% k& X& i+ }" N) ]
# e7 O* i1 n6 J5 c; o- Y! W/* Enable synchronization of RX and TX sections */
: I) h! F$ z* G4 n0 c {McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- g7 c) T3 O# `0 X X
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) L2 W& u8 N b2 x, J* e& U' q6 K" SMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*- w. t( h3 J* T& A/ a! g
** Set the serializers, Currently only one serializer is set as4 m/ p2 Q% O, {- w1 L3 g9 n
** transmitter and one serializer as receiver.
9 t2 \7 g3 y: n1 P. J1 Y) S" e# U& z*/
6 ?5 P( D0 m& \1 _- gMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% f, w! Y% L4 I6 ]4 nMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 u9 w, Z+ X# y- q2 O( W** Configure the McASP pins
. n8 [ l7 O8 c0 \6 e" {; X** Input - Frame Sync, Clock and Serializer Rx- \, [" J6 j8 m7 R8 Q) }
** Output - Serializer Tx is connected to the input of the codec
: \/ e1 p; h U d*/
( Y5 ]3 `& J/ ^McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 U6 f4 w9 u6 k( g: E5 b
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
W# |# a& h9 E0 vMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% u& u# x% I: D8 S8 N| MCASP_PIN_ACLKX
3 p' I$ Q9 p- u0 K' `( @| MCASP_PIN_AHCLKX' {4 q/ ^, H. p ?* B4 L' b+ @; |
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */, [5 U* G8 O/ g
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
/ X" N, U% c' x4 O* Q5 M1 `: ~| MCASP_TX_CLKFAIL
4 P% w+ V! E) Y1 S| MCASP_TX_SYNCERROR' A i# r% h4 Z+ t S7 o
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 F2 n7 \; z' w9 E$ I| MCASP_RX_CLKFAIL. Q. t! x- L: w" Q& [: r: h
| MCASP_RX_SYNCERROR
\: G+ V) \: C) s. E, m| MCASP_RX_OVERRUN);7 h- `/ S( Q5 L2 Z- X
} static void I2SDataTxRxActivate(void). X( x. Z# Z- h7 H
{
+ c# n4 V: Q) ]$ n* {+ N6 y/* Start the clocks */
# a# Q7 Q N1 _McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: { f6 u r* A% R2 P! k IMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */ B/ x- b h+ Z" G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% T9 p" B9 K7 T3 U& l8 R' hEDMA3_TRIG_MODE_EVENT);4 W# ?) c! N' o f/ M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
/ d* I7 f- ~& \. t/ JEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 s/ o4 ]/ ~3 [( ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
1 Q1 e6 f; ~6 OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) P! i2 y9 ^5 h6 x' Twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, ~" D, b, P/ AMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);* u9 e& K- x# J; Y; K) ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! E7 l6 K6 y1 q0 ]
} " R/ _5 |8 j% J+ P; k) ~
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ P" g" P2 s8 q2 h$ @7 ~& K* g, @! C ^7 L
|