|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,7 [+ q' c" m) U. N2 K
input mcasp_ahclkx,
4 x$ V% @+ l0 J4 k- L N4 Uinput mcasp_aclkx,
7 A) ~& |6 X/ J, Uinput axr0,
( v) G0 f' ?# `! G' i8 \- L3 c" K
output mcasp_afsr,
5 T& I2 N# f$ B! T6 i/ p _output mcasp_ahclkr,, j: w" T# L% W" b& m( _( n1 |: x: x
output mcasp_aclkr,
2 T# e! m6 @6 g; eoutput axr1,' U w' h. s/ V1 W
assign mcasp_afsr = mcasp_afsx;. i# a1 \, w5 e$ N( U6 I% g, n
assign mcasp_aclkr = mcasp_aclkx;7 L+ G3 d; H, U- Q- Q% J, N6 @' @
assign mcasp_ahclkr = mcasp_ahclkx;
" d# q! T( v* n3 `: [9 kassign axr1 = axr0;
' d* V2 {. k* C0 \5 R. Q' E$ z6 ]& H9 t9 o0 O3 D- D W
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
. M* x! P) h1 P9 B/ Y$ @static void McASPI2SConfigure(void)* b4 q. F1 ~- B
{
; x) Z/ Z& J$ ?" O% R* S2 p% c* j, s: i/ G* sMcASPRxReset(SOC_MCASP_0_CTRL_REGS);. P6 F! Y' R3 ?3 _
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
; v* G& B6 B9 z6 c0 B& F+ @( }McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( T* z4 a0 Y0 _: O; \+ W8 x8 {McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */& t0 ]5 C# t9 W; b' Y' j2 H& {
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 S: e% W/ K1 [- Y' @MCASP_RX_MODE_DMA);
6 t+ N5 W/ u3 c2 UMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% J$ o, z" b0 I
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 y9 Q, M& T9 C' g( d! HMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; ?# E5 S' a& q" O& S) m; kMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, E! E' N5 ]2 I; }8 x
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; y R# ~1 e/ J, i( H
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- b' R8 [1 H+ O; x* ]2 QMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) M" H3 R- n; \; p5 m+ Q) }( b; l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% [* o4 Q1 C2 w" n. i) [McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 _3 L5 b6 W7 Y7 g2 k! k7 a9 i
0x00, 0xFF); /* configure the clock for transmitter */
. G* `; h" A5 | i) @0 U, G5 pMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
6 f1 d# H. q4 o0 B: [, eMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& k5 U5 |8 b E0 O/ b9 HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) a. s( J, `' u& C7 H$ }: `
0x00, 0xFF);" e" p* W; w" E- T% B& c: P
0 C& n, Y u+ v" k
/* Enable synchronization of RX and TX sections */ , X5 v/ F+ o2 P
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
9 X/ \) R" a0 }/ A* tMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ G/ i7 E6 A ^6 K" j) HMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*4 U8 A4 x4 o' h; F$ g% Y; a
** Set the serializers, Currently only one serializer is set as8 a& r) n+ l" y8 L3 `
** transmitter and one serializer as receiver.$ v& K+ u$ |7 F4 a0 Q
*/) ?1 f- I' W' S5 Q- T+ y- I' @9 z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ n7 Z: g) a+ y7 e) |" w. g
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
1 c% u9 j6 Y# m2 K0 Q- A0 L** Configure the McASP pins
: I! p+ s' F8 f; ]; v** Input - Frame Sync, Clock and Serializer Rx
C+ |: G( U0 I, B2 ^1 H** Output - Serializer Tx is connected to the input of the codec 1 P8 n6 c' l7 h7 w% [
*/5 D9 D; c# H1 c- E, |: h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 C( \! x) ]. fMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
7 E7 j2 T4 [' h$ I& iMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX! K, F3 H# L6 x: `8 o' A, v
| MCASP_PIN_ACLKX
, s1 k- R/ K# `( u0 Z0 B| MCASP_PIN_AHCLKX, [8 y/ g3 k+ j9 j
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 r4 E/ b4 B2 J* w8 x: M
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ J! u+ s) s7 t| MCASP_TX_CLKFAIL
4 w$ d- [$ d0 O3 S e| MCASP_TX_SYNCERROR" Z( y9 |) H# m
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
6 K- A0 s3 P: F( C| MCASP_RX_CLKFAIL- \2 ]5 L* Q4 [# v3 N8 V* ^
| MCASP_RX_SYNCERROR # h- a N8 D. {6 E* U0 ~$ {
| MCASP_RX_OVERRUN);" q1 B% n. }: {$ e+ g
} static void I2SDataTxRxActivate(void)0 h6 t2 x: H9 x
{& ?9 g" o9 m" t8 f
/* Start the clocks */! Q- L/ T. i& [& |/ N* {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 f* e1 {5 F7 |# R5 y5 e( {9 d A& B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */3 ^5 O- x- \9 ?8 T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# b$ F- N. Y# D: F) nEDMA3_TRIG_MODE_EVENT);" E" g$ a P4 [. i( _5 ~$ m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! X8 }9 F+ c: {7 ]
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
9 V6 V8 Q8 t/ z! \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 E9 v9 `' p; S3 Q- A
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */, u3 h7 ]# q8 j2 @5 [
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
. n) s3 L6 o+ O5 YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 c7 R8 K) P# I7 e. T
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. \3 [* T4 L0 ~% p- M
} " k) F/ Z( ~( G7 Z
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 7 o4 C4 V6 ] K& l2 Y& c2 R: |7 i
|