|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
, g# o9 p- Q2 E4 |input mcasp_ahclkx,
) a+ x9 z( W+ m6 binput mcasp_aclkx,
+ v" Z9 _0 H. J8 k& Linput axr0,3 Z5 P* v$ n) m2 ^& i
& x; v: Q& ~+ r9 g" T6 b: r, ^output mcasp_afsr,/ b' ?) r% o: ?# o1 Q- J1 k
output mcasp_ahclkr,
1 I' B- K5 [/ C. Voutput mcasp_aclkr,, ?) O y& C& Y# s( s/ X
output axr1,. ^( T1 @1 ^* _
assign mcasp_afsr = mcasp_afsx; `/ o: Q# F( B
assign mcasp_aclkr = mcasp_aclkx;% z8 T$ H' G ^4 h( U
assign mcasp_ahclkr = mcasp_ahclkx;- U4 Y- q* L" H# j- b* y7 o
assign axr1 = axr0;
' g8 g3 ?3 ~' O7 y s9 F0 w- j* J
6 Q, |5 |- l: M. ]在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
. k4 p m( E, A* ]static void McASPI2SConfigure(void)
6 {8 V- b" b: k) ^0 H- t{
3 O8 n& u. ?$ w8 P" p2 ]7 k' dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);5 ~& t b. a+ O- {& k9 R6 p
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */+ f; e2 H% H" q- q3 t
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 S* q% x. v% X/ l* v1 J- Z4 CMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */3 _8 W& G7 r9 _
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 N/ Z; o* [2 Z; C* \MCASP_RX_MODE_DMA);
3 k9 ` ?7 a ? h) G& T7 BMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. W. u. Q4 B/ ^: rMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */& q8 K5 g# D4 f7 P
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , R% R; T) e7 r- |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
& G* C& Z4 l' {3 P2 Y' w& Y* B% MMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 u: O8 [* N* m* N4 _
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# u* _5 o' t Q5 }6 R
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 c6 ]2 D% b3 F! d6 e% r( _McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : i7 Y8 S7 W; u0 w: i, @
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
- P+ g; e7 m; l, Y0x00, 0xFF); /* configure the clock for transmitter */6 Q* X! I* A6 | p& x$ O% k0 s3 X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, i' c) y( c4 _5 FMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) @% o$ H r2 z' n1 D
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 _, ~ i) W8 b. q
0x00, 0xFF);
6 ~; A1 g% Z* D( f# T& r7 o: V: t- p' c( @3 k5 ?
/* Enable synchronization of RX and TX sections */ , U5 c/ I" Z. ]. w: \# @
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */ L' Q# l9 K2 z, G! C
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ h. H8 J6 @) l! ?( j6 V2 UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 T' Z! E4 @8 ~- v) N- Z- Q* ?8 j
** Set the serializers, Currently only one serializer is set as' F% N$ u1 ~& t6 T
** transmitter and one serializer as receiver.5 X: \7 K: [/ \4 R) l4 S
*/; D% o3 h0 J5 x
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); X9 N% y& W$ D3 I( D9 C! p. {6 B; z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ n2 O; i( X8 }- P% W
** Configure the McASP pins + t* ?! o& M2 o" H
** Input - Frame Sync, Clock and Serializer Rx* M; |$ S! e* M3 H; N
** Output - Serializer Tx is connected to the input of the codec
8 S) r9 B' w! k( l1 |3 p% p*/
0 [% K4 {( [+ l* b% pMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" b* u% G3 O9 Q& x7 g9 y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* ~6 I8 q) F, ]) qMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( y5 T: h8 b5 C$ c
| MCASP_PIN_ACLKX
- B* m& P0 z# _; q1 X9 S- ^| MCASP_PIN_AHCLKX. G6 A% ?: r. l1 J3 c& v
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */2 d; }# b2 A. H+ q3 V! `
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- A6 x! F, y& i| MCASP_TX_CLKFAIL
2 p- C% `4 ?2 F z* O| MCASP_TX_SYNCERROR
5 Q5 ^& m$ `7 U7 |7 R W& L9 B| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& {2 [/ W' v/ I0 A' e5 v) h| MCASP_RX_CLKFAIL
3 o4 y+ O# p* U' [6 g; X2 J| MCASP_RX_SYNCERROR 2 g8 P' \' o Y* W2 ^: T8 l' N* h
| MCASP_RX_OVERRUN);
: k, q6 ~0 u2 b% L% ?} static void I2SDataTxRxActivate(void)
0 n2 q. N. w9 K% E4 B- X+ r) O{* U& Q4 I- j$ R/ l9 O+ L! a
/* Start the clocks */* _& r! ^; P$ A
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 q0 H; B+ r8 x) B6 [) A
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */* F/ S8 ?8 I% ^6 x' i& y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( H# ~- D& x* u1 I8 gEDMA3_TRIG_MODE_EVENT);. w9 R" e/ T q7 v) R4 k% q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( X5 N* a2 I- R/ ?: [% H3 sEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */: |, f5 e q% s$ B& V$ h
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 F' @$ j/ J+ a* D' E
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) w) c3 T8 {4 Bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */4 K' i0 U, v. j0 c: j7 K5 V; Z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 F* Y* t8 k6 o/ z* L6 K/ q- T. @
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
5 b4 _' I: f- H6 S4 q8 r8 P0 Z2 g Y}
. _' u/ d5 i/ t" N4 k0 O1 n C B请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ! |, j7 g, m1 i- k
|