|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,% j, J0 T/ B& D( [8 H- A
input mcasp_ahclkx,
% ^5 _5 B1 T' z5 }input mcasp_aclkx,
G/ x& @) Y6 }. xinput axr0,: s: o2 S5 | e B0 Q
) @# x: U8 _7 P/ g; `4 H9 M( n
output mcasp_afsr," a4 Y; B9 Z) |
output mcasp_ahclkr,$ q- @5 [( Q2 w) v
output mcasp_aclkr,
& y! V1 y: N2 D7 \output axr1,3 H1 U' @4 o& E" B, N. {0 j; Q
assign mcasp_afsr = mcasp_afsx;( Q% z& O. h& D' {" @
assign mcasp_aclkr = mcasp_aclkx;
" z! e$ r5 B/ u/ Q1 Vassign mcasp_ahclkr = mcasp_ahclkx;7 ^$ ^# c8 J7 u3 u+ ~
assign axr1 = axr0; % ^0 d# Y6 u3 H) l( {" ?
8 A$ }4 @. b9 P/ l4 T
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
3 U- }5 ]2 o3 v5 c R" cstatic void McASPI2SConfigure(void)
5 h- Q8 C- c) a4 q9 y7 b. m; X3 Z{
% g7 q& D: I+ r7 f! fMcASPRxReset(SOC_MCASP_0_CTRL_REGS);* e4 G% K9 `& l
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 E# s( U1 b: S0 ?1 t& DMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) t4 }3 e* H7 Q- s: G) O& h
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
* R; o( V, U. m. C+ v0 J, e7 y$ AMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 s4 ?" b( Z' z( ~. T. \( ]
MCASP_RX_MODE_DMA);3 y" u" \. R, Y7 b; b: N8 @0 f
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) Z8 g+ C" Y% ~* yMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ `9 K `1 y: S: W- H0 y2 F7 ~8 q1 X# Y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & z6 |$ B s0 e) a. r$ f6 L! H w: u
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% F0 s! T% {; D1 G+ ^- f8 z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 @8 h7 X( m8 ?9 f
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- ?' d# f4 e5 g
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# v' h# ?0 V1 qMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 K) R& v7 a9 Y+ O! ~McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,% E' @( X" i6 t" c
0x00, 0xFF); /* configure the clock for transmitter *// V+ q+ D' E6 s0 u2 O+ V
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 A \1 N/ f$ L; `) _McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % b8 `4 E% l( I9 y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- b+ \) V1 B: g( N6 O- Q0x00, 0xFF);* D5 t" F, W# C1 e
4 U% x9 w9 d" C. G# x
/* Enable synchronization of RX and TX sections */ 0 p2 N) Z/ h8 C3 O6 W& q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */& B1 s7 m! J4 y6 [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 Z- S6 T; c- @
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 g. ^* E0 b" f1 A3 _. W
** Set the serializers, Currently only one serializer is set as
* Z6 u: w3 Q" [0 s" P4 w- R** transmitter and one serializer as receiver.
# ?* k+ w' I) z! X% _) F) w*/$ g6 n. v4 X& @5 }( s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, F& O- y. p* q5 W/ U' `) ~
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*, x$ e7 F7 o& K" o7 \' Y
** Configure the McASP pins ; O2 W8 w% B7 ?5 h
** Input - Frame Sync, Clock and Serializer Rx
; ?) [0 O8 I! P3 o) l1 W9 c1 x/ b** Output - Serializer Tx is connected to the input of the codec
- v6 |; u: d% w*/9 ?. q" _4 t; x' L+ V* P) o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ j7 ~, |! p: c! @$ ^& h1 \McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 a# w) [4 d2 D* b8 Z) P; }McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) g; d/ ~4 D" X| MCASP_PIN_ACLKX
4 y+ d; O/ s* p& y| MCASP_PIN_AHCLKX1 K+ e$ Z; p- Z& E1 C2 N5 |: b
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ U0 ]5 n1 e( b6 z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 Q' a+ T5 ]6 g5 ]% n; }8 v| MCASP_TX_CLKFAIL ! ]/ N6 q# a z: o1 c- z5 A
| MCASP_TX_SYNCERROR; j5 i& ~' u N- R
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) K! t8 T! H% q: w& o# g3 D| MCASP_RX_CLKFAIL
1 S4 ?8 f1 e/ g6 e| MCASP_RX_SYNCERROR
2 z5 }& h9 Q2 c: J: V! D| MCASP_RX_OVERRUN);
. z# O6 \+ O) ` o. r% N} static void I2SDataTxRxActivate(void)
l* z I: J/ [$ {! ^+ F{
* {' N+ z' C4 D! ~/* Start the clocks */
0 h. C# ^" U0 Q7 }" {McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 Z$ E# ?0 p$ d' o) E- \
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
& t/ K; |& _/ I% u8 FEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! d! \: G' W- H* t1 P2 FEDMA3_TRIG_MODE_EVENT);
) {2 q% d# `" [. UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ J0 E# c0 i& ~# I5 \2 k
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers *// V- f! Y# x9 b3 P! @, o
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);: @4 M0 B) ^5 K7 g7 r" P2 O
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
2 s% d7 w* x5 j4 Uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
! j, x7 u$ D; W( L: n5 F. xMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);+ m" }+ g1 a% t* b# L5 ?, [
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; M" i: t0 m* d, H: W1 v
}
1 V* t' o V7 e" ^请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 j6 Y) r9 `" E3 E1 k s* m: w7 q |