|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
! F4 l( c# ?+ ^, y& O+ \" Oinput mcasp_ahclkx, f0 Y) o( z+ L; F5 M
input mcasp_aclkx,; F3 |7 q- t' |( b9 d z
input axr0,
2 ~- d' N/ G) F7 X$ ^2 z9 t6 T( K! R: C+ P
output mcasp_afsr,
+ m" V( n! }9 f @output mcasp_ahclkr,. J' M3 @: J* l# @. ~7 o$ h+ p
output mcasp_aclkr,
3 F; |/ B) }' N2 c i" coutput axr1,
' Z7 G6 a+ _6 p0 |/ d P assign mcasp_afsr = mcasp_afsx;5 D Y" l$ y& u4 L1 U6 z) N
assign mcasp_aclkr = mcasp_aclkx;
+ s4 t+ a8 p& h0 ?. [4 kassign mcasp_ahclkr = mcasp_ahclkx;
5 g2 o* F8 |$ K8 Q- }assign axr1 = axr0;
, a$ y' {6 T, {. {6 W$ z5 l+ c4 @- k, d( B) B$ g& o- h8 }, ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 6 _" J. X- n( ^% Z
static void McASPI2SConfigure(void)) G3 _6 b. ^5 d7 l9 N0 r/ F
{
! j" K0 \" F+ Y8 K1 J1 ~. ` pMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ R6 P$ y, s ?4 ]McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ }* o' P' ?0 }5 N3 l
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 V8 F/ ~, u9 h3 Q/ @5 B! s( ZMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
" T# ?5 c: G" U' \; h6 V" H4 YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& }5 S5 x5 r1 F( n) W/ W1 @
MCASP_RX_MODE_DMA);: L2 v1 h$ I; a7 b8 A7 Q# q ]- i
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% R- d) E( g2 y" WMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: ~% w" a0 c8 D; O, i0 FMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( Q: ^; ^, J& f# ?9 N
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* S G u2 ?; L- N
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
8 o4 Q3 d( f4 i# \MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" m; ^& u4 A; g+ o, F3 M
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 c# K9 d6 \% x" f) yMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 J7 o, g4 T! V* a6 G' k
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) l- J) X0 o; C) I0 R0 V* V8 L& `6 G- L
0x00, 0xFF); /* configure the clock for transmitter */
# @- b- s& {3 Q, s# A) BMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, P- e* U3 C7 C! R
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: R3 L7 s( \0 Z- w; NMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) ?/ Z5 B( {+ R0x00, 0xFF);1 ?# |& a) F3 c5 k! `- ~$ ^# G
: _& D- \% f7 o/* Enable synchronization of RX and TX sections */
1 P* s/ y4 l( z$ M) ZMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ s5 d0 a. @' XMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 H, F- O$ v# G* S) D! h: f
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*, K4 Y# {* Q& j8 B9 f* E
** Set the serializers, Currently only one serializer is set as# g5 q0 ?: i7 d
** transmitter and one serializer as receiver.& g! v0 m& O# m [/ ]
*/ @0 \; t" a S+ y% _; y( i
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ A; C% \) Y( z4 `) f. pMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*+ b! c; y. d8 |* O$ ^
** Configure the McASP pins
& \7 E/ h2 X8 M# P0 [7 t- a# p** Input - Frame Sync, Clock and Serializer Rx
6 L. E8 T0 N' ?' G7 X# Q** Output - Serializer Tx is connected to the input of the codec ; C7 W9 L! Y1 M& f" W, h9 Z
*/" x l5 c" {. ?0 C8 c) y0 p
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 L3 Y. M' P) w8 JMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 I8 `: L- K. z7 j7 _7 d/ }McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; h+ ^1 [' S$ T; X) ~
| MCASP_PIN_ACLKX: g5 \9 h+ Q3 N4 C
| MCASP_PIN_AHCLKX
) [, D+ j. B n& ` {& B# [. N| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */6 k! a+ ]* f4 x0 O0 Q
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " j( u" \( c* g) K9 v" T: q; `
| MCASP_TX_CLKFAIL
Q1 T1 V/ Y" F/ a+ V| MCASP_TX_SYNCERROR
% ?- v/ d; l/ N+ Z. c, z* e9 V$ F| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* n% A4 B' x* N| MCASP_RX_CLKFAIL
' @% t2 n- t/ B3 P: o, I b| MCASP_RX_SYNCERROR 4 g8 v. w6 w5 H/ X- B6 h5 h
| MCASP_RX_OVERRUN);. k# o1 m. ]8 ^9 _$ B, E. V0 e
} static void I2SDataTxRxActivate(void)- g% E8 W* P2 U
{
. u$ S+ s6 O$ m9 j8 R9 w9 V4 p/* Start the clocks */# O% b2 i1 P2 f0 q8 M$ U3 f
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' m; j) _/ p- Y$ E6 y/ e# D
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */* I% Y3 X0 _6 } r" m, q. R: {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( M; B( q7 n4 p u5 d6 J$ M% L7 c
EDMA3_TRIG_MODE_EVENT);
! y3 U8 ]' n) N/ [1 u/ o/ b, rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 K3 Y0 e1 v: I& [/ P. Z O/ n
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; D$ s$ e! R5 C% ]; ^# n8 f' nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
0 F! S/ T0 B0 e) Q" Y( N }# wMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# V. g- ~, R" r+ ~" pwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */4 ^2 V$ ]6 Q2 Q) C
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' |' o( i% _. H9 k( \. P
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);+ O! F6 e' w- B/ b, P5 o/ d7 W1 N- ?
} 4 ]- L. k: r" P6 c) N
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ w! B, x, O( X0 f |