|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! X# c) i/ y# n4 X/ k0 x+ u
input mcasp_ahclkx,
/ K! n3 b+ o M5 s& |input mcasp_aclkx,
# [ M2 y4 k& O$ linput axr0,
; l I( L5 h/ w* L
; u0 t) f3 A9 }( ^7 p; _output mcasp_afsr,
: l1 y' f" ^6 R4 Toutput mcasp_ahclkr,
B) j4 `, B4 K Uoutput mcasp_aclkr,
3 c1 @; e8 n Houtput axr1,
! Q6 R% ]( g" S, K assign mcasp_afsr = mcasp_afsx;8 Z3 U5 R6 P+ C, Y
assign mcasp_aclkr = mcasp_aclkx;3 k, D, R' i$ ~$ A) \& X+ Q x
assign mcasp_ahclkr = mcasp_ahclkx; M) Y: `% a! R1 b z6 m
assign axr1 = axr0; . C3 h0 u8 p9 d o7 [8 I1 I3 u
: z0 F; [' r0 v R. o在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
1 c! F- _! ^& E! w4 l" m, K1 vstatic void McASPI2SConfigure(void)' @- B6 E8 j5 E& U) ?5 W
{; O3 V" v; Z: q: j* y% w6 B* g
McASPRxReset(SOC_MCASP_0_CTRL_REGS);# X: ~3 c) e$ J$ E" D7 R3 V
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
# h& Q M0 a0 r- ZMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 ]" ^' _; P$ x" B; e1 xMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
]) L* X$ I$ o* {McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, s4 F. z' l" Q& ]
MCASP_RX_MODE_DMA);
+ E9 L+ R- ~ f0 K! ` n0 XMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ i9 U$ f! U$ D6 u7 k6 r
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& _( o! k! _8 b1 [0 xMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 y" S; D; D+ D y8 QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' E' ]0 l+ O: B# z6 uMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 Q6 m& O% N* ~" N& X9 }. }MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */) ]1 i3 J) P" n2 R
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ V+ Q2 x* d. O0 v; z% v% N
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " X7 |0 R- O4 A. K- }8 y
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 J: S3 s6 K* \0x00, 0xFF); /* configure the clock for transmitter */+ H+ u( B3 J7 b% V
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 b2 d4 F9 ]1 e) D! O* sMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 I! W$ P* P# ]( a: ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% X7 K3 ?$ f/ x0x00, 0xFF);; `4 y9 K1 I# q; ^! }3 f
: G/ J/ D6 l: c K/* Enable synchronization of RX and TX sections */
6 y9 m3 f u) D5 ]4 k9 vMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
1 _ y+ A; q6 p& {4 a+ MMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);8 q* a: W, o/ P! h
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 N) [. j9 l9 A: d4 p
** Set the serializers, Currently only one serializer is set as
7 ]% L* P; O$ W** transmitter and one serializer as receiver.- b" J% j, g5 _- @" L6 k7 ?
*/- \* G4 c6 Z) }6 U, _# l
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- h6 u. B- o) ]3 d: EMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ w% c6 @$ ~/ s5 s0 ~
** Configure the McASP pins 1 c* @ A2 ?; I7 R# c
** Input - Frame Sync, Clock and Serializer Rx
1 [$ @/ E! T7 D/ ^** Output - Serializer Tx is connected to the input of the codec $ h$ G8 C5 f- q9 x4 d8 z. n
*/% M- N5 |0 S0 K
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. r. P) Q, b# s+ l' H, s' y, ]McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 ?0 b7 `- `0 A2 sMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% E: V( D/ c9 B; E2 Z' H| MCASP_PIN_ACLKX1 S7 b F% v+ H: U- a! B
| MCASP_PIN_AHCLKX
2 v! V$ A6 r: X# E- q0 K1 || MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */8 w$ }# O" f* s" v& N4 U- T$ ?. \
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + e3 m: y/ |% l! H
| MCASP_TX_CLKFAIL 8 |7 H* d0 ]! ^3 {: U! G! f5 ?
| MCASP_TX_SYNCERROR; O4 E: ^' {/ y, A; L" j
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 P7 n2 j7 E1 c% s6 h4 M| MCASP_RX_CLKFAIL
) Y; W D$ k4 J, ^| MCASP_RX_SYNCERROR % a( U. J% Z1 }1 ~/ a
| MCASP_RX_OVERRUN);0 N: b1 W, y9 O1 V# {
} static void I2SDataTxRxActivate(void)* h/ ]7 L) n$ n S% l4 b
{+ Y2 R0 X/ z+ Q; k
/* Start the clocks */
( x, B5 z' T. r0 DMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' ~& b! M; b) u+ ~; }7 M9 vMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; _9 b ~3 q- w! I s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
. _4 M# B% K3 BEDMA3_TRIG_MODE_EVENT);1 P4 r9 a2 `6 s6 B2 ?- y9 m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 g- F& X1 V6 q0 _ zEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 x7 }8 @/ S% G5 L7 ?! oMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 `2 X4 S: U. u9 c5 \
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */4 I1 w r- h! |) @" B# I8 k' I
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */+ p, d. C* ?! L( f$ y7 l; q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! i) J. s0 C$ k
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' @. w( O! }7 ]" c3 c ~$ Z3 [
}
& o8 g0 H, K# L" L4 W! H请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
D+ }3 O+ B7 C' a$ T |