|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
1 s" ?7 ^5 s( g _input mcasp_ahclkx,, O0 j( ~, s8 ~9 \, _; y$ I6 Y( }
input mcasp_aclkx,
' X, K* j8 J' n6 k5 Pinput axr0,1 i0 R, D& @( o! F
& O# P* N$ k# B8 D' N- r* R
output mcasp_afsr,
, G+ N" v& T6 u2 w& Foutput mcasp_ahclkr,
, {; I) d3 C4 R, w* M1 youtput mcasp_aclkr,- H8 d( k! W. V# s0 M2 O
output axr1,% Q8 Z# W# B* p0 I. r" A( ^! i
assign mcasp_afsr = mcasp_afsx;
# }, S' Q# O( N, h. S8 aassign mcasp_aclkr = mcasp_aclkx;7 q3 Y4 p0 @$ h& t
assign mcasp_ahclkr = mcasp_ahclkx;1 H; J3 N: [; Q O- @6 @5 _9 f* l, ]
assign axr1 = axr0;
; N `9 b/ U4 e
/ N# ^) Q1 r* W& `5 |: a/ a6 s在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
/ P( H# s3 w( L7 V. t+ f% }static void McASPI2SConfigure(void)# H/ U; W9 H# \) @5 K8 z
{
T. j4 `& v, k* g* r: gMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
M9 [3 _+ I( e( r9 ?1 z _ {6 PMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */; h( W) W u0 o3 j9 M
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 Y7 ^- }- L& S, E
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */* }/ b6 d/ E+ Y( a4 C" O8 Y; p2 L
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) Z5 y+ b. y# Q& L E- v4 O0 z
MCASP_RX_MODE_DMA);2 v% O) A! ]8 X
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 h: N2 r+ u) h8 A" L; p
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 R9 V; b% J4 U; N- K7 GMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ d# m, T/ O3 U( z* L6 xMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# M6 E7 Q" }4 g* H5 e+ Y/ pMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, d2 q1 Y6 F$ I, `MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */. u6 W/ s( r; [* T
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
* \1 {. R3 S! N% zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : V: `4 Z$ X2 V3 }" ^4 N; v; a& X
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* T2 j9 B# g/ M6 d( m6 Q" \6 [# `7 U0x00, 0xFF); /* configure the clock for transmitter */
" j* H) b4 D/ _4 r: j! AMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" m. H. r$ v/ Z+ j9 k# k# T! S
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 J9 p s$ o; W9 H* U8 |! X
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* X. |+ `' S# z# I9 l) t6 x; T. ~0x00, 0xFF);
) e7 ~8 s6 k) m& Q8 a$ w# F4 N; Z- ?' D# G; o; }
/* Enable synchronization of RX and TX sections */ 7 W4 g7 D1 r3 s" V) K+ Y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
# R; w E" i- j. _McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 |/ o% U% W2 v. A. h/ F7 E4 ~
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
( f- u; s; u/ J/ @0 B* [( i2 G! ]** Set the serializers, Currently only one serializer is set as
3 Y% ^+ E6 X, k* s4 D4 F** transmitter and one serializer as receiver.
. \. T0 [6 R7 ^, a) V*/# Q4 e( R! s/ i& V( @9 e
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 [3 S! O( Z1 v; B- i( H* B
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*" M1 X/ F0 `% _0 C
** Configure the McASP pins 9 u& ^7 w6 |5 h
** Input - Frame Sync, Clock and Serializer Rx' z1 ]) u+ T8 t8 u/ q ]
** Output - Serializer Tx is connected to the input of the codec 7 \* q; Y& N( g( I1 l7 |
*/5 }0 A; y- P4 o6 _
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! t- J: ~' D5 }McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ C" T* A, z& ~- q7 [0 y/ s( kMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( \# N" ^& R* v. W. H
| MCASP_PIN_ACLKX! n* a* s) Q+ L
| MCASP_PIN_AHCLKX7 X1 q \, f* n! U
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 F& l; j' r( G9 t7 m$ HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 s4 m/ Y/ o- X* T6 \
| MCASP_TX_CLKFAIL
$ t/ Q# T1 [+ H6 z, z1 c5 V| MCASP_TX_SYNCERROR
a3 n' A1 h# ?! p- O| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " F7 L( m1 T) P3 M l
| MCASP_RX_CLKFAIL9 Y! ]( l4 y0 h1 S) F
| MCASP_RX_SYNCERROR ) h* D5 m. G1 k4 ^1 `+ r
| MCASP_RX_OVERRUN);
, m( h5 h) \) {1 W3 \5 w} static void I2SDataTxRxActivate(void)
+ \/ X( N5 Q8 f2 \! {{
% P& }; Z) A2 W$ {3 _/* Start the clocks */5 a: H$ [ B2 a$ a+ ~8 ]7 g
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 u7 Q( M; |- J7 k( F
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
/ i& d' n% x# g" F, bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 G R1 ^! u9 I z* j
EDMA3_TRIG_MODE_EVENT);
+ [- A; U9 w, T. DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* \! B' K) N% X H m D# ]. qEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */& J7 g( h( m0 k
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 j w% r P# |* _! }
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
l- o7 T+ s9 g1 p1 ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
3 G4 M( ?3 g2 j! D, x/ tMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 l; {. {- l& w
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
/ h" T) x- e5 M: \9 v. Z- _5 Q& b} ; z- m/ O* u2 O$ Q; W' o
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 b7 }; w$ R$ G: f |