嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,6 W+ _8 ^) `9 T
input mcasp_ahclkx,
w7 t. W$ A* y4 n minput mcasp_aclkx,) W$ @" p; u* i8 ?2 C
input axr0,
% l- O: X( G- r9 ?/ S8 G* V+ z7 x- M0 b+ G
output mcasp_afsr,
5 a' n& O: @3 M1 q {output mcasp_ahclkr,
1 y2 ^5 q; p" G0 qoutput mcasp_aclkr,) @' x7 F' r* n
output axr1,
! N/ v" C; U8 K. K6 h6 I9 B5 T
assign mcasp_afsr = mcasp_afsx;# _' F% T% E9 y1 _8 q4 ^3 ]
assign mcasp_aclkr = mcasp_aclkx;
9 T0 V( `% m1 E3 v- F; cassign mcasp_ahclkr = mcasp_ahclkx;
* j" v- @) V4 r4 n, U5 }1 t0 qassign axr1 = axr0;
- ]1 y8 h3 h& |3 r) A
9 \* n, G3 Y9 B/ i+ F2 ]; D
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 `* ?3 O, O* c W4 X e/ i8 S3 _static void McASPI2SConfigure(void)# Y3 G9 z, z8 j1 U! @! M
{7 {, d; x i; ]8 x$ w) M* y( @- z) w
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 F8 U6 ~' l3 d, u* SMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */1 n) t9 [: L; ^
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! k% l6 v2 y+ V; V0 |
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
, x$ T* r- ?/ F1 y* ^McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. ^: p9 l- z/ a% w* C
MCASP_RX_MODE_DMA);
+ q8 n/ t$ K9 K5 gMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* {) e/ W- L8 F! b8 P/ JMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; y) ?- i1 A) H2 `( CMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! B) [8 i) b2 {' X' j: E
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 |) x5 {! G* v8 l
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! D5 P& n1 H* d. |; W* N! d6 D \
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */( ^. b7 b; b. D4 ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; q% F/ ^5 }2 W l6 ?1 f8 NMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* h3 p( m6 J4 A9 t, H* e' m! T. vMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 i% M% E) ^5 R% m! M. j
0x00, 0xFF);
/* configure the clock for transmitter */
7 [5 e. t# O; xMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 m% C4 C/ n) k: i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 Q7 e& o! h$ B1 l
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ N8 j' X* y; X+ v
0x00, 0xFF);* y7 P+ [8 C. U/ D
: L/ z4 o% @0 ]5 l }9 Z6 K
/* Enable synchronization of RX and TX sections */
$ b* l8 [0 f- S* H8 @McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 \/ ]1 E1 b! |2 tMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% a& |2 ]: C! X8 W" S# n) s3 Z( L
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
8 P: v8 U0 ^: W* V** Set the serializers, Currently only one serializer is set as: ^. E% O& |( p2 T
** transmitter and one serializer as receiver.: A: j8 f$ X- Z! y' x
*/2 W3 E1 |" \% b* G$ r! U
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! q2 x* j) ^1 F0 L8 V8 V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
: Y8 l7 C9 g2 B6 C** Configure the McASP pins
. }1 c7 v* W: g' w0 d# |** Input - Frame Sync, Clock and Serializer Rx
6 z. R: S& y7 ?1 B1 S** Output - Serializer Tx is connected to the input of the codec
# H7 O; c# W0 b" B" [*/. `. k k2 F6 Q
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: R* G6 @1 J( J+ o4 \. FMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, B Q/ E' c; m1 L. v
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 e+ `, c. F; `8 L8 _" f
| MCASP_PIN_ACLKX
9 R% j1 Q3 t6 b9 j8 C7 N, m2 i( y| MCASP_PIN_AHCLKX
2 B0 @% N- H! Z; ~* |. l" || MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
& M5 i F* i L8 Z3 E$ ~9 Y% cMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . [. {' @. U) M; p, t
| MCASP_TX_CLKFAIL ) {. ?" N! M2 H) D
| MCASP_TX_SYNCERROR
3 Z/ F4 o) Y3 |% g| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ w9 S: g9 r8 t3 h
| MCASP_RX_CLKFAIL
9 i. ^& U5 r0 K| MCASP_RX_SYNCERROR
3 X; V! c; M( R9 X. ?| MCASP_RX_OVERRUN);, S+ w2 o# G/ W- W$ p
}
static void I2SDataTxRxActivate(void)
( Z1 m7 y4 y5 C# |, F2 K. A{
" Z5 y1 C& t; U$ a3 [/* Start the clocks */# z, T9 q: M7 f" s2 _' u: Z& t; `
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; ]$ r: o9 ?/ G) f# Y% [* rMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
! m7 G6 x, _( C2 A) MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, V+ j9 R8 w$ _# aEDMA3_TRIG_MODE_EVENT);
* L) E1 B* _. g7 IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 m- `$ k; E$ P! c# v9 i+ K
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
! S1 i! s' o4 \' J6 L+ hMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
& F: m3 h; z8 f+ n0 J3 a; vMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */6 o7 [' p( Y3 N+ ?8 H# F" }: J
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
+ _6 j7 X' K" J* t/ ^+ Q" v4 qMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: O9 O/ r8 V9 f$ QMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) j# @5 r4 m" J! M- {. }# X/ F}
# J2 W# b1 i" d/ {9 F5 O请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. E) `" h+ Y0 f$ c2 B+ H1 B4 ^
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |