嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
: i) `. b) _% i% A; jinput mcasp_ahclkx,/ |4 e6 V1 j' v! {6 e2 t, a
input mcasp_aclkx,
$ S. l3 T0 |5 F9 ]. O- _2 u" f8 Ginput axr0,1 y+ C! w- @9 `6 [4 ^# m+ p0 ^
. n' ~; O) a1 d A Y
output mcasp_afsr,$ \7 |; B/ ~* |5 r
output mcasp_ahclkr,
1 Q j7 v: U* U" u) x) Eoutput mcasp_aclkr,! H0 L" f% z2 o1 X" g. V" s N
output axr1,
' i: C: ^* I3 O! J2 _1 h3 y
assign mcasp_afsr = mcasp_afsx;) h/ b, T8 z0 k
assign mcasp_aclkr = mcasp_aclkx;
; {0 E, \& y- passign mcasp_ahclkr = mcasp_ahclkx;
8 s/ a5 L9 u# F1 P2 r$ I5 _* q* Y% p2 Oassign axr1 = axr0;
2 e2 N) f/ L0 z& M i6 [( D2 f2 `6 h$ Z0 N7 u& ~" G( i% x
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
3 l# G: N! M8 Z! e* Z% k; M" m. xstatic void McASPI2SConfigure(void)
1 ?4 w9 ]+ W- X' s6 L. b{
6 t; f) ]7 m( b7 f9 i; LMcASPRxReset(SOC_MCASP_0_CTRL_REGS);! J: e/ Z1 n0 n: N7 g& U: s8 O
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* Q! [2 p1 a* |. l" hMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 Y$ ?/ t) S7 Y7 Q Q. I# c
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
# d" N3 K0 E8 d& |+ W+ y4 k0 dMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
z- E3 ?# k' b. s6 xMCASP_RX_MODE_DMA);
/ N( G- o7 ~) N; VMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) H/ Z( S% G! W# i7 u( I* b/ ]
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ t W( G8 U7 U b' n! _9 BMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, {+ l; y& g* dMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
& `4 f# c$ D% T! G" ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: A' r1 ~& o4 `8 rMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
( |% ~( J1 _/ Y! Y1 h; A6 vMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 }7 u4 e4 n! g6 M: y) EMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
+ ~* e L; p9 _. g& M: dMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; H; ^: u' ~0 Y |5 w* p# R
0x00, 0xFF);
/* configure the clock for transmitter */( ], V+ h6 u$ {5 G* Q( D
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' F; D4 P; b( g6 d, ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); , S. ?3 \# b( p6 L2 M- N6 w
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 B8 x) d' } m0 a
0x00, 0xFF);2 r' N5 t1 |, ?/ J) ?# N) a1 u
9 j% U. c& p: t' G1 |) Y; Q/* Enable synchronization of RX and TX sections */ # A; n6 r1 z6 K, `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ c! N" W3 W( h- k1 KMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% c$ }7 n5 r, q. Q: m5 |7 WMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*, d) K0 A" |! J
** Set the serializers, Currently only one serializer is set as% T/ w: u# p1 P" t o( }
** transmitter and one serializer as receiver.
+ Z: E. O) Y `0 o, n. o*/
. ]% t' o: J1 d" q+ @ LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, P% \% ] J! u- j0 P* E, j
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
O+ \# [4 W6 V** Configure the McASP pins ( ?. d, E5 E4 l w! Z- y
** Input - Frame Sync, Clock and Serializer Rx
; L- U0 c/ `% ^% N** Output - Serializer Tx is connected to the input of the codec
$ H! C7 c3 @( }" Z8 u( e. |*/
7 b9 X. y$ E: B6 N8 D; N, o" ]McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 ^/ r2 K- y0 h9 TMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! E" b, B* u+ f1 O( {McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& B/ J, j( M$ _3 b; U| MCASP_PIN_ACLKX# m3 M8 Z; a0 |( f& R$ Y
| MCASP_PIN_AHCLKX
7 w6 ?( x" T3 S: @( |3 ?) c| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
1 L3 {2 u: P% Y$ dMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 _ k" a. F" e) A ^
| MCASP_TX_CLKFAIL $ _7 N1 M, ~0 ]
| MCASP_TX_SYNCERROR- s6 ?" \" e% i1 [ G
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR c3 v& E- ?: u8 K! p7 l7 Y. ?# W
| MCASP_RX_CLKFAIL
/ M+ u0 a+ B( p; q/ w| MCASP_RX_SYNCERROR
* W2 \( E; F" n; p, o1 O4 s" H9 C5 O| MCASP_RX_OVERRUN);
7 l5 V3 ~) k& H. r! h. Y2 ], x) P1 \}
static void I2SDataTxRxActivate(void)
- z) s5 r" J' Q{
3 G0 o$ y: E1 C0 s$ ^- O/* Start the clocks */
" g$ @4 W8 T' w' U& H. g/ IMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- P7 Q) a8 K/ k6 `9 {
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
3 U8 v! I6 d% [' e) j; \EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" o Y/ T9 l' w: V& d0 F5 s/ T- FEDMA3_TRIG_MODE_EVENT);
9 Y4 r# u2 a$ `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + C7 k* \9 w) c/ O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */8 @9 C3 ?2 q9 ]& y" t+ m7 d
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ Y/ d; n0 R N# r5 xMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, S1 V( y; ~8 m b# j; z3 { Lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
2 ]0 {. H; n+ OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* `4 r7 H* P& {( r3 KMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- o3 t' j' `+ a}
$ V6 c4 x$ b3 m! r% G
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# _/ q6 [6 c6 C4 @) R! x0 z: `
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |