嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx," `1 B, U/ q; q K$ E
input mcasp_ahclkx,+ h8 h; W* C. C& y' P* ]
input mcasp_aclkx,
) A6 o3 l1 n S/ d8 Winput axr0,# t) h' z" v. r: W+ s
8 {, O( f- e) @! Q* P
output mcasp_afsr,
$ a! ~" h0 `6 q# eoutput mcasp_ahclkr,4 A4 k. H4 n$ g
output mcasp_aclkr,
) y0 O# t6 F- n: s% {8 @+ }# Qoutput axr1,
, C3 ]! y+ I5 _2 D. @
assign mcasp_afsr = mcasp_afsx;& T, O: ^/ e( N) Z$ D* l' J+ M
assign mcasp_aclkr = mcasp_aclkx;+ g; s" P, r' @8 k
assign mcasp_ahclkr = mcasp_ahclkx;3 u% F4 A* E, K' d3 j, _
assign axr1 = axr0;
; }1 f8 V j. B. m: ?# }, H5 s
8 y! c4 d3 v- f# j8 P( }% ^在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ s6 s0 X$ G# M' n
static void McASPI2SConfigure(void). f+ L* \, C1 P( e6 M8 @# `
{3 T' T0 X0 _( k& B: j6 ]8 U) Z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 A. {: {) v- V ]! O9 ZMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
" D u4 `+ R* z/ H" yMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% m& ?1 v1 S0 F% z, cMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
5 T) R8 ~- f3 o3 e W/ h, oMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: ]8 h% F5 R9 Y3 }; o$ N' i
MCASP_RX_MODE_DMA);
& \" K) P* _. G) O7 G# aMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- V. l% x. V7 \
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 S) B# R% t l. F& C' CMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 m( d& K" q! g) @" }3 BMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
7 \. Y: A' J5 V7 X/ _* n! QMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 X3 z4 `5 k* i4 o6 ?' ?MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
) U; Z$ {, e" IMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: r. _+ F2 L. ]& lMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
) {8 ~" s! ]. ^McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( ^1 l; ]; t- m6 l
0x00, 0xFF);
/* configure the clock for transmitter */
3 ?* M p; @4 Y* A* O2 f3 oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* e' f7 }' \, r7 v4 }; e
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % r- D% R: B7 e1 ?; C+ ]
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 R; m& F2 V$ O8 a: ^0x00, 0xFF);4 N) c9 {. w( t7 q7 ]5 v2 G
$ V, I9 m5 [1 P8 N) C6 | {/ _) E
/* Enable synchronization of RX and TX sections */ 4 [. X: k1 Z5 E1 P! h9 d5 E
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
' a* u+ {1 I# n& n/ R8 G; EMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' v" N; n. ?+ L9 DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( G: \& [; z. E' }! C: ^** Set the serializers, Currently only one serializer is set as
! X/ i H: X/ ?; O; x' q** transmitter and one serializer as receiver.
5 o4 u7 d: F; X2 q*/
* i5 \/ B6 F0 dMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* L: r. a: w) J/ k0 S
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/** X& y0 v& X; a1 i" E& N* {
** Configure the McASP pins " x6 J" q9 B/ s
** Input - Frame Sync, Clock and Serializer Rx6 L5 y# Q$ ?8 d/ s+ G7 y" O
** Output - Serializer Tx is connected to the input of the codec ; k. z* M* Z% z1 G' r2 l
*/
6 c' _7 T& r; [# Z- W* V5 r4 Z0 ^McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 y0 z- J/ ?" _, h1 h4 l/ j3 q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" w) |/ V- y+ Z; s8 W' R3 Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& M/ _ j: I( O9 n% W5 S
| MCASP_PIN_ACLKX
4 V6 S7 U# s, L& O| MCASP_PIN_AHCLKX# a f5 Q5 ~" I9 C. {
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */& Z* S' h/ R& H0 Y" v5 T" v
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 j- [ a' U: C
| MCASP_TX_CLKFAIL ! {5 v9 ?1 k) T) ~
| MCASP_TX_SYNCERROR
: p6 l: H3 j1 I& b6 a. ^| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 e5 c1 X ?9 ~. B% l2 Y
| MCASP_RX_CLKFAIL7 u! o' Z: T9 t6 n6 ^2 x, ?
| MCASP_RX_SYNCERROR . l% \+ o8 W9 o% e; a* @2 m, B* f
| MCASP_RX_OVERRUN);
$ I/ J! N$ i" [; p. x}
static void I2SDataTxRxActivate(void)/ d) m @8 M/ H% j/ E) [
{, h7 ?$ R' q4 \+ s; W5 x
/* Start the clocks */2 |" K ^7 ]% ^
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);& s- r; b- D' |
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
1 |5 v/ A7 M2 n% v0 WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) M0 l: l' |& Q9 |! i% KEDMA3_TRIG_MODE_EVENT);
# @- b% x4 `9 S3 XEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' R o7 n) Y4 @# [# B; V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */1 E$ ?4 l2 p0 u0 @/ t' C" b/ J
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 U' l- o8 ?2 f- C! [- v8 r% y
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
/ {) u s% L' A4 [while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
9 j! u' @) p! h( k$ PMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 X4 X. k0 C' Q5 c5 B1 j" w. R
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' g5 `) a! T3 f1 |7 h( }
}
, y. M! G R( i$ e- c8 p6 r请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! Q* D H# W- \7 B+ [: D
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |