嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,8 J- H/ Y) e+ Z4 ^7 K7 F, o; ~
input mcasp_ahclkx,+ }+ n w* V. O H( i+ \, w: y
input mcasp_aclkx,( j& u7 d1 }5 H* l; o
input axr0,
7 _, t |8 `# C. G
3 ]) b# U# N1 @: Routput mcasp_afsr, r) A' I* W2 e6 s
output mcasp_ahclkr,
3 I4 O- ?- d* koutput mcasp_aclkr,
5 e3 Y- k$ X" H# u, e S% U" R* doutput axr1,
+ u# M, n3 [1 F! s v& i N
assign mcasp_afsr = mcasp_afsx;% ~5 s z2 g. a% T9 `
assign mcasp_aclkr = mcasp_aclkx;
% O" h* ^ l% L5 }; z% Nassign mcasp_ahclkr = mcasp_ahclkx;
6 D# ]* l2 }! a: k% i) P5 Jassign axr1 = axr0;
/ H* }9 `4 a ]. S3 ~
6 ]! X- N9 X5 l, x0 p% J! l1 U8 S( T在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
4 L U$ B$ O- _/ d: f# q
static void McASPI2SConfigure(void)
. r, {. O! _4 ]- f0 [0 j{
" @: Z/ E# j" X& e" NMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 F, f0 o* S$ O) b( X+ J3 w& q7 XMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
# F9 ]7 {% _3 ~' E, oMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# N& v5 e' B; H! Y, J( `* }
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 N; o+ @$ L6 Y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* @/ t1 D% u$ ^2 x @MCASP_RX_MODE_DMA);) d- o2 {, `5 X) z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 P6 L: }+ p- U: [MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 @5 k- W. M2 \+ W1 z3 l' ^& e' ~
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, . ~! u/ ^6 a7 v6 z# s9 Z
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& e8 a; ]6 Q$ X$ x& x& V2 D2 K" n6 _
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; g! x- K# [- @. j' E
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
6 @6 p# h) R/ v3 ]4 eMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. H, M# C0 o" a8 Q) i7 {* s. S
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 Z! U+ T# ~. X* r
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 l, y5 `, q- x. E9 } i0x00, 0xFF);
/* configure the clock for transmitter */
2 ?0 @$ @+ Y- J9 `6 r. s9 C7 iMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& ]1 q1 e8 a# P# v$ tMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - `( d& c: R7 P8 r
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( v3 _/ J5 c- b _$ w" |: V( Z0x00, 0xFF);
/ r% x- g! g4 T" v
) G) B5 { I+ b1 w/ [& H' }/* Enable synchronization of RX and TX sections */
- X6 U' ^. |$ K1 x* UMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */* A& b1 ?$ o+ K' s
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! o( D8 z4 Z' l iMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
0 ^' t1 I8 V, v! ?! } ^** Set the serializers, Currently only one serializer is set as* W* h6 ]8 H6 J
** transmitter and one serializer as receiver.
$ V3 k$ a. Q% f8 f- X*/
' S* h: T3 R# [5 x- }. OMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 u- @, _4 J( C( L# u3 l6 L- J
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
Q, J9 x5 h! z9 o" j** Configure the McASP pins X9 ^& t% z7 s. q5 n' ~
** Input - Frame Sync, Clock and Serializer Rx
6 h4 e+ F6 G4 \' s** Output - Serializer Tx is connected to the input of the codec 2 { T/ D" h, x1 i# I5 T$ Z
*/ F; s* y0 Y5 M5 N8 O* T
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 a8 b( N: Q; d: b. GMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- x; K+ O) P9 ~
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 _& o8 {6 t7 j0 V7 M8 H l: v; [
| MCASP_PIN_ACLKX
' S5 Q, c3 v3 e| MCASP_PIN_AHCLKX
7 Q3 i1 ~! l% `| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
2 ]. f0 h, \0 ~/ RMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 a4 r5 n% @$ H( @* _9 i| MCASP_TX_CLKFAIL 0 g# e5 N! D8 S
| MCASP_TX_SYNCERROR- l1 Z1 u: f0 I
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. S3 `1 r7 ~8 v) F( }2 o6 e/ p4 l| MCASP_RX_CLKFAIL
# Z% k5 C2 b1 f/ @* a| MCASP_RX_SYNCERROR
: Y+ b8 H( q; B) F, D* H- ~| MCASP_RX_OVERRUN);4 h/ P+ I1 Z4 @4 ^9 \
}
static void I2SDataTxRxActivate(void)
" A0 Z/ ~- u, o1 h3 C/ I, q{
; l* U4 U$ l" s5 o) V/* Start the clocks */
1 A% ? ?- O" s5 k* |3 AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; A6 W- g7 \1 B; c
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
: j" A$ @1 s* G) b- X2 UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,& T* A2 u* ?( \9 N* A4 I
EDMA3_TRIG_MODE_EVENT);
. g5 F: c9 l- X4 hEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 ~6 l P9 s( C! L4 s
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */! x& l! f# ~' i# y, @! B$ x
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ ~! g" }, y- {. v* A+ `! p
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
) X X5 G5 A- R/ J1 x1 {. Xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */, i$ ^. N/ K; F7 v# r' y
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);: ]/ P* F# Z! l) @, K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
E& J4 G+ c" d! L) Y}
. T: ^+ ~. {; e! V# [# S请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 Q- Z$ h" H) S2 F$ f9 E m/ [- M
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |