|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& O8 X6 V# N2 e* s( H8 x, _
input mcasp_ahclkx,* Z- ?/ g ^' Y$ Z, W
input mcasp_aclkx,
. l3 ^( X" l* @9 pinput axr0,
; f5 k0 S0 v7 ^, S4 Q4 m9 C* X( U
4 A: z& N. `- Y$ ?$ Y% g! _output mcasp_afsr,5 P, v" f; a" [' f
output mcasp_ahclkr,
- g( b! u3 Q5 e, q; h: ^output mcasp_aclkr,3 ]$ g9 S( X* v0 U
output axr1,
" e9 H. M- { h: A! x! h, c1 k assign mcasp_afsr = mcasp_afsx;
5 v4 i4 F: s; y2 I: \assign mcasp_aclkr = mcasp_aclkx;+ I0 g$ l$ r& O7 k. i+ v( l0 \9 j
assign mcasp_ahclkr = mcasp_ahclkx;
3 m! z, @1 \6 N7 d# r& q: f' nassign axr1 = axr0;
# k9 w& C* h; G6 h. o& A& j u) j4 B" m& A P1 Z: U
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) W1 w9 f$ r3 R% {# ~
static void McASPI2SConfigure(void)
9 S `0 k1 {6 b* A/ o{, j1 P' j. P' r" t. ~" R2 d" h
McASPRxReset(SOC_MCASP_0_CTRL_REGS);3 L( `# s# y u/ U1 P: [# k. S
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
9 Q) R$ f+ v1 G0 e" A. L/ wMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% |6 r! S$ B; H1 S5 E
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */5 L4 N: C( O: [; J$ ^
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 H7 P4 B3 x8 ^% \- g% ?MCASP_RX_MODE_DMA);
! y, p' O# v! R* c ]! \, cMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( m. b' }' g2 D, U5 {
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& X4 L. b6 O) F5 PMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
6 D+ [, J A5 |, ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! H* P9 p; a! L; q9 E1 T3 LMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # {: _( `; z9 X" M2 ~6 z
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
n1 Y9 n" b( A$ E9 U1 `3 o6 [5 HMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 x# t5 _2 N( |5 G- `- L# A7 K; L
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 D' q3 V0 v: V H( DMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 l0 F6 a' f: K3 k5 r$ ~5 j0 q
0x00, 0xFF); /* configure the clock for transmitter */0 t. Q3 _" T( V3 v) r# y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. p( {1 Q6 U* Y; H; P" S vMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ _& Z* C) |* U3 `McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; G& f1 p3 b. c/ R' w) @& F0x00, 0xFF);: h" ^5 M( e1 X' w
0 O2 D" q2 L: B. ^: h* W# @! S5 p, G. ^
/* Enable synchronization of RX and TX sections */
0 E, u& F% s2 mMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 d" w( P/ p1 h/ iMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' y6 ?# K: [0 P- n& d
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
4 v6 x1 j8 ~1 N1 F** Set the serializers, Currently only one serializer is set as
; q$ c3 p2 I4 g0 R; Y" K% {% c** transmitter and one serializer as receiver.
. i0 g5 _5 F* Y7 f1 g) t u*/
2 ]: g3 M' H2 W4 `% P0 I- JMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" e2 P$ [3 _' O% W2 R
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 o+ I3 \0 D `1 `# i** Configure the McASP pins ' v/ z: [! s7 w/ @- O- p
** Input - Frame Sync, Clock and Serializer Rx) p6 r; L# b" l, a, y! q- T* _
** Output - Serializer Tx is connected to the input of the codec 9 |. Y: v( Q: u8 W Y0 A7 A
*/
$ U; Z# j: v: C! a6 d) E" K7 ^McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
, _- ?& D N% h9 w0 r* e, S# aMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));. S# S$ t+ m. |/ v* b
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ O! e+ ?. R2 G5 h
| MCASP_PIN_ACLKX
$ V3 s+ F* F _+ W8 D$ [# x& S3 Q8 n| MCASP_PIN_AHCLKX
8 J4 J9 e- V' X) V( u| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
3 }$ G9 X2 y# A1 b9 f6 OMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 c0 J% }' z& i0 P, E4 d
| MCASP_TX_CLKFAIL & m2 a/ w: H% P4 @& {7 M6 Y
| MCASP_TX_SYNCERROR
; ~- S2 G0 C- x| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 `* v. ]7 M% _0 }8 g
| MCASP_RX_CLKFAIL
9 q) t/ d; q u" H* m| MCASP_RX_SYNCERROR
" S3 p( Y# R" l# j& [# J| MCASP_RX_OVERRUN);
- I. |3 o+ F) K} static void I2SDataTxRxActivate(void)
# O9 d. K# n/ X% y{; W! D/ J/ g1 {6 ]) W- l! W
/* Start the clocks */. _ s& J* [/ T5 |6 K9 m, Q# _4 g v
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, X R1 ~, N' k0 l1 {McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// v' _/ D0 w- t& |* A
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
/ G; v; [3 I \EDMA3_TRIG_MODE_EVENT);
# U. V: s9 K4 q6 Y; |& YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " ]/ R+ t! B* i# e: k; [
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
, k! o/ i; C8 ~7 p/ P+ {McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
& ]$ s& ]5 `# N% [& O" j2 k0 V$ PMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& k- l5 q+ S5 T4 Y2 K9 c9 E
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
: Y# X. W$ [1 }: u RMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 f( f* _8 y7 O6 ~McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: E$ W) o/ V2 f d2 e9 c} 4 k; D/ E3 a# f- K7 O' o" U
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 7 o9 ?) `% x. o
|