|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,2 ]5 Z: w+ W# r, L& C
input mcasp_ahclkx,/ t( {) A2 A2 D8 d
input mcasp_aclkx,: K4 A& z/ U8 J2 {- a5 K7 ?
input axr0,) v; L: o$ i3 h. v
# \! G" C) E) q3 F8 j0 J: y
output mcasp_afsr,8 Y" V# a2 X0 h, s8 G/ g* }
output mcasp_ahclkr,
& f7 W& ~+ |, D: woutput mcasp_aclkr,, d2 M9 Q5 S( ? v6 X2 s
output axr1,
2 {0 m& ^2 V" O' P) o, q) P assign mcasp_afsr = mcasp_afsx;8 W# {3 m5 E4 ?5 `3 l
assign mcasp_aclkr = mcasp_aclkx;% e7 P5 F& s: G+ l9 }
assign mcasp_ahclkr = mcasp_ahclkx; n1 X$ P0 H, v- J& p; N
assign axr1 = axr0;
2 {0 k- x! c" @ i; @& ]. R* O' T4 v" v4 d( }
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & R& e: [( b3 ?+ C. N
static void McASPI2SConfigure(void)
% o1 y. r: y. ?{* x7 ?8 i! f" E
McASPRxReset(SOC_MCASP_0_CTRL_REGS);% Z0 F7 Q: ?3 d) P# R
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
% x, {5 }* T! X! GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, a; @( ~5 @' T) _/ R7 i2 mMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) E5 Q) b8 g( `, L9 Z7 V
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 M) V2 l+ c- \, \5 C9 s5 y: M1 Z1 I
MCASP_RX_MODE_DMA);
7 D" q V1 \1 E' ?; m3 z$ \ HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 P( Q; X5 U$ S/ \MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ a0 M* r/ v8 }( p0 S! DMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ u' F$ R' u1 i& t. z& D9 r
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( f0 x' B# t3 ^. j( }2 p
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. c, X: I, {+ m% X wMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
& D/ D$ X# Z- F9 a$ c5 x" a( HMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
. y; K7 E' O$ F7 `) [McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); e. L9 ^- ^3 z7 p2 M4 v
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 r e8 Z) q! x( s
0x00, 0xFF); /* configure the clock for transmitter */
) t3 x2 C* u: J) q8 ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- a/ b: T7 C3 |+ nMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 s! g# b! a$ b1 M7 [# X2 o
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ ~: w! k+ ~* X2 i' ^& o- S
0x00, 0xFF);
4 P4 v E6 \! e, ?: S
9 W, \# @. C' ?, d/* Enable synchronization of RX and TX sections */
2 F' L" r, P- p- Q( b7 i' d0 B4 KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- d2 o* ^2 t7 z* f) I( ~+ P5 F' }$ V
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, C3 s8 z* g. B* w0 yMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*5 e. l* b( v, J, l" j5 P. l4 D) ?
** Set the serializers, Currently only one serializer is set as
9 \8 u# S6 b& n8 e! P** transmitter and one serializer as receiver.0 ?5 s0 |5 s/ X+ b# E' P
*/$ X e* I1 T6 f) o
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);3 V5 M( R" P+ s. _* Y0 ~
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
{% F) p6 u" L) k6 W** Configure the McASP pins 8 d5 a8 Q1 a! H6 Q* K/ K$ C# U
** Input - Frame Sync, Clock and Serializer Rx9 x* S9 o5 |% h4 `: B' |- [
** Output - Serializer Tx is connected to the input of the codec
2 ^) W: ]2 a/ q) P0 n3 E*/
: F( ^6 k" {8 Q, w% K* OMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" ~$ e; W. O! f0 U9 y h9 H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); f$ B3 Y* ]9 t6 \8 x: D0 g0 S
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' Y; `) G/ ~) d" x* l| MCASP_PIN_ACLKX
( y6 F" S: c8 _) e; h6 A| MCASP_PIN_AHCLKX
# z* {' A5 t, z5 v| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ H: M+ m! ]* q+ h0 m
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ j! D$ G, t8 ?, r; P' r) A$ a; X0 T| MCASP_TX_CLKFAIL
4 X3 f1 S' \9 m. n+ d e( S# @| MCASP_TX_SYNCERROR. y0 u1 t( I) ^; V" n
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( `8 _: S0 t( W: ?% b| MCASP_RX_CLKFAIL
9 l( ~1 k( s% b8 z8 z| MCASP_RX_SYNCERROR ( C1 a2 b Y. i9 T; G* k) Z
| MCASP_RX_OVERRUN);" F5 u/ s9 ?1 Y. z! b) [$ { K
} static void I2SDataTxRxActivate(void) y- e4 }( ^# K- a2 [% {3 k
{
( {+ c* }3 Q+ y- q e2 ?/* Start the clocks */ K# ?0 C G) C8 K9 f9 ?
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 h& c" R e2 d+ K/ M, dMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
- d/ F3 C8 Q" FEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# @" T! r2 f- c4 Q! z
EDMA3_TRIG_MODE_EVENT);8 ^' I8 b) I% y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ q/ ]/ l' I( e+ A
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
1 E V: P O6 {* W3 ~McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- R* [& z1 G3 G
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */0 P w2 q9 `' L% L0 C: N' T
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */6 I0 E, R" j6 F3 q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 c9 w( ~. }& \0 b. I" ~& v# [McASPTxEnable(SOC_MCASP_0_CTRL_REGS);& G+ z" \! M0 e r8 A$ p9 E: U
}
7 D" [% O6 p: c) Z; w7 L请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 6 s4 i" Y& B& d( U) h6 s: H7 g
|