|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
1 \. w5 p( n$ _" {6 J/ Finput mcasp_ahclkx, u7 I, H5 T7 q! I+ C! O$ J- Z
input mcasp_aclkx,6 P- {0 b4 H3 L# A2 l. d# r3 |
input axr0,
+ j) K3 Z7 O0 j5 \, V! g: C# D0 q+ x, _
output mcasp_afsr,
& ^- w! S8 X& o5 |: H* m5 koutput mcasp_ahclkr,% \0 [& X9 Z! d1 X( q
output mcasp_aclkr,
8 S2 L n% y- voutput axr1,
- ?( E) Z* a0 a/ i# e assign mcasp_afsr = mcasp_afsx;, k* i5 e* C8 B; n+ V
assign mcasp_aclkr = mcasp_aclkx;
: o9 t$ B$ z% B( sassign mcasp_ahclkr = mcasp_ahclkx;
( f) }2 e0 e, V$ Jassign axr1 = axr0;
8 M" d6 G$ |3 F+ M+ u4 r6 ^! Z0 j% W( t- J# ~0 T
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
4 ^# B9 p |( b7 @" mstatic void McASPI2SConfigure(void)
. M1 G5 [9 M: `$ T |3 Q{
" |. j5 P- |4 E. E* Z% s* H( e8 }McASPRxReset(SOC_MCASP_0_CTRL_REGS);. z2 j) m3 W+ ] P/ H' f0 J
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */: r: m$ J- x/ W& \& H S2 ~
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 W4 H; I) G! M$ _' o- Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
1 j1 t# j5 v3 Q# lMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 T2 r, C( p- T$ A/ a8 M. T& [
MCASP_RX_MODE_DMA);1 c6 M. y; J9 d6 R( F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 g% O1 u1 j# T i9 P1 KMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; u I+ s$ ]& u1 ?4 }2 A: Y1 i% hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , A; K2 z1 t0 B# l- t
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ I$ E. u! A6 i6 w" o; t+ L# n( lMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: F8 |# a4 ]0 K& j8 iMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% i/ k7 R. b2 m' U6 q1 ~* q
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- a( X/ J! O) ^0 A
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
- W8 M, {3 R. {. m. ^McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 Q) W( l) a4 a B/ `
0x00, 0xFF); /* configure the clock for transmitter */
" v+ V$ |# ]2 Q7 W' P* `1 a% m$ \McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. \" c, J, ?: @+ c7 n$ G7 H
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
; z+ p: u _2 T2 r# l+ FMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. w/ n& ?9 I; f% X0x00, 0xFF);
- _6 L- N ^7 K8 o4 j8 `# g) h4 Z) ~9 X7 a1 W) j# ~8 x
/* Enable synchronization of RX and TX sections */ 3 A& A B+ |2 ?) s* O; \, y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* q5 z$ U6 }4 s' o
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. f9 U$ ~% J7 e: v+ W4 t' c. H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
& N7 L, L8 ^( w& ^) W1 d1 A** Set the serializers, Currently only one serializer is set as2 _; k+ b* P! G
** transmitter and one serializer as receiver.
( @* f. J: _* I*/' L/ ?/ {7 o6 h+ H. E/ w4 }0 r: s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" h' m6 ~5 H7 q F, FMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
: }: W1 K" z: a! p4 T** Configure the McASP pins
' t; m% B. C+ _2 j4 e** Input - Frame Sync, Clock and Serializer Rx: o! }0 Y+ }) u$ x0 x
** Output - Serializer Tx is connected to the input of the codec $ }8 i) F4 {" m! ~
*/
# D+ A1 R3 |1 M$ b. l+ ZMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); J) |4 X" |6 ^4 Z. F( l; g; Y. l
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 M X H- }4 r" V$ `, X- ?5 q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 \( C. o, ?8 @. N! o| MCASP_PIN_ACLKX# b0 d( v/ F7 k. X- u8 x, q I; E
| MCASP_PIN_AHCLKX8 T7 P3 l3 _/ R/ j3 f% \, O8 v8 u
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ F; w! w# t. B- ^McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# ^0 j8 T5 G* \2 y6 _. X| MCASP_TX_CLKFAIL
, b+ M+ X: O* _5 F| MCASP_TX_SYNCERROR* t$ b( ?+ @0 D7 I1 ]/ D8 ]/ N
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ K2 H7 Y/ k! ~( s) b7 Q3 x
| MCASP_RX_CLKFAIL
$ D4 \* S6 ]! G4 D* i" G6 c. p| MCASP_RX_SYNCERROR G' c5 e0 K: c3 a1 p
| MCASP_RX_OVERRUN); R6 U( c6 V! Y8 \$ Y, W
} static void I2SDataTxRxActivate(void)
: i) N F, w: F9 X0 p# q{9 w3 G: z' W4 v0 t
/* Start the clocks */
9 T2 S% |* X5 HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% Q$ [ k2 e% t M# \1 {McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 q$ W7 a% _( L# T, R" k9 l# c
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 }3 J3 ?- t/ X) r; A) q; p1 t
EDMA3_TRIG_MODE_EVENT);' i, _7 @4 M. h8 w- m8 o7 ]5 s. t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % a7 h% ?+ i3 g4 y( s
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
- A% ?6 B* ~! e" rMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- j. o- m/ G+ v- j# a# Z4 qMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */ f* S1 h7 v9 p" }" B
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
3 o5 q: I# L y2 m1 E5 T% R7 zMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 [% w3 y# ^. M" R HMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);* D% D3 g9 _2 D+ y: Z0 k' r6 ?) O
}
- f8 O# H1 {9 @$ D6 U: s$ s; W请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 7 g: p3 r& Q! u$ d9 D. F: i
|