|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
% h1 o. ^ i9 X# p) ^input mcasp_ahclkx, y) h; l0 u: ?. O1 G0 f/ y: |: S
input mcasp_aclkx,% m; L3 @8 [& t
input axr0,9 v' X/ j# r! d: \
) U4 O. h+ d! boutput mcasp_afsr,
. c1 |) k+ F. o9 e, ]- k$ i& toutput mcasp_ahclkr,; N5 z/ K: C; Q& a
output mcasp_aclkr,+ H) Y: \" I: S" C3 `: P9 a
output axr1,+ W3 y0 t2 R& t$ h" d( c9 p7 ~
assign mcasp_afsr = mcasp_afsx;
9 @+ [. b4 p2 w3 v; T) Aassign mcasp_aclkr = mcasp_aclkx;2 u6 ^. l- J: ]) o' [
assign mcasp_ahclkr = mcasp_ahclkx;
7 N; r/ Z) H5 }" y, \assign axr1 = axr0;
1 D+ o4 m# j% _% E+ H2 V
# L# Z% [5 v1 y! r C( c在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & F4 b) `; z# m# \
static void McASPI2SConfigure(void)
2 e! M' Z6 X6 }4 X. s1 q9 p! L{* o6 Q7 H! R! k D; h
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! A: x+ B$ Y/ r$ o" L0 o( a
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */+ _4 ?2 u& ~/ O& k
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, p8 r; z* ]. \4 a4 H% I4 W
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
: \# C2 `5 C, ?1 LMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; d6 h- U( T- ~% ~4 A% |. EMCASP_RX_MODE_DMA);3 z$ w8 c6 j* `$ g$ F% X& h' _" c$ Z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& n0 g1 }3 G' ^. W iMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% B. W) B) Q4 z! U) }
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 a% ^/ Y1 ]# l6 v6 zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 \+ `* g* f& U( E0 z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # R6 b7 }4 L4 I5 e. @- e
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# C x0 i% ?3 u5 b$ M6 \3 y- ^McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ ]2 \1 h* ?* c$ E- f) Q6 _" \McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); # c' Y8 E6 D+ e+ ~; a
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& T/ T- Z r. n' b, h
0x00, 0xFF); /* configure the clock for transmitter */4 R3 i" b. N% {+ i) Z9 J) k! S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 R. q# q+ h% T# `
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
* {+ A5 C# M* PMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# }' A [2 N+ @! X
0x00, 0xFF);
* D/ A" j5 b3 Y: G" E9 q* K
$ E1 d5 Y: D% O- c- p7 S/* Enable synchronization of RX and TX sections */
; i; X" Y3 T% KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */) @7 [" {. }( X( R0 o
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 w' a0 i5 N/ O4 ~8 ~McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
& e2 F) H t" h2 P- _** Set the serializers, Currently only one serializer is set as
4 G4 ^5 O4 }4 l/ {: ~% z** transmitter and one serializer as receiver.
& S/ d2 B$ N( Q6 [1 y1 p( i7 {* A*/
' r( |! \; L3 F1 A5 a) V. }McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# N% Y2 ~ t0 I! h: h, h( Z4 D. cMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*3 A6 V3 C* M/ ~+ r6 P# c# s
** Configure the McASP pins + l$ L# N# `$ W# x
** Input - Frame Sync, Clock and Serializer Rx
5 ]& v% v, Y I+ ?% m0 r** Output - Serializer Tx is connected to the input of the codec
0 R& w' d/ L0 `: C4 C% p7 A! J*/; \" d0 |2 e% i$ K% h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; U# y2 w) N5 gMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% O+ j( h* \8 c. Z' e
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 g2 [, f j. \4 w/ X c
| MCASP_PIN_ACLKX
- O% m( ?- `4 d2 |' d' ~| MCASP_PIN_AHCLKX& `* i6 J! _) R0 s: ^
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
~% D' m3 e5 u' ^1 k9 RMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 p0 j1 o3 O' ?! N+ E
| MCASP_TX_CLKFAIL
2 W8 R/ \9 Z) K| MCASP_TX_SYNCERROR
& N- x* D: w- M# k* @: A& T3 S$ @$ M| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 E- s. _; T; J: D8 v4 A
| MCASP_RX_CLKFAIL
2 z7 b+ l' Y; R; ^9 o9 A% N| MCASP_RX_SYNCERROR 4 T3 b% [4 A, x; S' A9 l
| MCASP_RX_OVERRUN);# E9 i; u' n- y2 N! Y0 V9 y i
} static void I2SDataTxRxActivate(void): O4 m1 d& Z* `
{
; l, A2 I3 u$ f5 n8 W/* Start the clocks */) K! F. X4 {4 N
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);& ^0 g- `9 v+ q* k3 A1 g+ O
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */$ `: q; J3 X. p- M: f/ h. v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# ^. ? t E0 l; l! J* p
EDMA3_TRIG_MODE_EVENT);8 |$ W( h0 D' N4 t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 }. T6 R5 r; N7 e+ e1 P, \EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 `0 P" n( W' q7 BMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 C# h1 \- p2 b
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */$ K9 G: Y: ]7 v( Z% D1 p% |
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */1 J- g( C9 k8 [8 o( e
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 V: V* d# y* h& N' i% w) L7 f
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* [ L- ~9 }9 h1 `& J, E1 w2 Z}
- H- |9 ~" V" w6 D8 g" j* x" x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. % @% |9 X; H1 s, t! n
|