|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,* B( i1 U0 ?' u# j9 N7 J8 @
input mcasp_ahclkx,, G: E# X% H7 E0 _0 W' C* x( N1 e
input mcasp_aclkx, C2 o. U+ B" J% M% W- k) H
input axr0,# v9 v4 J; p- F) O J5 h
2 q7 O# [( L1 _
output mcasp_afsr,
# T9 V6 w, j; }9 ~7 d1 K1 toutput mcasp_ahclkr,2 c/ o( m- [+ g
output mcasp_aclkr,
2 k3 t# H" ?3 v# Zoutput axr1,
# n) h3 |0 I* |' [ assign mcasp_afsr = mcasp_afsx;2 e! Q; V: l7 o; \4 R
assign mcasp_aclkr = mcasp_aclkx;' E$ W7 K2 X' ?/ A' S
assign mcasp_ahclkr = mcasp_ahclkx;2 I V, H& a/ X1 u' o
assign axr1 = axr0; 8 w: d! B9 q8 _6 }9 ~" ]6 F
! j4 [: l! J& H$ O Q( L$ o0 I在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' V* u* i! O3 ^! P# [" a
static void McASPI2SConfigure(void)$ }; i8 J7 a! i. \! L8 E- x
{* x. j7 ~2 l( l1 p# P( |( c$ U
McASPRxReset(SOC_MCASP_0_CTRL_REGS);- o, A: W ^# H+ E( Z
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */( a. H; @% t9 V2 e) R
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" r. M7 r2 o7 C7 J& x
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) | K7 D# h* V% E& n
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" ]' Y: r& G# d+ W6 b; O* R- vMCASP_RX_MODE_DMA);: k8 U( e- ~( T$ {8 o6 ^" H
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# ], p' \- Y1 B9 }4 w. V3 h) gMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& n) e0 ?4 v- C7 PMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
& {+ {" U) M6 o& ~% zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
B) D! K; f" ~* D' Y: R* @* EMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# i4 n1 ~# s3 q- ]% dMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
: A# \, F0 D5 R F+ @ H4 O: qMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" ^" K3 i! B+ V+ j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ! `1 @5 |# `4 [
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 q+ d- W/ l) {) v' G, p- u* K0x00, 0xFF); /* configure the clock for transmitter */) W4 J1 {; L& J% ~* k
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 L1 J/ ?9 @, u) J- IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
/ { M+ ~$ R3 J1 q* M, z T3 T) ZMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
7 ~6 `5 y' ^$ b% z0x00, 0xFF);
. X0 f6 z9 o6 K; p% Z5 T! N% |* s/ U4 v- F
/* Enable synchronization of RX and TX sections */
6 B7 P8 O( o8 e; h |6 D H( kMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
: q4 F" c+ U! B+ C9 g; \' jMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& A1 m. L) @, c" s( F& Z5 O T1 L- FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
& m' R6 m8 `6 c** Set the serializers, Currently only one serializer is set as
6 Y0 Z' A8 u' @! ]* h** transmitter and one serializer as receiver.3 k- L0 S, E" Z# i# I. ^$ m/ a
*/
1 Q8 }% a7 x: U5 I7 ?McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 c9 t Y/ P' y% ^' x. K; D# z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*- J7 i3 ~+ X- P: V3 O: a) O
** Configure the McASP pins 5 N; Z: H g) I7 |, ~4 ]# b
** Input - Frame Sync, Clock and Serializer Rx
, v( l b% ]; }# Z0 Y** Output - Serializer Tx is connected to the input of the codec 9 G5 \4 q* S/ l& n
*/
. R9 F, m6 B' F9 \, S; j! _. mMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' m; N/ |) k9 H- DMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* r" a! a1 ?% Y! Y# q) D' U4 d7 v
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 _$ G5 k) I7 m* b
| MCASP_PIN_ACLKX
a4 c/ p$ u0 y/ _; t7 k4 F| MCASP_PIN_AHCLKX: h. Y: y7 v& H- a$ V
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// _, w* [/ X) P$ l0 }0 o! S7 } i
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & E; q5 k& M. d3 F- ?( W/ @! N5 T
| MCASP_TX_CLKFAIL
; N& u% _) K2 T| MCASP_TX_SYNCERROR
0 @0 ~; T% U4 ~, @| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 @% ~% V+ D; W6 m4 |1 N
| MCASP_RX_CLKFAIL7 P: ^7 P' r/ |3 j0 v
| MCASP_RX_SYNCERROR Z3 b. v* R3 n' `0 q
| MCASP_RX_OVERRUN);! [3 E% h) Q& Y/ \% ~8 j
} static void I2SDataTxRxActivate(void)
/ v8 _; ^: l. k{
5 q2 ?7 K, \, b1 `1 Z& ~/ N/* Start the clocks */ G/ S- l$ h6 ?$ w
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' z$ f6 A; x2 M4 O6 u1 P( ~) Z' J
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
0 M( v: h& j) P! Q9 Z! {EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 W) M7 k. i+ w
EDMA3_TRIG_MODE_EVENT);
2 U4 a9 `) P/ J* r% v) x: tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% ^4 `. n* i0 a# Q6 FEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 z: k$ L. k$ v( o0 K r; ]2 F$ }* KMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% p. [( ]# k `
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
7 W4 h' N# A6 b8 `while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, p4 J" u* U7 GMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);& h3 g# h/ Z3 i4 F+ \* S7 ~
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);# ]* z; ~+ q" Z6 _8 ~& J# }! q* V: Q4 F
}
' ?# z& l- N! T- h0 S' u请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 L) ^, ^! }6 ^+ v |