|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ z# ^- M" ?+ A1 l/ m1 V! e1 B
input mcasp_ahclkx,
8 b8 l5 y M f, }, d$ i+ ainput mcasp_aclkx,
' V& x) b% ^$ O- j9 N3 d! Cinput axr0,
+ ~$ e1 b- ?/ U) f6 Z: O( d
8 K6 N/ }. v9 r. Z* S* ^output mcasp_afsr,
2 Q" R( u6 z+ G" `4 d, C( T2 routput mcasp_ahclkr,% ]1 U% r& M2 p0 K
output mcasp_aclkr,5 V1 ]8 {/ P9 o4 l3 a' ^; q
output axr1,
: r0 D: i2 A9 V2 ]- m9 e) e assign mcasp_afsr = mcasp_afsx;8 Y2 L) O3 n) Z- ?
assign mcasp_aclkr = mcasp_aclkx;8 b( W6 _. M2 ^* S; L8 x
assign mcasp_ahclkr = mcasp_ahclkx;
% N8 d6 C* \; Oassign axr1 = axr0; 6 }3 u/ L) h8 i
" G9 x6 z y! X! P( T7 t/ E7 E0 L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) M/ k, ]4 u. u1 g: \0 E
static void McASPI2SConfigure(void)
7 B V% p( q1 N9 _% f' w{
" G: q6 I) d% O- z- K8 j# ~McASPRxReset(SOC_MCASP_0_CTRL_REGS);. F9 e4 G# X0 d1 T! e* a! L8 z
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
; [1 p, y7 P* F6 {+ e- t1 E7 ~McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
8 H' o; o, F! e% x- R* RMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
( n: t0 n# n: k/ d* S8 CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& i: ?5 P: O" y; }/ eMCASP_RX_MODE_DMA);. Z) l+ s" V1 K* Z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ R7 ~1 d1 p- H. K( R
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */# {2 y( t3 D1 m7 D2 Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! }, \ t) f$ g6 D- OMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) G% B! X4 h2 G- y4 W, ?# }McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" h+ M% C7 I9 n4 bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
! W6 ~) }, c9 b# j" g6 ^+ E0 SMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 A! ^0 ]: ], {
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) D# o4 @$ m3 u' x, Q2 ]( ^/ C
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 A$ m: @6 _( P4 `8 H0x00, 0xFF); /* configure the clock for transmitter */6 n8 S% l& d2 K# H, J1 _
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; m( _5 q$ r- [' s& n! ?McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; _9 r' Q' n# j* b' L3 w" u
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) @& s4 y4 u* v
0x00, 0xFF);
! l+ ^' e# O# T6 @* v2 ~% \5 G$ Z' U+ D
/* Enable synchronization of RX and TX sections */ 1 W2 {1 h/ ] g4 a! l' w
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ o- B/ D3 C( [0 K
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; r8 l, y7 [ O, j' W2 n
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) b6 w+ v% J, T) @; p0 u7 L+ @
** Set the serializers, Currently only one serializer is set as
% T; m$ J$ |4 y; e. X i* I* p** transmitter and one serializer as receiver.
! z$ t: ` }$ M( Y2 ~- \*/
" K: ~2 P# k; ^6 zMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); x6 J" L/ ^9 T1 C$ a: R8 M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 v# I+ I2 N6 y/ I- Y% h** Configure the McASP pins + ]" f( u/ p, d" U9 J# _6 j' v' @9 d
** Input - Frame Sync, Clock and Serializer Rx
8 w" S1 b( O/ E& S9 G' O3 ]# `** Output - Serializer Tx is connected to the input of the codec 8 P/ d4 t5 m( J
*/- T! S: `; j6 G- v, ]4 `7 _( ?
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 r+ ?8 v! |4 h2 a1 F0 F2 RMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. V( Q9 D4 L& b( X4 {+ G6 K. qMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 `( N- r8 l( U G0 ~! ^3 E9 C0 }% @3 L
| MCASP_PIN_ACLKX) k6 F) s Q; o, Y! F* f+ i
| MCASP_PIN_AHCLKX) n* ^& I: M j9 p4 d) c
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */ `% E% D* F8 Z% @4 J* W" u
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 r& G* r3 B6 u7 Y( q8 `
| MCASP_TX_CLKFAIL
* A/ ^ I4 I* B! Y! @| MCASP_TX_SYNCERROR9 t- I5 |7 P0 X% w
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 h/ e- @+ }; o1 O| MCASP_RX_CLKFAIL$ ]. v5 q9 s+ v7 U- s
| MCASP_RX_SYNCERROR
( ?$ I! b/ h R- o, ~| MCASP_RX_OVERRUN);
- n& }# t% e1 h8 w9 i2 ?9 K} static void I2SDataTxRxActivate(void)
2 J" f9 B2 |4 l1 j# \{1 w+ y [9 c: J2 j+ O( u, B
/* Start the clocks */
' O, R. l8 |! VMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: a( b( \9 f6 L1 p' Q1 _4 O1 p5 u* w
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */$ D0 [, K- C0 F& r6 b$ n, _# ?8 B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 X7 A8 i' `% {' k$ bEDMA3_TRIG_MODE_EVENT);- i# y {3 o0 T- \ }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) s! c: z; k% K& {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 a2 {/ K( E/ c/ r$ tMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: q0 r" S' b mMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
6 ~* H7 A* i I9 Z+ Pwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
/ r$ W* L) k/ kMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
N: Z, M. f7 \: \( g/ HMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 o8 f) V# J8 z E}
; g, p4 j6 |, F/ Q! G+ E! L+ F请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' ^- J. t7 _+ h. H, P( ~$ F3 R |