|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, H4 b" C+ Z( F" P9 g& g- s
input mcasp_ahclkx,
# T# h/ q$ ^3 j9 m, X: Einput mcasp_aclkx,& P. a5 N) F; c3 E2 m$ ?
input axr0,
" h8 n) r5 w1 q$ b; [6 C
3 _; C1 u# n$ }1 n1 voutput mcasp_afsr,
# l; G( }/ T: Ioutput mcasp_ahclkr,! A2 i6 N! F" ^" V$ ?
output mcasp_aclkr,5 T( b% {1 g s5 \, u" I" I- e
output axr1,) I3 ~4 H g9 C+ W. ~( u
assign mcasp_afsr = mcasp_afsx;
. m6 a; A; E$ oassign mcasp_aclkr = mcasp_aclkx;9 i0 [( `8 Z& I4 S: f2 e5 R% `! F1 N
assign mcasp_ahclkr = mcasp_ahclkx;% B, x# u# X; j0 G
assign axr1 = axr0; 4 R# G& E6 w& j9 I7 d( r0 `6 n3 V
7 h! I, i% N3 s3 { v- L在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 7 J3 r: r6 R# J
static void McASPI2SConfigure(void)
% D9 \2 Y) ^- O- ^{% b1 N' `1 s3 H, h" f, e
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
I% B! s: c' ^7 t5 fMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 E3 h9 n% ~8 ]! g( H% S4 B! q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' U/ W# Q0 i5 J: l: j3 u
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
" ]9 Q5 m' H" O6 F' T' yMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' Z$ N) F% F. x! l7 c; fMCASP_RX_MODE_DMA);& J/ h1 p* e2 G" ~
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- b2 Z4 q1 @! w1 R `
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 z! W! `: h4 a7 w# Y: r
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 K1 M$ G5 p( A: P* {0 i
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
j4 y* L/ l) H$ i7 ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; ~. x. R" q2 }. t0 b G" M& c1 V. ~MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" d! d# a7 ^" s- d" @. T
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);' B' u6 g) E! U
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
v7 O9 I; f* yMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 O5 u. d/ w" d
0x00, 0xFF); /* configure the clock for transmitter */
$ d% H1 [" ~1 {McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: n& D/ g6 d5 U6 H- Y
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
4 |" z6 z1 K/ [: o7 v( H( wMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' G0 e- N. o9 d: y0x00, 0xFF);
2 ~5 j# \3 @) S/ _; |0 Y
6 N3 C1 P2 P% E/* Enable synchronization of RX and TX sections */ + S3 E: b' q( V- L5 t+ J
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 M- [, M/ v9 _, D( q+ Z7 B) I7 ZMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% m8 f0 e& z. \* p9 _$ G* uMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
* U' A% ^# g' s) ?- }. a) H** Set the serializers, Currently only one serializer is set as0 G, z0 q) j# B+ [& K
** transmitter and one serializer as receiver.$ H) U* }- @* @4 y" ?2 ]6 c4 C
*/! I2 G5 Y0 G W& A
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 f9 l* w. h) [: IMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ F' J" W9 n5 P$ f8 B** Configure the McASP pins
8 d: s- e, p9 o; o/ a9 M6 K** Input - Frame Sync, Clock and Serializer Rx3 F( G% B4 N3 @4 c
** Output - Serializer Tx is connected to the input of the codec
W0 {8 P5 O: ~& P( ~( K5 w*/
4 d d5 n9 r& n8 ?% h! W q8 dMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' C- l$ K% U6 ?$ `9 E* H3 ]
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 s( ?. n) [5 Z2 U" ?% `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% O( ]4 c; ?9 W1 }7 c7 [3 ?
| MCASP_PIN_ACLKX
F& J- o6 ?& O$ a9 [& T| MCASP_PIN_AHCLKX
. C! z0 z" J, A. ]* ?1 w3 ?5 v0 z| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// ]5 v4 w# L! C' f
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& |) w7 N+ e) g| MCASP_TX_CLKFAIL
6 Y9 C8 R% ]6 s; p, L& Z* [/ U* m, @| MCASP_TX_SYNCERROR/ @: R* f# i- W
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! J( L+ V+ T" [ B) l
| MCASP_RX_CLKFAIL
$ y$ w# h: ^; u# ?/ }( ~/ E| MCASP_RX_SYNCERROR 6 N8 m2 N& A; k0 g) X" \7 Y
| MCASP_RX_OVERRUN);* ^3 ]! i# }6 S% j
} static void I2SDataTxRxActivate(void)
, s0 g7 ?% a# q% Z! [8 J2 [{
* j' S1 q1 ^+ S$ ]6 Q/* Start the clocks */4 |5 I6 M" @: t7 b! @5 X
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 G" H5 y, I- |5 n+ R- u1 V
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
/ d8 U- t/ e: ~/ K: d# D) kEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
/ T4 N# a& S* |" IEDMA3_TRIG_MODE_EVENT);3 K& d4 u+ H3 M/ T6 s5 Y" K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, . u- u0 ~: H$ z7 { x% k2 O' H
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
' P T" K- k; z: q: ?+ |6 F. j4 GMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 a2 z6 t, ~9 H) ]9 g* X8 s$ V; |McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
: s% t. k W. y! H9 M5 Q9 ^while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& f2 B: E9 w; g5 M5 b( `; b
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 D- g$ x& K- v) x2 k1 R' c. n0 nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 }9 }2 x, s* m c' q. E5 N
} + I1 p- \1 t& J# U" y4 j) I
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ v! @4 P! d9 x
|