|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,. n7 j9 ~* Y1 n2 F: t/ X
input mcasp_ahclkx,
! c9 X% t+ A, Linput mcasp_aclkx,' L( u; i$ L7 e8 Y# b
input axr0,
$ E+ l, g2 c& J! n4 c
% Q) s4 X* N: R1 N {: aoutput mcasp_afsr,8 z3 |- i7 i8 K9 T* y
output mcasp_ahclkr,1 z) s" `. H. q
output mcasp_aclkr," j5 }) u% y7 w3 {7 F
output axr1,# f! T1 M6 r# g
assign mcasp_afsr = mcasp_afsx;: h g1 D8 E2 f0 A; e: Q. S) J& b
assign mcasp_aclkr = mcasp_aclkx;
: K2 A* X1 [9 s: W% passign mcasp_ahclkr = mcasp_ahclkx;: k$ ^( t9 | v: a" |% P+ b
assign axr1 = axr0; $ {$ |2 Y- f& J
, S% g5 h: e! {
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
% w6 W# O. F2 R5 L- Wstatic void McASPI2SConfigure(void)* ^ n# t' H8 z& w( B: e
{
' x/ A; F" E g4 V" DMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
* w; e+ L ^7 z) T# DMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
+ a2 }) v `/ X+ m, j2 F% c9 \McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! |* m( n$ `. H) c
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
- y4 {, S5 h0 g% P$ M9 }( w' dMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 T# N4 m2 a+ i9 f1 vMCASP_RX_MODE_DMA);5 h+ b) z# B- t. C2 O) a
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 o D0 }1 |% O$ f' X. X- ~: k
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 K! I) A9 q) L: y& J& T( W4 E
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & F. z# |: C9 T# c: F6 p4 G
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; o* s( @8 W3 K" P* }" X! F
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 n) ~% \& w6 L! U! R
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
$ T. ^1 d C( x3 c8 IMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 V5 z$ A( m" |McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % R# K+ L! W9 i- a; h( _
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 ^7 H1 R: S' n( W
0x00, 0xFF); /* configure the clock for transmitter */
( S$ P; p- J) H; {# T* HMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( t# H# H% C) ]9 K M1 r' AMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) Z+ M9 ^5 ]+ [/ ~4 q% Q& v
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, l0 K+ Q2 X8 T; z% D: L
0x00, 0xFF);3 i1 \, x9 f# w
: g' i" T$ L, L- h
/* Enable synchronization of RX and TX sections */
4 z5 Z X- {0 F2 uMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ {; z0 J, Q+ N7 s4 `5 Z. i' CMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* w" Q; d7 s9 y3 DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*% I ~& U. v7 W9 \' t
** Set the serializers, Currently only one serializer is set as! V* N( f3 y2 K8 k* i& E
** transmitter and one serializer as receiver.
+ b" P8 V, n1 Z9 y*/8 q4 Y, H6 s5 ~! |
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 Y) Z" Y; x$ ~9 |+ `# f: UMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*( v4 w9 V: u( y' }. j5 v" w/ C4 u
** Configure the McASP pins : C' z2 R; I; t0 H
** Input - Frame Sync, Clock and Serializer Rx
, b' J+ Z. C( B- p** Output - Serializer Tx is connected to the input of the codec
& Y' J" `6 \$ n1 L( E*/% ^( @, d4 E& W1 q( Z* D
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* |1 h' h4 I' |; U! n! q' i* `' R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
( f* L- D, D/ ~ H' W) AMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, Z' J( H$ _( |( K+ `$ I
| MCASP_PIN_ACLKX
0 q" W# B! F) M' H- r, l| MCASP_PIN_AHCLKX# Q. f( Q2 S$ X7 A; y
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
$ C* Y& s- t! lMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 s$ }# w1 v4 a3 r| MCASP_TX_CLKFAIL
: n4 R* L7 ~1 S' k| MCASP_TX_SYNCERROR
) I# i" d) d8 C$ |( p| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( ^9 T+ m1 o( ]+ ?
| MCASP_RX_CLKFAIL
5 A; n$ P! j h, \: k| MCASP_RX_SYNCERROR ' l: C6 I4 q. |' ^0 \
| MCASP_RX_OVERRUN);4 e! D4 s' E% E( N# D$ s
} static void I2SDataTxRxActivate(void)+ f* F( o' [- ~* I$ P
{& R4 E4 b+ E5 }9 [( k! s/ v( j4 X
/* Start the clocks */
! V) T1 b. I4 N2 G1 T- x, yMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ | K. P8 Y4 ]' ]
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 }# ?2 U3 c8 N5 KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, _8 g G- e0 W4 Y
EDMA3_TRIG_MODE_EVENT);
" f. I$ L; h3 j! w; e3 KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( r* Z8 f" x3 h. c% R
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% _% N2 F, o% q7 c
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! B5 O h" @3 H, qMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */8 C5 I2 O! j4 E4 u/ L4 I
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( b2 g& ]6 }' b! m3 nMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. c# t) L% |) o! p: h3 m) ~McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( c5 x0 Q0 S$ b( k} ; i- s' P- w6 o( ?( v
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' b' a6 H* c" y0 n1 {8 O+ s( k |