嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,; ^/ V; w/ A5 l9 a& I
input mcasp_ahclkx,9 d' X4 }5 M) h9 K6 i, z
input mcasp_aclkx,
8 a9 T0 f/ G( l7 V. k Hinput axr0,
. O. G* }4 b8 _4 x: |- k# M2 U, I% s0 K4 ~
output mcasp_afsr,
7 l2 e0 C5 b4 ^6 J/ ]2 Aoutput mcasp_ahclkr,3 z( N9 P# e3 Q Q4 E4 `
output mcasp_aclkr,, a0 L$ J) }# L4 E' k
output axr1,( }/ h9 y2 \2 N3 M' N
assign mcasp_afsr = mcasp_afsx;1 P0 X. A' P- F; J/ D0 {; P5 f" B2 n
assign mcasp_aclkr = mcasp_aclkx;
0 S5 k+ n# E. z: O! x( r: M H% yassign mcasp_ahclkr = mcasp_ahclkx;
% {8 T$ {' I3 X2 r iassign axr1 = axr0;
9 C% o3 M0 s. }3 W& N- c4 g
9 o% H( [8 l/ p" O0 e
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( y8 m, _, |0 {! B3 e: R0 u2 r
static void McASPI2SConfigure(void) _0 U% G$ W& n& A! V
{
0 p$ s" p! [! K q" d5 ?, tMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ F" d# r7 B( t. D+ [" l+ tMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
5 S" n2 W, N. M& n+ Z0 K, j. GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 q S6 V$ n, R: D2 eMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */& T4 k, q9 n- s3 J) O
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) s7 ?% ]% q8 g+ D- S
MCASP_RX_MODE_DMA);
2 ^4 d9 R$ y+ n: W5 S Z7 sMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. R) C5 G& Z( k3 h% p1 S$ L: y
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */" q! b1 _1 O5 ^4 M/ \
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 I9 Q1 j3 v. [0 X$ {, v$ k; t! u9 |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; @; H: i; O3 U2 z0 _McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
) {# n% g$ F! kMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */( y/ i7 [7 r8 w% b% O
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! X j4 b2 e( _, uMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# n" e& \6 y) K, GMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( [9 l$ D" M8 y) x+ ^$ M+ f! `1 |6 l$ f0x00, 0xFF);
/* configure the clock for transmitter */: a: }# u; q& z* ^* B- y; ?) |8 f
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% U) o1 R4 p- n& ~McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" H) A' O+ c7 C7 ZMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ p6 M- k- f1 d8 N0x00, 0xFF);
0 |7 P8 `( d- U9 i) @. E6 z8 a, M: ?0 ]# c
/* Enable synchronization of RX and TX sections */
5 \ f2 t" _4 x) z1 eMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */# _/ P4 J' _, Q, H- M7 U) |
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) p0 z {/ `1 q3 a1 ^
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
& ]- k1 J+ o9 `1 ~** Set the serializers, Currently only one serializer is set as: F! D$ w3 T! i. T4 P1 ]
** transmitter and one serializer as receiver.7 j+ S7 D3 j3 z# R, J$ E$ E
*/) `9 k T7 p3 W! A
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);4 o. \. c. X! I/ a) O7 B% x
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
$ f1 l# o) p6 j** Configure the McASP pins
, a. I( R5 l1 q4 d. v** Input - Frame Sync, Clock and Serializer Rx" W: S) @5 x/ l% D! ]6 f- V% Z
** Output - Serializer Tx is connected to the input of the codec ' j1 k+ ?0 `7 d$ w+ l: l9 P
*/
' P1 f8 J* K* {5 |McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; r" y* ?2 T3 Y+ [) l" N( J5 G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' K, s0 d. L$ _2 `( w, Y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ e$ [/ e; x* \0 g7 q% Q| MCASP_PIN_ACLKX0 x3 W! H$ v3 A
| MCASP_PIN_AHCLKX
4 t0 ~) H; I f| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
- |4 p6 j' K& K& a( P% K, lMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 k9 k( c. ~# M% @: i9 @| MCASP_TX_CLKFAIL ; G/ t* `# a9 E% k( X+ X0 o1 ^* \; ]( J
| MCASP_TX_SYNCERROR
& n1 u$ l6 I0 M4 y| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " M' b+ ]- @6 L( s" G9 \0 E8 z
| MCASP_RX_CLKFAIL
7 Q# f' R& {2 S+ E| MCASP_RX_SYNCERROR . O8 M3 h5 S) Y8 `6 P
| MCASP_RX_OVERRUN);
' @3 h' W! n& ?5 ^}
static void I2SDataTxRxActivate(void)2 C$ f6 r: A* w" S4 i
{3 \1 C$ K6 \" V& O6 h; D# W/ L
/* Start the clocks */7 Y* t( n% Q0 C( M
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
@* X% b) A( a% ` H& P. v; mMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
# n3 x: {) j. _ N FEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# n0 y, X, }7 C7 |- A' mEDMA3_TRIG_MODE_EVENT);0 M8 L) C! i- f9 h8 _. t. _
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( f2 p. T% f/ M* d. ~EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */$ g S |- z$ p. V) |3 [! B& H* Z: V8 m
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: j, u# D: x, U" {* T7 LMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */$ X# P7 @) R6 s1 l; t
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
; B0 A/ X$ A( c: kMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 R' U. v& s) X( s8 O/ {* @$ L
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);# T! d" |. d, e; S% q& r
}
) w: M3 v8 h6 N) n4 b/ _$ S4 [9 G请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 ]* y7 `; R: l2 m7 d+ L+ P, j
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |