嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
9 z" t" ^, k; {8 E$ M! Iinput mcasp_ahclkx,: O" e" a8 H6 z
input mcasp_aclkx,
0 i( O; U0 g) @) Tinput axr0,
" m" r5 A" m# W$ o& w! z2 z$ E4 Q8 V$ N# f" _+ @" ]. x
output mcasp_afsr,
& I$ Z) j- E, doutput mcasp_ahclkr,! b- i+ N- B& H* @
output mcasp_aclkr,5 V6 u% _: E2 P
output axr1,+ j: r$ u2 q0 h# p4 N0 Y; P
assign mcasp_afsr = mcasp_afsx;
8 m$ L3 E( `/ ?! zassign mcasp_aclkr = mcasp_aclkx;8 m' X* q& U* H1 x4 N1 d
assign mcasp_ahclkr = mcasp_ahclkx;7 d& J) U( D/ Y) U( b; u. Z. q) x* a
assign axr1 = axr0;
* Z# t# A* r: P3 `1 m
5 _: r% }& S- g- f6 ~在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 S% @1 ^) v0 ~ G/ Zstatic void McASPI2SConfigure(void)
* S9 q B9 [# c6 m+ W{
: o( |) o( B; r4 O, v$ EMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
% }( g! @7 b8 v& K. KMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */' f$ @* t4 X5 s. B$ B1 x
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 ]* V( Q5 ~: P$ d; P
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
% P$ |+ y, F1 z1 `) ]8 T) `9 i5 u% fMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 D+ G, t% R6 V: r% c+ |MCASP_RX_MODE_DMA);2 p" Q) i' T/ _! l2 P* z5 Y
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. A; r, h/ T, J: O1 ^' XMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 U) h: Y& [% `# PMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 p6 D$ e! m0 } T9 NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 E- z7 ]- b9 [+ ?# F0 b' y5 uMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; ~" s% E8 e5 @( P1 |) R" g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */) e& W' V3 R6 Z5 A' j" k, k
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ O; V4 `4 B8 ~' V. p7 tMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( A+ u6 k8 K. T* `/ P1 k1 E
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 ^7 R4 {" P" W7 d1 G. e1 R C0x00, 0xFF);
/* configure the clock for transmitter */
$ g4 e. z& s3 ]% ]McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: f: _9 f9 b# `1 x
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ }$ S8 l/ A& `- H
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! M4 g1 O8 ]: _6 w0x00, 0xFF);1 f4 g0 g: ]* C5 V, {
8 X, W* u9 j+ O/ Q# k/* Enable synchronization of RX and TX sections */ 5 m8 H" ? z' I. @% f' g
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
9 c- X6 J, B: t( r2 _1 n: NMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 Y) w8 R- |. s/ j2 dMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
/ Y4 O8 {" L% j; v) T5 ^** Set the serializers, Currently only one serializer is set as
# O+ V/ }& t: o" u0 k: H** transmitter and one serializer as receiver.
8 F2 F+ L' K7 K! h' x( M& H*/
( `* M5 Q5 L X/ c/ f* M1 UMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 \5 Q5 X/ q/ j1 k9 t& @# g) ]8 zMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*% X% I& D. a L; H( ?8 U: b
** Configure the McASP pins % Y, n! E; T8 e$ L W! R9 f
** Input - Frame Sync, Clock and Serializer Rx
# U& l5 C2 {7 h) f** Output - Serializer Tx is connected to the input of the codec
2 I- g8 I, h: F; J+ I3 ?*/
K. {$ _# o0 f$ U( q* G9 d+ d$ ?McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; @9 Q' U+ S( @# B6 H% |1 FMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- N4 f4 M7 [5 }5 W+ i$ V" C
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 Q8 n. j z; z# Z: g& E* o* R
| MCASP_PIN_ACLKX
3 g5 r( I7 P2 W/ s+ n| MCASP_PIN_AHCLKX, `( b+ |1 t2 ^- P* f& T( p
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
( C, z2 H& |. {& S: o JMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR : P0 l4 I4 F& ]* Y) T
| MCASP_TX_CLKFAIL $ r) v! X$ I! r
| MCASP_TX_SYNCERROR
8 [: H1 Q% T+ t| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " B* u8 X- B# m( R4 ?
| MCASP_RX_CLKFAIL5 U: E$ J6 U; c$ S# t( S
| MCASP_RX_SYNCERROR " u: a S, E& q2 P2 S5 w) F
| MCASP_RX_OVERRUN);0 b5 i( q& X p! [
}
static void I2SDataTxRxActivate(void)
+ ?% b3 y% r9 E/ q" r{1 r I j' p2 N! B: f9 S! C
/* Start the clocks */. V9 y# e1 s- Y% H- z$ d
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- B, j$ q G) |9 Y( V+ rMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
% d! h* j) [: WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; y2 _9 ~5 D4 i/ o6 m5 tEDMA3_TRIG_MODE_EVENT);4 }" c) V; B6 i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ t/ r4 Y ~, H7 D
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
. p1 \, Y D V4 ^! o1 P uMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);+ y$ z6 i) b; G! ^/ o
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */& ?$ |- l5 ]$ E
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */! |: z1 T' I: U/ C! n! [+ _6 c
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 T! J4 f! r3 c, h1 [" BMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 B f0 R+ D: W7 D, o
}
* ?; ` @% H8 N4 S6 Y# S, w5 M* e: ~请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& {5 _! g% W: q9 Q" p- ^
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |