嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,( { t3 t) h2 M0 U; f$ e! c
input mcasp_ahclkx,
1 F: p8 t. k7 s2 |$ a. R; F* G Winput mcasp_aclkx,
* y2 \* ?7 p8 N! a) dinput axr0,
5 t+ u( m7 h3 [: ^3 s: b% L- T8 n( s9 [6 b& ^9 R' g
output mcasp_afsr,- a$ M! F% s6 s1 H! r, X6 l% W& w
output mcasp_ahclkr,5 N( a8 ?. }7 f
output mcasp_aclkr,, g6 k) e2 H5 V' p6 m1 k0 P$ B) L
output axr1,
: ~+ V" I" b) J/ k
assign mcasp_afsr = mcasp_afsx;
f8 Y7 O; M1 ]7 }( A8 sassign mcasp_aclkr = mcasp_aclkx;
' J( |: Y# d1 j5 a( passign mcasp_ahclkr = mcasp_ahclkx;
4 z( X, G5 f' U, ~# m: R0 Lassign axr1 = axr0;
( w9 H/ ^7 q) V; G- n& @0 p% S
7 N; L0 q+ i8 R2 O
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: v( ?* i/ N* l( X
static void McASPI2SConfigure(void)
& K. b5 Q8 w/ _) p{. L& }2 U" k. P, X; e7 ~" K% _1 d8 X/ |7 c
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 n8 I' H s. CMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */( |7 [$ d ]4 ?8 S9 g4 q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 X, K8 {# }% j9 M5 P1 ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
1 a% W5 \: F0 B# T" j2 I* PMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* ], U7 |' h5 J @MCASP_RX_MODE_DMA);! J* k0 S! G+ i* k7 n- ^
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ E y# [# c8 W: v# l* s/ zMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */% E2 f/ u# N% p0 [7 S% W: h1 d
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 x6 V, |+ ~8 q3 n5 G8 z
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) F: \% n5 ?2 q" M3 YMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + \4 {. R5 B2 H( a g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
& z* l/ o2 ~$ l3 R. a: n; R6 a. NMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- I! F% e" A( Y; W/ W8 m6 l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " Q" b' ~& R$ ~: x8 \ \5 s7 j
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 `: Q$ t' W9 Y
0x00, 0xFF);
/* configure the clock for transmitter */2 Z' c7 i6 G- k
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ t9 g' a$ {1 |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. Q5 S" x2 H: ?) R3 iMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ L$ N) i( o! ]9 Q i" ~, V9 G+ X! h0x00, 0xFF);
4 L. S4 M( b$ Z3 { w3 F+ ?& I) f
9 u9 C1 W& S% K) _4 T+ |# q9 o/* Enable synchronization of RX and TX sections */
0 z) K: m. x( xMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */9 W3 u) ?4 J' h1 A0 Y7 u
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) d" c! l4 I* l! {$ @# E0 | Y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*, Y5 m( p1 J( j) O# Y
** Set the serializers, Currently only one serializer is set as8 z3 Q; A& P' n9 }: m( o1 Y
** transmitter and one serializer as receiver.& z9 m, i2 j t( x
*/
; C0 x; Z1 n# P5 fMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; `. L/ f f* N% t
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
; ], A& L4 ~; E3 P( c. f** Configure the McASP pins
3 b/ T7 O! e9 |1 n$ \; N% w** Input - Frame Sync, Clock and Serializer Rx/ j% l4 B( {! s( `1 H
** Output - Serializer Tx is connected to the input of the codec
+ h' K. H* M/ z& `; e3 K*/" `% q8 J t& h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
z3 N( S' [0 e2 _' HMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% `. r& ?5 b1 y! p. W& W0 r3 T& O
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX9 r# i8 Z% g5 ^& |5 \& n
| MCASP_PIN_ACLKX5 N* B3 Q0 Y% _+ p
| MCASP_PIN_AHCLKX
/ v- r- {0 X6 L5 V| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% u: R4 y7 M8 w! f
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 1 d/ \' S+ \6 ^0 I) Z
| MCASP_TX_CLKFAIL 5 _( G9 b% @$ C
| MCASP_TX_SYNCERROR
+ w" W) x- v' N| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! K$ t, Z2 L; ^( i: f: R) L7 i| MCASP_RX_CLKFAIL
9 F6 H. V# d s) U3 T| MCASP_RX_SYNCERROR
7 Q3 R" t% P& T7 [( F, L| MCASP_RX_OVERRUN);
9 U1 Y6 {, _: N4 y}
static void I2SDataTxRxActivate(void). Q4 o) r6 k* E! [
{4 |7 k, |$ F8 I0 p0 ~3 I7 F& _
/* Start the clocks */
1 a7 ^) C- `; b" } l1 p6 AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( l% `! J2 ^, g* g# u$ y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
9 h) A1 I* A. b0 ~- ]# ^$ w4 y: REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# _; \( H0 n& Y3 s E8 |
EDMA3_TRIG_MODE_EVENT);
8 u4 |2 I( P/ M8 P9 G9 YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 W' K5 n& ?4 [2 t' I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */7 u0 f9 N) q2 B8 r- g1 C
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ A# Z9 \, i7 X* ZMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */5 B M( v8 G3 h- Q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
3 e9 d* u" q' [# M) hMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; I Q, g! c# |( Y/ FMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
/ }. U0 h9 U1 W9 ]}
% [0 C& ^3 e" S请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ H' s/ `" p- F+ T" e, d" a
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |