|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,4 @( J0 A W$ }/ X
input mcasp_ahclkx,
4 t' [7 R8 }+ t Jinput mcasp_aclkx,6 w9 M( F! q% P9 X9 w2 p( O# I, _
input axr0,
9 F+ F# {& K& s- o; W( C( G& \4 m3 ^9 [6 f0 U; h& W6 M4 J
output mcasp_afsr,
o# C. |0 m/ U& voutput mcasp_ahclkr,; C ~( x% q% g* E6 g
output mcasp_aclkr,
/ k1 C% V5 x r1 J- s! A' d7 joutput axr1,! }6 @4 F& r n* U& I1 C; ~
assign mcasp_afsr = mcasp_afsx;
" S% o+ L) V% K! ]6 ~3 O: o; C- H; bassign mcasp_aclkr = mcasp_aclkx;& m- {( v4 J1 c- d( l; a, D# l
assign mcasp_ahclkr = mcasp_ahclkx;
) s/ r- U% e# R' _7 v4 y8 [assign axr1 = axr0; 4 L2 W, x" U/ ?: ?! q6 s# k( t4 A8 O
3 q3 d) X4 m% S7 o在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 2 h; N1 o$ J u- o }# O+ K% F
static void McASPI2SConfigure(void)
' E9 N: k) H3 A/ g5 S8 J{9 q* s* V; K' f3 ?, g: r
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) g- q3 T: o( U% o! v$ ]6 H( bMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */8 \( \6 r7 D/ s4 ]$ Y& W' V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 W" s0 H. r! E n" T' R. mMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! [5 B# E3 q2 V) n6 D- V9 LMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 b3 K2 K5 P3 @8 kMCASP_RX_MODE_DMA);
% q* `* f* L1 LMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) `0 z% H5 S3 e0 b D! z
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 b9 P) z0 S# ]( e2 UMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
y4 d4 s- g; U y. \6 A: ^MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ q. X$ `* f) O/ N- K" C2 B' {McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. v0 ]0 x0 C2 s: H- Y3 sMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */7 O* D+ L4 p" |5 i- r" i
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# |0 K1 @! n7 k) G4 C, \McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' e# \8 T9 ]; T$ C) M5 {McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 j' n! K# f) u3 v8 l( t0x00, 0xFF); /* configure the clock for transmitter */9 u5 }" h' |; z. `
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ X. E/ i- h" K2 _( HMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / w% `4 R \6 e
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; V- h" J- L3 d0 e0x00, 0xFF);
* S" z8 D( @/ z$ ~# a6 Z
) U5 ?9 s1 ^9 l/ J, ?/* Enable synchronization of RX and TX sections */ / D b9 H- r( U+ @# D. L3 Y+ A. A
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
! @3 R" l0 @2 m* ^: }" RMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ J# ?; f3 }' t* z9 {. N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*& n! m5 m F5 H, S* z( V! c# z6 w# r
** Set the serializers, Currently only one serializer is set as
9 t$ b4 }& J3 w- u0 _) H! h** transmitter and one serializer as receiver.( l6 K* j$ }; a0 ?
*/5 a3 c% I7 Q7 D1 x
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! K8 c7 z' |4 }7 @McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
" L6 L k( b& i! D1 w** Configure the McASP pins % L7 U7 H6 o' i5 n/ o
** Input - Frame Sync, Clock and Serializer Rx
" H5 O' c6 n0 B3 r** Output - Serializer Tx is connected to the input of the codec
. d, K8 P2 V: u6 {, D' @*/+ O* F# L' u* v7 n5 s$ o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); R0 U: n1 I8 I O8 P5 G- w
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ M& E; v: B/ P9 p$ T3 y4 e! m$ yMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 `% G; N* K0 k) m| MCASP_PIN_ACLKX
4 g8 M, z+ o7 W" C8 r8 E| MCASP_PIN_AHCLKX% H6 `" v) a# D w$ F" T# y
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */! `0 L9 _* g v7 I/ c0 l3 _
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 {) c- p! B: F. J3 \) p. _6 _7 J- S) R
| MCASP_TX_CLKFAIL
6 \* }; Y8 c! j; ~6 q3 G7 x2 u| MCASP_TX_SYNCERROR. y# e- Q1 _+ _8 Q$ r/ A5 V
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 H# A' I+ G4 R4 L| MCASP_RX_CLKFAIL
0 E4 b2 q3 D3 p4 S S( y, z$ x- F| MCASP_RX_SYNCERROR
4 [4 q& L* _% r4 p r| MCASP_RX_OVERRUN);
$ k& n" s" u9 `7 Q0 m} static void I2SDataTxRxActivate(void)
, {0 N! t8 W: W3 ^8 I{
; A6 x: t7 K. y+ \/* Start the clocks */
% _+ D, T$ \+ @1 \# m! ?: ?McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 x; s) J& \$ [- Q+ \: T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */! o4 v$ ~( W- Q5 E1 a) m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 O7 r8 _& |! x; F8 \
EDMA3_TRIG_MODE_EVENT);
, R( q K4 r. P% x0 ^: YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 {. n3 C' W% Y0 Y9 M% a2 P9 z
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
8 D1 h. s* K3 A7 o! a- U; X3 dMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; ~5 c! r4 b ]; x5 v) U/ K ]McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
; y6 R+ N5 |3 Wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
1 k0 C" h5 q3 l( |3 ]! Z& cMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: L& ], K/ ?) v/ j" s0 b r+ V% jMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, e9 H: F; s# g+ @" B) f}
! ?5 m$ k' G! ~! A* W1 O: K0 m f请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 6 ]/ H3 Z% ^& G" }3 U V9 R
|