嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
4 b& }5 c: Q4 o- G5 t1 jinput mcasp_ahclkx,9 t. j; ~+ J- \+ v" u6 X
input mcasp_aclkx,
9 d8 h* x# H# L# l& c: c* Ainput axr0,- x2 w! {: T+ }+ e
4 K( `2 ^3 h' P
output mcasp_afsr,; D. _7 y; G1 i! t3 O( U
output mcasp_ahclkr,' ?8 i2 J% g2 T; y4 Y
output mcasp_aclkr,
, ~: n# Q. ], R( A7 y1 {& k$ J8 Y" U* Qoutput axr1,
! z: F" t; }" j% W- i4 ~
assign mcasp_afsr = mcasp_afsx;$ @5 U+ X' y& P( i2 P
assign mcasp_aclkr = mcasp_aclkx;9 s9 D: O8 J+ e/ d/ Z! Z, `. X& m
assign mcasp_ahclkr = mcasp_ahclkx;0 X: l( @( {& ^/ ]- X- a4 ^9 s
assign axr1 = axr0;
{& U2 T/ t$ m4 Y+ [1 Z, u' O+ B) G0 A; {4 q' B1 D/ f7 l3 u" r
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
* Q5 e, J9 l' K- Jstatic void McASPI2SConfigure(void)& z5 Q0 p; Q* `) r6 { d
{
, r' s, {, R7 y5 fMcASPRxReset(SOC_MCASP_0_CTRL_REGS);7 u- t$ n- l; b; Q) @+ c Z4 |+ d8 x& j
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
0 y) [/ \! p7 C jMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 D( J) |1 j; R& n/ V% K3 lMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */0 `* }$ V2 i, c2 y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 W L% @; {6 k5 Z0 X# \
MCASP_RX_MODE_DMA);- S" c/ A4 i' O; w: i) M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( T/ j& X. L9 h: P0 l. j( `MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
a' M& ]: b7 z% HMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% F9 M& V% _+ @& B4 dMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 ^4 D/ L) x% S% _1 RMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / T+ e6 l) h5 N
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
; F3 F9 [+ |- N' ~9 n+ CMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- W3 h7 N s/ f* H3 v2 g1 l$ E
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( |2 m% U/ {0 c
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; y9 e8 X9 O1 n! L4 e6 A3 z
0x00, 0xFF);
/* configure the clock for transmitter */) O( Z; C; y/ b+ E
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! ~- f" w l1 D/ J7 D# lMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % z- U5 ?* b# f3 }/ |
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 Z5 D7 Z7 b+ P6 k
0x00, 0xFF);
2 x5 N# J- |3 Y3 q3 J( z' P, h5 j$ E
/* Enable synchronization of RX and TX sections */
$ @( \$ s$ O. e: o& s. cMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
! j* P- c }8 C! n. X2 e( i5 ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# z9 |" s6 N3 i4 w2 IMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*" L+ c# O$ @8 L9 c. V
** Set the serializers, Currently only one serializer is set as
" P7 B' R5 y Y8 l: _** transmitter and one serializer as receiver.
7 Q( [7 O2 `% k* N0 E*/
) B( ]# ?& F- c/ H5 G8 j# [McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( {/ g; r% O% E' X( e) B
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*+ d" |! p; I* R) C1 T7 {5 ]
** Configure the McASP pins - I5 o) l9 ~7 o' u" H) N1 F
** Input - Frame Sync, Clock and Serializer Rx
1 N" s3 P% x% @/ I( f; H** Output - Serializer Tx is connected to the input of the codec
6 W3 z' o2 E1 {*/3 V5 L4 T( Y+ [
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 \1 |: b, k% V4 p; |/ v$ B
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. d( I& l4 ^/ v2 `) M, w$ J7 o5 sMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 U4 x2 O1 @4 d6 J# ^ g| MCASP_PIN_ACLKX) B; O/ B. F i! k4 H) L
| MCASP_PIN_AHCLKX
" ~& z' [9 Y5 f, x4 Z| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
3 q& W" p$ m- m0 A* P5 DMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR * G5 D& c% v5 Y/ J
| MCASP_TX_CLKFAIL ( D2 n) {' S0 K; d
| MCASP_TX_SYNCERROR
/ A) s4 |+ |0 i6 R+ `& Y/ h" Z| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 F9 j5 Z) o: n* d
| MCASP_RX_CLKFAIL
2 c5 b$ Y8 u# C$ W. c* ]2 r7 Q| MCASP_RX_SYNCERROR 2 B$ D% e0 C# d% j8 V5 V
| MCASP_RX_OVERRUN);
$ P* n% R1 Y( e/ w+ S# j}
static void I2SDataTxRxActivate(void)) j X" w! ^3 U9 A% q# F2 k) w+ N
{& I5 E9 x' G9 }5 |! g
/* Start the clocks */" K+ V! k% M( [9 M0 e
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 d4 c0 s4 |! P4 X) ~McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */. A8 H; Q* {; h$ G7 v# ]9 |
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) f5 h/ P1 D3 d7 a( a
EDMA3_TRIG_MODE_EVENT);* e8 C0 G) j% |7 d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , u" P2 A7 n+ p9 h
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
" H! f. X: w3 SMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ ]9 h, M. K0 |' j9 \; c
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */8 ?( `0 w2 Z4 @3 ?+ o) n0 ?
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */2 V' Z6 J; U! W4 Z; _# f) e
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 N2 o0 N9 q7 x2 T' h5 P2 {! G9 D7 |
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
/ s. F) S2 K* ? ~7 ]! Y* n}
% W k0 O& p1 x请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 X* {4 ^5 y4 z
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |