|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, D) @1 ]& P' B+ c
input mcasp_ahclkx,
0 }# E% V7 L0 p' \input mcasp_aclkx,
/ ^8 ~8 U" i- T* L- |input axr0,
- g& G% A3 v: b8 F3 ^6 y6 S3 b. A: O% `& g- P' v: F! C/ @
output mcasp_afsr,- c Q+ T: e& l" C3 ]8 e% H
output mcasp_ahclkr,
: P" t7 n1 Q2 D2 R5 o2 toutput mcasp_aclkr,
% ~, k' K- L; f' p3 Poutput axr1,+ [& D( R' N& j2 U: M
assign mcasp_afsr = mcasp_afsx;
: l2 @* F$ K/ w; u& z7 L, e2 P; u" V% Passign mcasp_aclkr = mcasp_aclkx;0 S; G3 A0 I! U( W4 `
assign mcasp_ahclkr = mcasp_ahclkx;
+ G# @9 c0 n7 ~$ W3 \! {" F% kassign axr1 = axr0;
: D# V# v7 X: W# ~' ]! n! l+ E1 G7 d* i) k, L- Z3 |# Y6 [% ?, \# B+ E
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 8 c3 f1 U, K) t8 I- [2 T7 J/ v. }) ?
static void McASPI2SConfigure(void). G2 V" i, ^8 O2 m0 b/ }
{
4 ~9 R- ?/ }+ x4 f! e1 _McASPRxReset(SOC_MCASP_0_CTRL_REGS);
. b' m8 u Z& A7 @0 c2 pMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
* H; L% Y! n5 tMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) I, X! i7 O* j1 w3 l
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
( `1 ^2 w; X+ r: IMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 h; Q. x0 V2 @* |# `+ X/ ]MCASP_RX_MODE_DMA);
X9 i. F ]. C/ C& JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
d, A" I+ `+ e; H4 L1 BMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" X5 L6 D/ W/ F D- g+ XMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " t& J6 l A/ H# B
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: s& x4 P0 H! i" h F+ j, h+ U3 fMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# i5 @& s* A. n7 C' Y- QMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# S% m9 l: l9 Q. k+ [0 _
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" ^3 m/ q$ N. E8 P, n3 ]( ?McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 J6 l9 W+ V# V/ aMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; v% O V8 L8 e0 T
0x00, 0xFF); /* configure the clock for transmitter */
3 M7 U. j& e2 o$ A9 WMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% T: m5 Z& B& W. z. dMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' K: X# J1 q0 A1 E' A- C8 p
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 P. L3 Y' b- _' ^! ?! i# f
0x00, 0xFF);1 Z& K- F# R3 `4 }; e0 T
+ S6 V, w e+ b# P0 G; s+ }
/* Enable synchronization of RX and TX sections */
4 M" `4 \! N8 m7 P; N5 KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */: S5 n) s4 V$ e) w: b8 h+ J7 J: C
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ q+ g/ b6 `0 N/ l( d- `" \' Z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** ^7 m$ |. i$ a7 T
** Set the serializers, Currently only one serializer is set as: V1 q. O0 }! ]1 O* L( m! p( u
** transmitter and one serializer as receiver.
3 U4 {9 h% p' l% B1 e*/1 a7 e) K" V6 V7 W% l# H: V! q/ q
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- _( p, T! d- j- y% AMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*/ M! i5 L; X: @( `. u+ p+ q
** Configure the McASP pins 4 \; I/ T& d9 I; ?' x, ~4 l( C2 n
** Input - Frame Sync, Clock and Serializer Rx
' e0 C: I) }1 a* p2 Q5 K: F( M** Output - Serializer Tx is connected to the input of the codec " e {% `2 L2 d4 m0 R
*/
$ Z8 J- P4 |* O3 zMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 v& v c3 c) u s" `* c! J
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" A- x. c+ s& x; b; K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 Y% d7 v- o+ U# z, g$ c1 L
| MCASP_PIN_ACLKX3 o. q; c3 P4 H
| MCASP_PIN_AHCLKX! Z# a6 }. ]8 L* F: l5 H. ^% ]
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
2 k: x% ?! N/ |4 TMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
; a1 ^9 r" r/ T& w: I$ R| MCASP_TX_CLKFAIL
* d0 R/ G9 I$ N/ d; h| MCASP_TX_SYNCERROR
. z) @6 k ?% \1 n! y) `| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 i: R$ o) q* W8 F- `% _
| MCASP_RX_CLKFAIL
( D, g2 N8 }$ p* ~1 s| MCASP_RX_SYNCERROR
! r. }1 i" l6 j9 k+ R4 t! A| MCASP_RX_OVERRUN);% S; K% A4 G& O
} static void I2SDataTxRxActivate(void)
+ q' V0 n+ ]- K! R& w6 H# I{3 x# x; N2 q( w8 W% O
/* Start the clocks */: r, R* N) r0 K
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# l3 w( h3 ^0 @7 |3 s0 P" K
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
6 G! j7 _- ?3 L) kEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, Z g" n/ _- @+ P
EDMA3_TRIG_MODE_EVENT);
8 d+ d- R7 c/ s3 z/ [9 DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 d7 O+ i. a7 y/ P0 V* z0 rEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ n' M; }: k) c4 A) z* K4 _# IMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! t5 a) t# R& h
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */, q: G+ |- E5 E8 W7 ~
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
8 \: R/ F; @, S' A0 P, X {0 J* kMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);# `5 `- P) m: O' }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 C" T( E! T0 N& p
}
1 P; @1 |) j$ c请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 q8 m2 E6 @* n2 @4 Q
|