|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,6 \8 Y- K: N' p4 {7 m
input mcasp_ahclkx,) A9 X I3 t$ x& _) _
input mcasp_aclkx,' f6 H& r( d; Y
input axr0,
. E S+ R. E' I/ g/ n% J
9 M1 p) J6 A1 M, }output mcasp_afsr,
( X0 a$ u* s; l5 ^ Boutput mcasp_ahclkr,
+ [- Z( \8 F$ C9 Noutput mcasp_aclkr,* s8 e; j0 x4 o: ]1 z1 c
output axr1,' Z( y. d+ |0 Z; D
assign mcasp_afsr = mcasp_afsx;4 t* f% K( ?4 J$ |* b0 E
assign mcasp_aclkr = mcasp_aclkx;8 g+ k3 r# M( q
assign mcasp_ahclkr = mcasp_ahclkx;
O- o1 o4 x6 v2 t5 d6 Massign axr1 = axr0; " U" e" e1 G/ }% {/ g: t
2 c% j. Z' O* \- P1 }% t! o6 v在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 ~- w. U) L6 t7 J& x7 ?" s0 O& }static void McASPI2SConfigure(void); V! e5 ?5 J% P+ {4 Z5 |
{' Q0 D- j8 [, U0 h* Z2 j0 m/ I
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 D# m% r9 R- J1 _9 u9 d4 MMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
^4 j) Q2 Q e4 A' \1 bMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
+ S7 F# {- [5 s, E- yMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */& T5 A2 V6 Y7 ? g
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 V7 [# o6 ?3 _% d1 e, u
MCASP_RX_MODE_DMA);
! k1 q1 N' G, G! k$ h" sMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 S$ U0 G0 c5 ~; ]+ p0 c3 s: TMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 I' ^ J, q# t, x$ g2 |* i, qMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % s5 [6 o, A+ b" K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 u6 D0 m, b+ R0 o' pMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 J9 d7 L0 ?2 C- {8 BMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
7 j [! {6 n+ \5 k5 BMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 X: s2 ~) y" l- J# X
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & M7 N8 G5 X/ E1 R- }7 B( t. L$ `2 K x
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# N. i" o* g" D4 P; y" A
0x00, 0xFF); /* configure the clock for transmitter */
* |; w# Y! m. q/ ?+ C5 hMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ z& ~5 ~8 t) a0 j3 p; q
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # z; B# T: e9 {3 ^2 i$ [: q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,; v0 k5 J, F, T
0x00, 0xFF);
1 ]* b6 S% h7 \0 N; o2 s: \* N w, ?# B8 n
/* Enable synchronization of RX and TX sections */
& g& s/ e5 R v9 |/ B& j# v2 LMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */8 j( g7 ^, O! P4 b5 C1 g1 F
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! j$ ]0 i/ {6 T: \
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
8 E4 b$ b2 f( f2 w1 y** Set the serializers, Currently only one serializer is set as
& G4 F4 u& X, e( U4 ?1 @9 i** transmitter and one serializer as receiver.4 q" F f, {/ {* A( o* z
*/
, q) a/ s6 f' o. j# j: q0 F+ T. c7 @McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& c( m/ a+ R" g
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*, J8 U" S2 i/ r( G
** Configure the McASP pins
$ n1 S$ e L9 v& [% U** Input - Frame Sync, Clock and Serializer Rx
2 A# h. h1 G: V6 t5 n* `** Output - Serializer Tx is connected to the input of the codec % S% l8 I, F! F5 M9 t
*/
9 k; O; x, `- j+ P1 \6 ^McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 Y! p( ?% Q2 t0 I# JMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% B' n& `5 Z2 s" F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ t5 }& @% i+ O, _| MCASP_PIN_ACLKX
! ]: l) I% g, Q9 H! i| MCASP_PIN_AHCLKX9 d6 O( N9 B% `
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
, o, M6 O: B: F! N9 t; a) _McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 r* O' k( c: D! ~. B$ W% K- C
| MCASP_TX_CLKFAIL & s7 ]4 g2 G7 F2 G
| MCASP_TX_SYNCERROR2 G% k) h, F% e h
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR @' ~& m7 ]% D- h" q
| MCASP_RX_CLKFAIL
. `" ` j$ ^7 @7 L| MCASP_RX_SYNCERROR & l- w7 F6 o. T- a$ m
| MCASP_RX_OVERRUN);2 I1 S- h+ |% i4 o V
} static void I2SDataTxRxActivate(void)1 J# O5 z% r. \! K
{
. ^. @( c3 b+ `: ~3 ~ l; {7 `/* Start the clocks */
5 a# X; p0 _) P( {& XMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ B7 t* h% c, R! K/ r0 TMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
0 A X% Z! A9 m6 y( N8 o) XEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# Y5 n+ G. l3 f+ C- y" {EDMA3_TRIG_MODE_EVENT);7 A* D; g. m9 T' k# G$ O9 q, f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , V; Z: Q, m: {( M6 ^2 M
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ C# p; l! p6 d! \
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" a. F3 C A% u- A% t3 I, e- VMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) t* y) Z# F1 V8 V4 o$ Iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
# b! w, e' ], b4 h9 P8 Y# |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 R% H$ T5 O) N, E( t$ H! T$ \& S
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! C1 ~( C' C8 }4 E
} 8 i S* }- h$ _2 q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: T5 v: O. h% {3 J4 ]9 S |