|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,8 U6 J+ {; e! X K) L5 P' }7 y* b
input mcasp_ahclkx,
. M6 `) @0 [# einput mcasp_aclkx,# P3 v1 k* ^* [+ G
input axr0,/ y$ ^/ v" ?8 ]
* S0 V- v" U5 u* G8 [
output mcasp_afsr,2 Z! M1 |# n; {: w2 D7 O+ t0 `
output mcasp_ahclkr,/ Z$ N- h6 M5 [
output mcasp_aclkr,. R h- i/ x. x' ~# A- v
output axr1,) y9 a* q" ?! \
assign mcasp_afsr = mcasp_afsx;; Q2 D, |$ P% ?+ Q$ ]
assign mcasp_aclkr = mcasp_aclkx;
! d" H6 ^8 a3 Dassign mcasp_ahclkr = mcasp_ahclkx;
: {: b3 T0 {3 j# T( qassign axr1 = axr0; ) V: {! M7 Y1 |1 f, M
& p" _/ z0 L2 M ^; m; b# y" H: h
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 J9 e+ w2 h" v. O: b; lstatic void McASPI2SConfigure(void). y, x/ h5 X; c2 u3 g E
{
. g. U z) a9 ]7 }McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) k; G& ?7 `; Y+ GMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */9 \& }; {1 g' r5 S
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% L- W% C, O7 e) h6 n; MMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: `, k" d! |, i8 I+ }0 `
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 i& a2 F' ~4 OMCASP_RX_MODE_DMA);
0 B* H r- S; ]7 cMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 D' Y+ g2 O' d# k
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& u) X1 M% F7 r) B' O- }McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 B* a, c$ J: A1 @; p) ^& d
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 m9 ~1 v& V2 m+ E3 S: R. U5 KMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % z- _+ |3 [2 P; s7 ?
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; g! ]$ W( {6 N3 d }! j8 J6 hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) a* k+ w, g3 o( M" ~8 aMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 ~0 L8 e0 b! S- ?# T3 tMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ h' `- e/ _6 R" Z: ?& D" C8 q% o' N
0x00, 0xFF); /* configure the clock for transmitter */
+ M. z8 C% p# j# J% G6 y! G" n7 C; PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 J+ N4 U4 Q/ q9 V/ T |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % N1 Q/ N8 N+ V5 x* Y; m/ P
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,; F) F1 |5 |: h# e: n9 M
0x00, 0xFF);" j+ P( K3 ^$ S& b( T* F
; f( q( @* i4 F5 O$ T% Q; m- `
/* Enable synchronization of RX and TX sections */ 3 v* {( _8 w$ t% h4 {) L7 ?& }% N
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; ^: S' K- \# i" nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. c2 u! g8 d6 p+ Y% ]McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. e; @- b4 \/ Y5 g( |9 _( y
** Set the serializers, Currently only one serializer is set as
* R6 A/ E$ I7 |: ]( i: |** transmitter and one serializer as receiver. q2 a1 W4 n9 I3 U
*/
! F' t* t! S4 tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 ~/ m9 A6 }- ^0 ]. v/ w" w: uMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
! W& [, Q3 s- S* @3 [** Configure the McASP pins 0 v6 ^* c0 N$ \5 t
** Input - Frame Sync, Clock and Serializer Rx
( R* \. N" w1 p# E; B** Output - Serializer Tx is connected to the input of the codec
# ?) [! v% F' \1 }3 \*/! J8 q' ^/ \* \9 l/ k% a
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 a9 Q. B% m' Q, N4 R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* ]- G4 Q0 V! t- A3 k0 k8 MMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ h9 y' J6 S% x7 M( L| MCASP_PIN_ACLKX( I6 ~6 t1 h; X0 c9 u1 s
| MCASP_PIN_AHCLKX
" z) O4 a4 W3 A7 S. C) r| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
5 f& D* M8 J" p* W" DMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 Z- Y2 _- |- x
| MCASP_TX_CLKFAIL
, r. M# L0 {, i0 R| MCASP_TX_SYNCERROR
: ?2 g6 L b: D| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % A/ ^$ q) m8 N( ^/ R V( V9 Y5 _
| MCASP_RX_CLKFAIL Q% F p r" }2 B
| MCASP_RX_SYNCERROR
6 s2 Q; }, m. F: ~5 |: u- k! {# T7 A| MCASP_RX_OVERRUN);
7 r) Z+ I& }: u/ G9 b, O4 \} static void I2SDataTxRxActivate(void) Z, {$ z# [& n" m
{
- l- D! B& V; s+ B/* Start the clocks */% y2 `! k5 x7 e# l! a& @- n
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 e4 a; m# F U/ U+ X2 ?6 b# j* k
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */# V3 o% ^9 P( @4 _- \# F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 G& J& t3 z# F: f9 y: x# l1 B
EDMA3_TRIG_MODE_EVENT);; R) M) K' p `6 V. I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; X: g$ H0 n/ C( ]- U/ |) k' E/ T- S
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */, b- N4 f' D, Y& b( r) }
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% m0 x+ R# D6 F4 i) h. f. H
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) q7 `! M3 M2 swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */9 \5 H4 I5 [, J5 G/ J; c7 a
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
9 {" r8 h: c0 x' `McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' G7 s2 r0 h+ w9 c2 m) P
} / r$ J5 U5 x1 \ F2 e
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. * D u- ]9 ^6 s* g7 d" x
|