嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx," ?/ z# a3 b/ b, p4 k' \7 l
input mcasp_ahclkx,# `( ?9 {" G- b# z' [3 G
input mcasp_aclkx,! r( t0 S7 u7 U, ^$ g. Z4 b3 [: r
input axr0,
/ E3 q8 @( a: L
- a, @" q% K7 p6 v1 w6 z8 J. @# k L' Ioutput mcasp_afsr,. A- w } I, [- v9 s& I
output mcasp_ahclkr, E6 W/ o! A8 w; O3 Y, o) B
output mcasp_aclkr,3 K2 T$ j7 ~+ X/ h
output axr1,* c" ]' g) T- V1 T g% O. l m
assign mcasp_afsr = mcasp_afsx;
/ P3 T; W& N1 A/ C9 I3 n# h" cassign mcasp_aclkr = mcasp_aclkx;+ |$ {. C5 A1 @0 Z6 k
assign mcasp_ahclkr = mcasp_ahclkx;
v9 V% q6 j# M# ~9 nassign axr1 = axr0;
; N! R" x I0 s) e$ H) n8 m4 ~! \) J
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& p" ?3 S" m1 W9 Y) c. E! l
static void McASPI2SConfigure(void)
! s& T3 W& n! A: M{
! d$ E8 j4 w2 n8 s1 L- @/ e& sMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 b4 k& j3 W s* F$ A) ^McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */ E; h: e! L. D- e( @ e2 }
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: E$ p0 f* S/ c4 e% A
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
* Z0 u0 r, ~9 u. vMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% x6 _1 Q2 F" \MCASP_RX_MODE_DMA);: u' g/ k$ d, x i7 D
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- ]9 o1 l; ^; W9 f& B: R1 d
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 g- ?! z* r) k- @# r" e. xMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
( A/ _# V, }6 h! F0 X4 T. IMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* J# K; C7 ?4 n: O9 B
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 X+ o+ P% f' s" J. g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
) P# }+ T7 K* @. U" ~" J) J+ xMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
1 i* g) v1 k, `9 L+ D6 BMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& n: [( Y5 s, S3 ]McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 I v7 Y) q# ~( d
0x00, 0xFF);
/* configure the clock for transmitter */$ ]! ~" m2 r K+ i
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, F# r) X' k4 s) k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ Y( [. g: @' M$ D, @McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,+ v" r' Q4 F( ]+ T; w1 m. S
0x00, 0xFF);
' z5 s1 r( S5 @; N2 W3 n
8 B* R- c2 R V2 q0 E2 P- W% U/* Enable synchronization of RX and TX sections */ # u2 N# R. [" J4 |& F( n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 i: J0 U4 Y" ]. f3 F7 BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. X7 d5 x+ M' }7 zMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*. }' b H( z$ v6 a) L! O# E0 p
** Set the serializers, Currently only one serializer is set as
8 I& o8 k. S5 ]4 A( S9 F9 x% x2 T** transmitter and one serializer as receiver. y% N! E t: a# i( C* ~7 m
*/5 B: B& X5 [/ k8 ?
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ C) u" y+ m% c/ d
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
# i; g+ M# s8 f6 A) S# [( |5 ?** Configure the McASP pins ' t1 A8 o0 ^6 u: B! a
** Input - Frame Sync, Clock and Serializer Rx
, j: E, e6 l8 u2 U** Output - Serializer Tx is connected to the input of the codec # t: b. R6 { Z; D# l2 J# b6 c
*/' [1 t) b! N8 f$ P! q5 x" H
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) J, P9 G+ o) b3 N- [0 e1 o/ V8 |McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 d1 a$ r S8 w' }* o/ j8 O. g dMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' C6 E2 h D( ?4 n; _+ g
| MCASP_PIN_ACLKX. u& S# u0 u# i) c% }3 p2 p+ x
| MCASP_PIN_AHCLKX
! T) |4 t) m# l$ q8 g: H4 I- g0 Q" q3 ?| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */; x2 }5 |1 h7 S& U, i3 X
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! ]: D" O7 j* O
| MCASP_TX_CLKFAIL ; F/ C7 a) ?4 E d! v
| MCASP_TX_SYNCERROR- [7 c9 V3 d' k
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % c, R' W! R9 j3 ~2 m
| MCASP_RX_CLKFAIL k+ o3 M& M' A! ?4 {8 s; ^* B
| MCASP_RX_SYNCERROR
, N% B n0 ]( J. L4 ^| MCASP_RX_OVERRUN);2 t5 W! c1 z& z! Q# s6 @' Q* s
}
static void I2SDataTxRxActivate(void)2 v- C% U$ x1 M" |6 N' p2 r6 \
{
# ^. h" Z1 Z. M/* Start the clocks */$ f m6 ]1 T' e$ X
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);4 f# M7 M+ i) O) B- D- N
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
, v: O) O6 I: C; nEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ y1 Z( @! x8 @- Y8 e/ m
EDMA3_TRIG_MODE_EVENT);
/ B1 q9 X# ?7 d! X0 z) n& M9 D' zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
v4 R7 I. C% h6 eEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */* A* v7 G5 j& G/ C" k7 w
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);+ L9 y* B8 p( _
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
6 P3 Y+ H- d+ ], y+ ?while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
1 b* L% e" R: [/ ^% SMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 x8 T0 S) M3 _% Q" B0 p4 WMcASPTxEnable(SOC_MCASP_0_CTRL_REGS); J7 a+ t' E7 G, A" h# r2 h
}
8 c" O1 x3 I( l请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 a3 a, B. c3 T
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |