|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,* n' D3 s0 X a$ K: D; f
input mcasp_ahclkx,
: \5 O3 d1 [8 ]3 @+ [input mcasp_aclkx,% ~; n& M$ Z8 s7 e) ~( p
input axr0,
4 V' l) D1 _, n% @8 y
. F2 w, d. P9 ~output mcasp_afsr,; C$ ]! p) H8 [3 d" x& _9 m: O( C
output mcasp_ahclkr,
- R* k7 V: a* q! ?9 Doutput mcasp_aclkr,
2 ?: w7 Z/ Z3 i% X9 A* Youtput axr1,. n" o! a5 G0 O* ^# A; R* p t
assign mcasp_afsr = mcasp_afsx;/ f: C" e9 ]% r* p# s% O" k
assign mcasp_aclkr = mcasp_aclkx;/ d, y; p! T- u1 S* _7 t6 j
assign mcasp_ahclkr = mcasp_ahclkx;: ^- V* p6 X1 t# Z" X
assign axr1 = axr0;
/ L7 s. s2 d/ S- P P
2 e* P3 X: W. p! Q. ^" \; Y; w- O在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + O% X. v4 Q* U+ M1 ?% F
static void McASPI2SConfigure(void)
0 y4 A: d# `* }{
2 c# q5 x5 R) w, ^6 n7 e6 O. a6 xMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 K+ g& s2 l9 r. `; Y- eMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
9 F. F0 H4 l1 p; R+ U' f6 `$ \* T% dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# f1 P h( r8 D+ y% |. y- \3 J: {
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
& t3 R9 i9 Z# l+ O7 O8 ]! }McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- b! ~8 n( F& E+ ^6 dMCASP_RX_MODE_DMA);
4 r! A( v, L. `) A4 B6 IMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: c/ G C$ A h( O
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */. Y) S8 @+ Y0 h4 i+ W: T6 l
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) d2 [ ^; @, V3 B5 a/ i4 r
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- U& f7 A) j* U0 n4 x& s
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- f8 j, S0 A, FMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
* z, K0 c$ n. l9 [McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 {* a% n. X" d1 RMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 1 y; k* h4 P2 k
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ }; W ~0 ]$ y, r% H/ n0x00, 0xFF); /* configure the clock for transmitter */( a+ q0 h7 D% S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' k. Q$ ^ x0 L! \' F% AMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! j3 R" x0 o5 F: a" ~1 z" ~McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 d( J' x/ B, P! b1 O
0x00, 0xFF);
0 j+ A* j; m* \- g
% k; Z: p7 r n7 H; u" d. C7 l( M/* Enable synchronization of RX and TX sections */ ; q9 B2 t, p% | C0 e# }# I3 M
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */& |5 M" U0 Z6 T6 z* [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 ?$ q% x. Y9 A0 L8 y( Q- qMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*$ W! W6 N/ |& N- S
** Set the serializers, Currently only one serializer is set as T9 [6 f$ W" P5 W3 s/ O
** transmitter and one serializer as receiver.; H3 W3 U+ S0 P" k" @
*/* U7 i2 A1 {) A- N
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); G2 g+ G- S, D- z2 T0 Z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
/ o/ X4 r) J* T1 B" Q8 ~! }. F" n** Configure the McASP pins
; h; Z* U N5 Q9 c** Input - Frame Sync, Clock and Serializer Rx% g3 R/ ?2 t# ^8 T: G/ b
** Output - Serializer Tx is connected to the input of the codec 9 [8 |) l# |$ x& I0 g( ~8 S0 z0 g
*/1 P6 b& u2 M8 Y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);+ d! C% T; s/ e0 q. ^& T# [
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% U/ E O: N& E* I* N4 zMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 A" p1 u4 Y }9 D% R7 W| MCASP_PIN_ACLKX
1 p. ]! J7 E3 a/ Y; z7 P| MCASP_PIN_AHCLKX
: o8 [- l3 w0 q9 y+ L- d& q| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */, c" d; p) k, o+ d! K& ~' ]
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # i0 v* P" ]: |* w% T$ _
| MCASP_TX_CLKFAIL ( |$ u+ Q& N* P; Y. `# ]
| MCASP_TX_SYNCERROR
* d9 X- A1 a' M9 N, j* `' w6 z| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! r7 c& P$ v; I| MCASP_RX_CLKFAIL
$ r$ L7 x4 Q5 J, v2 o| MCASP_RX_SYNCERROR ) \4 h' a3 c8 |6 a
| MCASP_RX_OVERRUN);" u- U( \$ r% k' U. m
} static void I2SDataTxRxActivate(void)
" w. s+ y4 c7 B4 M% Q6 Z{
) [' @( Q6 [4 Y3 K/* Start the clocks */8 Q9 a7 W( f2 x# H/ _+ F( \$ e
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, e# Y% R4 a$ n1 p$ k7 [
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */% ` |, s" q$ x+ Y/ T+ L, M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) J' G% _* {# K8 ^- X" R$ D
EDMA3_TRIG_MODE_EVENT); I1 x+ ` H6 v$ u' m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 L1 W ?9 j# @3 Q8 p FEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */# E j& [/ N* N* @
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* _* z9 i& L7 Y |; A! H+ h9 E
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 h/ K6 H+ N/ a4 I$ Q* qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# a3 L2 V. `1 e! L2 u8 z( B* w
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ E* Z" D, X6 j' A1 t5 V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);- x5 x/ z$ U! ~$ |
}
$ }- i, [* j5 u' C' z; r请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. " W! \9 f- A. i+ T8 H
|