|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- T1 Q, f1 f/ [$ |
input mcasp_ahclkx,0 \# P' O8 x' T/ f0 l E7 i* a0 ]
input mcasp_aclkx,- N- S* |% Y5 N! ^6 Z
input axr0,
; \) `! `" [) O1 y4 b2 u7 `7 n1 L7 o* b. c% F3 H: D' n- L" ^
output mcasp_afsr,
" J8 Y0 Z1 E: I. Noutput mcasp_ahclkr,1 [2 |. a3 F C: V: {" F6 t
output mcasp_aclkr,
: [- N ` F4 S- s! ]- \; Boutput axr1,4 N7 f9 G+ l- k8 x# [0 J$ ^
assign mcasp_afsr = mcasp_afsx;
. d# u# h; H1 cassign mcasp_aclkr = mcasp_aclkx;- v& L! _0 k7 Y+ g
assign mcasp_ahclkr = mcasp_ahclkx;% k/ i4 y& ?. q D5 ]9 S P3 S
assign axr1 = axr0; - |. U- ?: Q* H# R' @
6 e- ^! F$ p8 S3 V. ?; u E在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ; i7 A; V- g8 V. X
static void McASPI2SConfigure(void)
$ g$ H1 ^" M' o) Q1 Q- g{$ j/ i$ l6 L- D4 ~) u
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
! ^% M. k" g6 o8 O& a8 P. N- C0 eMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
' J+ |0 ]$ J1 x4 j' EMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. d$ o9 y0 T$ ?& y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; D5 t- v& k5 g3 v2 Y9 s* w* @McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! Q/ v! \8 L& X }4 EMCASP_RX_MODE_DMA);2 o; ~" P4 v/ \( `% M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. _4 R! s8 j3 u. s9 A L6 _1 Y) Z' q
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
p# o1 Q1 T/ n7 ~( N5 CMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
s4 a8 b! p* t" o* vMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! z( b( l6 K# t. R. [McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& q; \: b# e+ e) ^2 e9 wMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 r8 M1 A3 M+ i* u
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# X8 X8 ?% O& z) Q% w+ D1 c
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); r- t s+ k$ I n: c6 k* x/ D5 |4 C8 |2 H
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 m' e2 q1 }8 v8 }
0x00, 0xFF); /* configure the clock for transmitter */
0 |$ r8 h: S1 ^2 t$ R. Y2 SMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ g0 f& Q4 j U T1 U- u
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + \# [1 Y7 T1 g0 y( R7 o2 W6 ?9 P
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 R6 d6 e" W' G/ T- A1 _9 `$ N; r
0x00, 0xFF);; J9 B, }4 |3 H7 F( }4 T
4 ^1 M2 m+ y3 S4 n) {/* Enable synchronization of RX and TX sections */ * C( [* X, r% d0 R& D2 E
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
1 Y/ D" x9 v) O8 y+ k1 xMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 s3 j! P- L# f5 Y3 r
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
1 V4 d4 m* \$ g8 ]# F** Set the serializers, Currently only one serializer is set as
; D `. A) E3 a/ o+ J& }* f! f- D** transmitter and one serializer as receiver.; E" y' [$ L3 u S0 C
*/$ i% G* q+ h0 L1 B! O7 M+ P- J
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 L2 r! `: C; L$ D' G
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
& m* w5 Y" M- {# i0 Y# p2 e, W** Configure the McASP pins ; _1 Q- j8 H _8 y( H# T
** Input - Frame Sync, Clock and Serializer Rx8 F% N6 ~" `7 l4 D8 l1 _
** Output - Serializer Tx is connected to the input of the codec
7 W7 P/ F# s. `: g*/7 @+ {! K: h" T4 T# S Y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 u- }% h4 l# g6 m, PMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
" N$ o9 O6 f9 g( L0 y( J4 `McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX9 k$ ]8 D( z, N' d( F
| MCASP_PIN_ACLKX* d& D4 f" e/ {4 c* K$ f) K( h
| MCASP_PIN_AHCLKX/ u ]$ j; z& U7 \& A8 a
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
( ?; j+ } r8 z5 R% F2 v+ p1 ?McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 y$ Z6 S( F7 W: `6 N| MCASP_TX_CLKFAIL
7 K7 i% T/ m3 U' k# [! g| MCASP_TX_SYNCERROR h5 z5 R" }4 k8 L! W
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
$ a3 ^/ y! {4 r, l9 [| MCASP_RX_CLKFAIL( V3 o. m# f' R! e
| MCASP_RX_SYNCERROR # M5 x0 T; x7 I8 m7 d
| MCASP_RX_OVERRUN);. |0 ^. t6 `8 _$ l+ K
} static void I2SDataTxRxActivate(void)
0 G) e5 L: g; `{; B0 E6 v: u# M# w; n
/* Start the clocks */
* `# X8 `: X* \5 Y9 ?/ B) EMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# ], E2 z5 q- \/ R/ K0 d
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */2 c1 z2 l) E& I j/ x# v" ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 X( z7 R' J; YEDMA3_TRIG_MODE_EVENT);
% T! o$ T9 y, e& J) ]& O2 x# YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& ?3 P+ r5 t/ q9 CEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
) t8 c W7 T$ r& n7 ~McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);+ d0 \* ^: H. d: w
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
& C& H/ Z/ p7 mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
- e' `6 I0 j( E. |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 S, W, |9 a) ^McASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 a1 {# {$ |9 j- ~6 }
}
, ~) I: H. r( A* F5 K: N' v0 R请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- i; _; t: J9 B S' f2 d |