|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,6 l0 Y$ l) T, Z) H) r+ H
input mcasp_ahclkx,
, D, o4 m! G& C" j. f- _input mcasp_aclkx,1 ]. V: A V8 c) ^% H0 D2 ~) M
input axr0,- T& Y) ~" e6 z# Z5 E0 |6 x
+ `5 s8 v7 [ r1 i9 E) Doutput mcasp_afsr,
( n& b, m a2 H3 o3 _" A4 boutput mcasp_ahclkr,* r8 c2 S' C. ]
output mcasp_aclkr,
8 R5 P9 j9 T, E0 s( L9 ~output axr1,
6 M) p5 ^* V) ? assign mcasp_afsr = mcasp_afsx;
s+ r9 T7 Z8 }- T: oassign mcasp_aclkr = mcasp_aclkx;
! f E3 l7 P6 |* A% j0 X6 oassign mcasp_ahclkr = mcasp_ahclkx;
( C* Q. ~& R. C$ L' ~2 Zassign axr1 = axr0; + Z1 I0 L$ P1 O
4 k" O: r3 v8 ^5 q7 @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
; K3 O4 b5 r: y* _$ S, ustatic void McASPI2SConfigure(void)
! V) u3 p& b' \$ E1 W' ~{
' S9 ^: f$ k5 m* H6 WMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 n- w2 P& m7 Z9 t7 _! @4 gMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 H. a! q* h- H; r* o5 x' S8 w1 ]McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ `9 T* t- w- y# hMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
5 t* n5 T, W5 v& T7 IMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 M6 W! u* P, }- r+ R9 VMCASP_RX_MODE_DMA);+ B6 h& @! d- z: l7 K/ \
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* B: o- y" T/ U6 a* q# z, FMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */: |+ ?: t2 q; {% g
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! h' N2 y8 v' [3 C% u
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);+ _, ^2 ?7 u# G; [- _: [/ ~2 |
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 o- U" n) f) f/ YMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 W( c9 ]& a0 D! \
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: F4 k# w* b9 B# N5 L3 ]3 H6 WMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 I" |5 L2 i1 h
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ d8 j; c! P+ ~
0x00, 0xFF); /* configure the clock for transmitter */
) b4 T6 C6 X' p) m; J+ h3 c \McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 Q( E$ M0 P C+ O( |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) j$ s3 v2 O% A7 o, P5 _" C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ i, K5 p6 j( D b: Q' v- B
0x00, 0xFF);' U' C% |6 j! ?, \+ R+ D
% B! h& \) C- _# z. f+ z" c$ Y/* Enable synchronization of RX and TX sections */ ; ^" e, u! a& F0 j- h+ C% F' T
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */: j" r( k; D* f& `
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' D& E0 u8 z4 K* K
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 Q5 f$ U- P- q
** Set the serializers, Currently only one serializer is set as% R: l- S! r" Q8 C7 C
** transmitter and one serializer as receiver.- k6 t2 p4 U- T$ X. ]( U4 F4 H/ U/ j
*/3 L" e5 `+ [9 u ?. e3 b! r
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" p1 r, P7 }7 N, q: TMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 @: N# r- _5 V** Configure the McASP pins ?- T# \; Z9 j, J
** Input - Frame Sync, Clock and Serializer Rx2 Q* c3 ^2 a5 ?- e! M
** Output - Serializer Tx is connected to the input of the codec
: _) U- z7 |6 `( O. V$ _+ \/ X*/1 u0 N5 Q2 r/ C/ u2 t! o: V5 z0 h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
, t$ r+ A/ g# \& y# j- Q) ^* P3 [McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
7 b& x1 l7 z& ~' G: ?+ B! ?5 P( D; `McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 {& [/ u; P7 _- b) i7 R| MCASP_PIN_ACLKX
/ X1 W" c4 N/ w| MCASP_PIN_AHCLKX
- u& N; J! Z! @$ M5 g% e| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
4 N& q* I, z- E8 B! I9 qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # J/ Y* ^" i5 J6 q1 @ n0 G
| MCASP_TX_CLKFAIL
# D0 u+ R/ z5 y7 V' || MCASP_TX_SYNCERROR
3 n8 r% R4 [- S! c" ]1 W5 R+ V| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
$ ^% x( ~, k0 l| MCASP_RX_CLKFAIL
% K0 ^6 G9 Y% V5 N8 F8 V0 p+ f| MCASP_RX_SYNCERROR + V: s/ @: J, w
| MCASP_RX_OVERRUN);
4 f, o" Q/ @2 l/ P6 q} static void I2SDataTxRxActivate(void)+ b P# Y/ _: e+ g8 i" P
{7 _8 w3 U+ N+ X! v
/* Start the clocks */
% a/ j* e1 X0 Q$ }" dMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" }) X6 K6 o8 [7 f" yMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
2 J/ @8 u5 g; i6 R* Q5 KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 E" p9 }' o& b$ T) g9 r1 }EDMA3_TRIG_MODE_EVENT);
/ Q* E0 ^% Y9 PEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' W1 X4 _' @: t1 @" y x& uEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
1 \8 n( f( [ Q- }7 XMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 Q/ k) x4 O- J* M1 l, ?McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */" D6 M! M: g- G) A( y+ Y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
/ N2 k2 h5 r+ CMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
g; P5 w( K7 K& R" D' ]McASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 o7 S8 v3 X6 b2 b' H) K3 D
}
! |. C% R R% q5 x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. U) k/ R' d) C |