|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,7 ~5 G( v" A# `" d
input mcasp_ahclkx,
. v8 Q7 t' `" pinput mcasp_aclkx,
7 H0 o( H Q) g6 pinput axr0,
) c; [$ ]! J, d5 M5 b4 ?9 g, b* w/ R( ?8 L0 Q% z( l
output mcasp_afsr,4 ~' }! P4 i1 S
output mcasp_ahclkr,
: `6 x8 ]- m+ H; \; Soutput mcasp_aclkr,- ]& j% x, W8 W8 M
output axr1,8 x, \* }0 o6 Z' s7 k
assign mcasp_afsr = mcasp_afsx;! d& C3 s& ?5 b* l# J
assign mcasp_aclkr = mcasp_aclkx;
2 D9 `# o2 N# f- _1 Nassign mcasp_ahclkr = mcasp_ahclkx;
, I. t; N' M( P3 \, O; i* j' _assign axr1 = axr0;
1 T- Q" ?; ^: t: _4 N& h' J# @* V6 J [5 c
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 v& O5 m" L, L9 g$ ~
static void McASPI2SConfigure(void)
4 P$ U1 g; [5 a8 x{% V9 p* m" ]8 t& y7 p9 n6 W
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 h& h6 z. N1 @+ bMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
/ I6 `' G0 J% c/ c# T5 uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: o% J8 Q. P9 M4 b7 b' o- A
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */7 I" B9 S: G. K; J* Q* J$ i! N
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 g& z( a0 N* ?/ o5 s4 x3 |MCASP_RX_MODE_DMA);
: T! n. W; Q9 P6 d: IMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ X6 Y6 A p# G2 b# f
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */. v+ a3 `; d2 I' k5 ~8 Z/ E
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' \$ h- L9 C4 n& V' v% h
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, p. I) y/ ]9 M9 z$ ~% X5 \McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& R' k- I6 K/ N. e! B5 t+ G2 V2 @MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */6 n8 h; O; b5 ^ S) c) l3 y8 F
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 b( D1 a- W4 X5 o: ^3 e& ?7 _* A: F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 L* v/ k; q3 W+ K- ]: VMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 `$ G7 ?7 v# I: G4 l/ x5 V5 M1 W, b0x00, 0xFF); /* configure the clock for transmitter */
) _4 X; A* Y( A( E n6 yMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ O' O! O! t& Q- R0 mMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 R Y; o: P3 [* t
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& o2 U- k( E' L/ J" z3 ]
0x00, 0xFF);/ q) @8 K3 w& b
+ F! d0 ~" a$ v$ M/* Enable synchronization of RX and TX sections */
: ? I0 S/ P% xMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */ F2 Z& x/ d& |% C7 v
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! f( e( b# F9 X! p- c' y. p& wMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /* K; V+ O8 B: ?+ w6 T. h
** Set the serializers, Currently only one serializer is set as2 P7 H8 c2 z0 @2 z) z/ m
** transmitter and one serializer as receiver." {2 V- t& b; h
*/
. [" c$ b% x8 d# S/ Y" MMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 \/ n1 U, U: fMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
4 Y0 ?, Z0 }# c6 M: G** Configure the McASP pins : U" f+ l! T3 u5 M& h
** Input - Frame Sync, Clock and Serializer Rx
7 i" z+ p7 z1 g& R6 d* L1 n( @8 L** Output - Serializer Tx is connected to the input of the codec / D9 @. @4 v6 c
*/
: O: f! A1 Y* R0 F6 {! vMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 v1 _) w$ A7 A) R, P# Y, oMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 n* X; a9 ?* H! t2 h& WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 {0 O9 _3 J. ]
| MCASP_PIN_ACLKX; z: G) @ N9 O) Z- \, _7 F2 B
| MCASP_PIN_AHCLKX" P" o, H9 m: U/ W* K) C' {
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */ r! q9 O4 n6 e, ` {) J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 V& p2 g3 v- H4 Z
| MCASP_TX_CLKFAIL " O6 x1 k" r7 ]1 l
| MCASP_TX_SYNCERROR( \9 `8 k( e+ ?0 X8 u" g! v
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
4 d' P5 `" }! }# p) q: R| MCASP_RX_CLKFAIL
9 z) D, e* b C| MCASP_RX_SYNCERROR
- J/ w6 \; I+ G6 P| MCASP_RX_OVERRUN);
1 P# m% G( J+ W4 h3 P} static void I2SDataTxRxActivate(void)
- H f( [0 R6 h6 L3 H{
: X2 P& w4 n' |! U: H/* Start the clocks */
) _/ q! ~" L* X, x4 oMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' B$ i- g+ r6 O7 M J
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */2 j9 O) e4 T& N8 N: v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; ~, E! g, G: x" @# Q
EDMA3_TRIG_MODE_EVENT);" y/ ?( ]( Q& K( t) u3 d* z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# _" ]; _: h* w: {. A5 yEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% I* w8 ~# y8 VMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! r* j2 r6 @$ m Y* Y' o( }0 ^
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ H7 N9 C+ f+ N$ Qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */7 G/ r/ \) i5 x3 `# V" n
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. W$ |. O/ |4 y. B7 a8 UMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 {7 z' S O8 }+ F' J2 c) r} 9 v# w7 A' e( I8 J
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" W' i9 } o3 O2 n0 [1 h |