嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,1 {$ _: n( z8 d% H7 A' A; \
input mcasp_ahclkx,( I2 @" }( y6 _+ l/ ? Q
input mcasp_aclkx,
/ w1 e$ |- i+ i4 Rinput axr0,8 N8 s! F- B: n. f( F( c# }5 y
9 y9 e/ B# M5 k8 d. i( X$ ?output mcasp_afsr,
9 X6 b2 A8 c: `7 K# W Toutput mcasp_ahclkr,
6 o' ~6 R+ Q% {5 a% Joutput mcasp_aclkr,( c/ t6 i: C3 ]2 _* S$ h, X
output axr1,
7 ?& ?& |$ X/ ` h0 W- ]* d
assign mcasp_afsr = mcasp_afsx;
( g: p# I9 M' |# g- ~assign mcasp_aclkr = mcasp_aclkx;
h; ~) H- ^: F2 b7 [assign mcasp_ahclkr = mcasp_ahclkx;
, ~" s" c. J5 S5 V! L# M% H9 vassign axr1 = axr0;
! r. V3 c, } ^* p; P! I: J$ U4 B! ?# D% j, ~* \1 [ t$ ]
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
* O4 T& b2 |- f* e5 G
static void McASPI2SConfigure(void)
" o3 m2 G" P! F- P{
) B0 x+ }7 R4 m) d3 M) DMcASPRxReset(SOC_MCASP_0_CTRL_REGS);! C7 j, {# c: ]" K
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */1 Y. S% e, Q" N3 p
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# x$ f1 H% N. _5 BMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */8 Q% D: b+ m( J
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( `8 ^. N% y- m4 c
MCASP_RX_MODE_DMA);/ I2 s) Y! Q- v6 Q- W* _
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& R, [1 ~+ P0 s
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& U# g0 z. f# f lMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ Q) T! w9 J' \" F0 E3 L E7 W/ ?8 y
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: ], D( P' g1 K1 U) L& D. [3 E- |0 eMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % T5 y$ S5 i4 g* G- _/ }
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
, l# R. Z& m& a$ P, m2 U5 kMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 I. @- B1 ~$ g5 E1 w. @
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * d6 z& s0 [1 w- i
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 p' L5 i& `& G# L' `8 [
0x00, 0xFF);
/* configure the clock for transmitter */1 N" s" X2 [' x' o9 O# a% l
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
" D3 j2 @$ G# a: m+ Z- d- Z! D# JMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( L0 t; P: h. L1 x+ G* J
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," E7 M/ a2 E" [! I5 W4 _8 k/ s
0x00, 0xFF);/ R! A5 R8 K6 Q
3 ?8 B8 y" ]' m1 b% _' \
/* Enable synchronization of RX and TX sections */ 6 c& G- h/ R" E% Y' x
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
. o9 d% R& V; I( a% i: T# ]" e) hMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* ^5 k) q1 ]/ ^; ]8 ~5 B
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*. {+ w# A# m) J R% F4 ]+ C
** Set the serializers, Currently only one serializer is set as
& w6 x; s. F, S3 Z R" }" E** transmitter and one serializer as receiver.
0 w. x8 `$ n+ b; d*/
* ]3 K* Q# q# X1 ?! V( P; bMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 H) T3 R s9 j1 n8 o% H( @8 d" W& ^McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*/ B$ z4 H* M8 N! |' @
** Configure the McASP pins
: e: U# m$ p, W7 q( {. _1 m- @** Input - Frame Sync, Clock and Serializer Rx8 A) Q: [/ O9 _3 Y$ R! @
** Output - Serializer Tx is connected to the input of the codec
' z: l i$ h- y! U/ x( ^' `- b*/
: K# P/ T* B: G* l* O7 c% `. J) ~McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; m& v4 V" X4 ]0 a& u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: n2 z/ r* [. uMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' z2 E5 l: R% y. J
| MCASP_PIN_ACLKX
; e7 {4 }6 L+ K0 C1 D' n" t| MCASP_PIN_AHCLKX
1 B, S8 `9 Z) ? m| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */( q. ~$ I9 A/ q% A" J( w
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 f4 d1 r/ |8 a$ o' U2 J& T| MCASP_TX_CLKFAIL ' A" j) E$ B" r: d, f
| MCASP_TX_SYNCERROR
, n/ G7 a W2 _1 f% }| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" V. i% A7 f/ k8 {6 U( S3 L, p| MCASP_RX_CLKFAIL( j; P n6 \2 v
| MCASP_RX_SYNCERROR
+ e" O" q2 b3 X6 c! P. H/ i| MCASP_RX_OVERRUN);
# E/ v, a. K! j0 p J% Z}
static void I2SDataTxRxActivate(void)
3 K2 q9 |0 b4 i{
( r O3 a6 \6 K* A! i5 j/* Start the clocks */ S& f; [! v1 i3 _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; K8 g) `$ N; | k5 I+ j* q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
' q% Z& x1 H6 S6 x( {& ~EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: V/ p* l% ~& l
EDMA3_TRIG_MODE_EVENT);" Q2 }, E# F" r5 s' f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' M! j7 ?+ O7 d
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
1 C' s6 k$ O0 c1 t3 sMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 L$ c! z" q: N( m: GMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */- a- b+ p0 Q. a* t
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */4 r, _5 w+ P9 M' M2 E; c: d6 U
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 J/ A. y0 Y! h/ u
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 n; O) x; d- f# n
}
. {% q2 J {# W
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. c/ o+ `" N' S0 m$ o' r" u! L
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |