|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
J4 i+ R* S+ w* o. J* Sinput mcasp_ahclkx,
: X) ~' E% M. A1 b% ainput mcasp_aclkx,; Y8 a2 M: O i9 C
input axr0,
9 x5 _9 r- W7 a6 S# ^2 X" D. o" s( M
output mcasp_afsr,6 B- y7 w2 ]# M+ D0 U% e7 U* S
output mcasp_ahclkr,( o: M- r( U* U4 Z
output mcasp_aclkr,- K1 V$ ~$ q! m: F
output axr1,! m8 Y r) U% j2 J5 @$ M
assign mcasp_afsr = mcasp_afsx;$ R! q/ A* U. A( S% @$ T
assign mcasp_aclkr = mcasp_aclkx;& d- o& u- Q$ F1 O M/ r
assign mcasp_ahclkr = mcasp_ahclkx;
& Q5 |3 |* c; Nassign axr1 = axr0; & U X- C7 [) T
( a8 {. P$ p o* C ^4 g2 |
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
9 {' ?" G% }6 I" l1 H' o9 o$ K( d) Hstatic void McASPI2SConfigure(void)
) _% e% k+ c/ _5 W* I3 N{
3 s" R( ~! [$ D5 WMcASPRxReset(SOC_MCASP_0_CTRL_REGS);7 q3 ]1 u8 w4 g7 e7 }3 \
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( k5 g' n+ f; B, K/ n! P" yMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 Q- }' |# |" \5 l# c" l
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; U A: t* q( T, m/ J2 QMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; D$ ]$ ^1 u4 G/ L/ `
MCASP_RX_MODE_DMA);
6 a- q% E6 r$ s; NMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 V, m: L/ L9 n) C7 b: D
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
- e" ?( t0 C+ N+ x, JMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, M' @- P' F. t. i+ S
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ k1 L3 J# U! J2 Z; A AMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # M8 w- p) a: N7 D4 y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
) {/ D5 L$ d4 H3 BMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 C9 i3 N/ F$ C- `3 K+ [/ gMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + z+ ^% J8 k% P. D$ \4 e
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 ?: l6 i- r+ q' O/ J( H. w: D j
0x00, 0xFF); /* configure the clock for transmitter */4 n' E% |7 q% c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 r& U- J' f# Q. |) wMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# b" }# H# l) x0 DMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 v- R1 o9 y8 ?( m
0x00, 0xFF);
' f8 ]# y0 q1 D1 Z3 s$ u; d3 p0 s- [( X2 b$ ~- |
/* Enable synchronization of RX and TX sections */
' R) V/ g% d7 B) j7 A5 | v- FMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
: F9 c/ Y! o5 ?4 f* sMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) S4 h2 W4 J4 B; Y* ?1 ?* R* D: Z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
+ \# n. a+ W; ?* ^4 D3 F, o0 Z( R- J** Set the serializers, Currently only one serializer is set as3 ]% H! r' j3 v" o: v
** transmitter and one serializer as receiver.0 R% Q4 @5 S9 l' F5 K; v3 x
*/7 r# C& J, V$ h {6 y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ u- |9 i; G) A: `, E
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
6 |' |$ c' |6 V7 c- X+ l** Configure the McASP pins
9 ]- l4 O6 e! m6 t8 z" A' G7 R2 |** Input - Frame Sync, Clock and Serializer Rx- V: T. j8 r1 z4 x& P
** Output - Serializer Tx is connected to the input of the codec
7 i% U' g6 P6 }: }/ W*/
) D% u7 v+ F oMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) y7 f# p6 ~ e: C" cMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* r- C( f" S% ~8 MMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 T. V' h/ \/ i! r8 t9 v8 {; n| MCASP_PIN_ACLKX# b7 ]- }% T3 O& T1 D4 m
| MCASP_PIN_AHCLKX
. s: b, s9 g L/ D| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// K, G2 L4 F; h! s0 y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 u8 i$ x- s2 I3 v# z! i8 G| MCASP_TX_CLKFAIL
& n! H6 S' N/ H4 t" J; j* ^| MCASP_TX_SYNCERROR
3 i$ Q5 c6 @* s/ V& c0 g| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: |+ M% V& y" P% L/ Y! l| MCASP_RX_CLKFAIL
( |& s/ Q2 Z# c J2 H# g2 Q| MCASP_RX_SYNCERROR & d! w/ M. t0 Y& [& ~
| MCASP_RX_OVERRUN);6 B: _! X2 F+ M$ d* ^
} static void I2SDataTxRxActivate(void)
2 Q8 r4 }! o! ^& n" V' g# s{% c! |6 [" L2 j4 [4 n
/* Start the clocks */. m# t" r1 x" B# R2 `. B D% T8 P; F
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 B; Q1 c& i9 ^4 c B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! H/ ?. _3 }$ h9 @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! w+ R# S+ S/ D0 v$ R j! o4 D! F% G' dEDMA3_TRIG_MODE_EVENT);
7 E0 K- G/ v% {/ S) l3 oEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! _! `7 O3 H8 s; V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
9 R$ e; ^+ S( O9 Q' a( d2 {McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. v) Z0 S% K, W5 ^
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */" E0 h C& I* |" n
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */: M' x& X& a0 V( [: `
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 P/ I8 R- L" z9 ]+ Z9 M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);+ e* w# j2 l: `" e3 Y. l, X5 a$ ]
} Y$ ?) \; Y( h& d2 M
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 3 ^1 r8 c" k& U8 R# n B
|