嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,3 J4 b3 z- `, i' D5 @" O
input mcasp_ahclkx,
% {7 f5 v; @% _0 t. q; o yinput mcasp_aclkx," m- `' ^8 a( V: z+ j2 q0 i4 G( d
input axr0,
3 Y7 X- P1 A6 M% g' U+ K+ t
7 Y' h% }5 M7 T0 a, ?* ]! w- }8 Toutput mcasp_afsr,* a! R' T% q7 K3 U% E
output mcasp_ahclkr,
$ k! {, V2 n6 Y" o6 Zoutput mcasp_aclkr,4 [: S( K; x' _! U# `5 E
output axr1,
9 e( h; g3 [0 \8 a3 y
assign mcasp_afsr = mcasp_afsx;. a4 l4 H- S9 m# t/ P7 E& G
assign mcasp_aclkr = mcasp_aclkx;, ]6 x' v& K! |3 e8 k
assign mcasp_ahclkr = mcasp_ahclkx;
/ Y# z5 |1 @& X1 x$ |7 o2 W- oassign axr1 = axr0;
; d, M6 o3 K9 r- V
: b+ j) |/ {2 [9 y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! p& Q2 K/ a4 i+ `7 P& B1 ^
static void McASPI2SConfigure(void)
% p+ ?* P/ q1 V {0 k4 P1 i. v{
% Q8 f y/ e2 v+ ]0 k7 }9 B% ^7 O* aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 @8 t$ C$ @3 o- A: _& SMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
( c6 d( \) l2 s% O5 E0 |% lMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, J% g, z5 L/ D# W, `McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */' L7 h9 b& g/ ?1 K* |
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 k) e o, C' R2 nMCASP_RX_MODE_DMA);: ~( c5 q8 {$ o, r% p
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 b2 o0 n: g; v6 u( OMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */! y$ g7 B3 G4 t6 ?4 }) a$ k0 g
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 o# c" N( j9 F9 U* D3 aMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* v2 ]& ]+ Y- j3 R; T2 g! |McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 T, K' v$ H+ m( iMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */6 f5 E/ _- S# e! _
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. E6 ~) |% z' I) a6 B Z) F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & C. m, O, t& ~7 a6 A
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 ]$ \0 L: a- H+ L- t- | c0x00, 0xFF);
/* configure the clock for transmitter */( f" y6 t$ A- j) l1 i3 u
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 J# H+ `1 M e8 e: U! G2 r+ I/ MMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / j! P, E \! J9 E0 Y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# V! E: a( [* _
0x00, 0xFF);
, k6 O7 c3 o8 F: p" q) ]% V/ u
/ k0 ]% K5 o- B7 O1 p/* Enable synchronization of RX and TX sections */ " `) m3 |- Q. Z2 W1 p+ B8 y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */1 r; N q' i( F$ x7 E
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! }! E ?* e$ ~+ ^7 `McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*$ D, v, k( O( C5 x1 H/ b4 P
** Set the serializers, Currently only one serializer is set as
) B, {! u% {$ x& _& f9 ~! X( ~** transmitter and one serializer as receiver.
. H$ H9 z9 v! A% P' i: M*/
% E1 T i! V7 |4 W1 ]; D, LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! e) Y0 o" X1 v+ W3 q/ O" l) n3 ~* CMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*9 I. t# |8 u+ _! p" i! v) ^' @, Z
** Configure the McASP pins
. j$ v) `- g( s$ A: m! c* `** Input - Frame Sync, Clock and Serializer Rx% T" i+ I' l r9 o$ E! r
** Output - Serializer Tx is connected to the input of the codec 2 J5 w6 [+ l2 Z5 _" X- S8 }
*/; e% Y. X' N5 S {' E5 E
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: u4 o7 m0 i! M0 p3 M: \
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 K' I3 Z6 Y' P% l! }/ R& Y* c
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 U. s; Q+ y" Z' @ _
| MCASP_PIN_ACLKX3 @$ ~' J' `+ o
| MCASP_PIN_AHCLKX
" ]: |0 i( o0 d4 X* y8 P/ V| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
+ Y9 K0 q4 e. c. {McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) e8 _7 @" o3 L$ f5 z! \/ U* F
| MCASP_TX_CLKFAIL
3 V+ Z, j. U& z. {4 y: C| MCASP_TX_SYNCERROR
0 _5 s5 ]/ n l8 [) h| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 7 U5 x# N0 H6 _& f3 O
| MCASP_RX_CLKFAIL( q1 I+ p6 e: B9 o, a
| MCASP_RX_SYNCERROR
7 s( c1 @2 C. u- ~% z. w| MCASP_RX_OVERRUN);; Y4 k% d7 [9 |) u; c+ Q
}
static void I2SDataTxRxActivate(void)
9 Q0 v) B7 v% \+ b& ~* W{
' ~& {6 d4 C+ F- s' S' Z9 j: x/* Start the clocks */
" {9 K! e4 M2 p# K2 H$ x, sMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, A% x8 {7 s- s zMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */, D! k1 ^4 j+ ~, f! ~ n8 C
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* ?2 l/ t& B+ b: m* ~0 v$ ?* S9 yEDMA3_TRIG_MODE_EVENT);* |8 l2 U! T2 c+ d- J0 @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ s! _. A4 ^* Y4 l$ W$ R* _8 X
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */. L9 R& O+ ?1 C Z
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: \# A% x1 Z' O- B8 rMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
7 e2 F. w$ ?- ]5 lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */' ]( p/ \) ]' {: u/ t$ v
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 P% m D v6 O2 V% p) r- j# FMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. Y5 \* C; Q* c7 |9 H}
7 a! }$ P" A3 G4 {) |3 K& j
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 J0 K0 G4 T4 r* O) l- x( \
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |