|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,; j. ^8 Y+ y* b# w+ [) j
input mcasp_ahclkx,
; w& F) z- j8 L" Z m6 Z- s+ vinput mcasp_aclkx,% L. i9 @" \1 {- V+ ^
input axr0,9 S3 H' K1 V3 {) P
8 ~7 ^* C3 M) s. b* W" E* j
output mcasp_afsr,
' K' b! v. y4 `, ioutput mcasp_ahclkr,- {' E$ [! [+ _2 i, Q
output mcasp_aclkr,
/ T* i- ~; @2 R R4 Xoutput axr1,5 k% t. {$ O6 I! v4 U8 {" d
assign mcasp_afsr = mcasp_afsx;
' A% ^ s5 @& d7 Aassign mcasp_aclkr = mcasp_aclkx;
4 X: ^# i4 d# j4 O" V2 \$ w6 Wassign mcasp_ahclkr = mcasp_ahclkx;6 P, J! F0 `. @6 U
assign axr1 = axr0;
* R7 a; ~7 H. i6 q; ?/ K. r
+ y, V N! X4 M4 o在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
& \+ \" S8 a- N2 H9 jstatic void McASPI2SConfigure(void)
! g& E, E% f, c2 p{. h, X: j( m4 A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! E( X$ m' b9 l3 y
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
% _5 Q' B2 N2 W: ?+ t* g; yMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& b; f6 S& }3 J9 W$ s
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
" m" p d1 z$ f* l& b' g7 K; _& b8 _McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 \& m- G" v) `' ]5 V. dMCASP_RX_MODE_DMA);8 q" v3 \, p2 }$ b I, e
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* s& v. Y# z D: ^! G/ V6 Y0 jMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& ~* I* P K5 Z) B& L0 hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 s5 k4 R/ u3 r9 Z# H
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 w8 Q& M; `' A' Z `# |McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 g0 C; `" q/ B. n! g" A5 n8 W; y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
& H- t0 Z7 v2 y$ X3 A! I% TMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 N! g5 G+ I9 j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
- y6 s5 E$ m& U, |/ N0 PMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& V: ]( }6 B8 L+ B6 K' C# K# z
0x00, 0xFF); /* configure the clock for transmitter */
3 j: U, Y+ R) e# }6 |McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);- c( e% D3 X1 v7 G; k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 w; J4 V6 Y9 n0 L0 A1 l% ?4 G0 C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ B, J" ~' [* Q; v5 N' r" l
0x00, 0xFF);, i3 W- \0 x/ t8 q+ [1 A
4 F. m0 @3 z+ `* S/* Enable synchronization of RX and TX sections */ ' b# k9 {/ D3 B) m+ n! ^
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */! M8 h; c& G8 }8 [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# K9 [; Z' X1 e/ w0 U
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** A6 X8 P6 J% _5 f
** Set the serializers, Currently only one serializer is set as- Q0 o6 o, E" `- w0 E1 s( L
** transmitter and one serializer as receiver.
6 g1 Y, O: f3 I t*/& ]# ]" \) z& J! X6 b4 O
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
) z5 g: _" b2 J1 L: B& V( }: ~: AMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
& T @# P2 M! x( q# r9 h** Configure the McASP pins ' M# h+ h$ @2 i) S/ ?/ z5 s
** Input - Frame Sync, Clock and Serializer Rx
" _6 A. \/ [! ~$ b6 x1 b, \4 A** Output - Serializer Tx is connected to the input of the codec - `: Z9 D4 A7 u, H1 Q$ X. d
*/& i4 I o6 Z q. Y/ d
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 q; g9 e/ ]4 u y! E, @8 |McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 K/ ?/ X& e' o% A8 v) `7 m
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% e3 [0 l8 v6 F3 \& U
| MCASP_PIN_ACLKX
. T: @8 i* j; _4 D2 d| MCASP_PIN_AHCLKX: Y- U' k7 H* y! ~% i$ d
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 l- V' B: D5 O- ^6 I) [1 ]McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 m0 s- H6 J3 b3 d7 K* d" o& [
| MCASP_TX_CLKFAIL - k6 W. ~8 j' ]! Y* s5 E
| MCASP_TX_SYNCERROR/ T. a& Y2 G. k( A
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* k: t- o8 l; @+ M0 D| MCASP_RX_CLKFAIL: {6 U; F+ V3 N& U/ O* [
| MCASP_RX_SYNCERROR
, M; R* ]9 X# }* L. V6 W| MCASP_RX_OVERRUN);9 p: c7 N& ?/ B' u6 t
} static void I2SDataTxRxActivate(void)
1 _" }. V0 m5 P% H' i{
& z; z! d' J' f2 P$ l/* Start the clocks */) B+ W: J# D6 X% t7 X! o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 h' Y2 t3 k: k+ PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
$ d3 S. Y0 R% y6 h% o2 T9 r: C9 yEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 H8 E$ Y1 |5 n' f E1 x! Y5 |$ P. M
EDMA3_TRIG_MODE_EVENT);: \7 n7 Q4 }' ^! Q$ p% s2 \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, d q! P9 K0 Q# K' n& o$ ^EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% K% j. u l) }: x4 K$ ]$ t
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: N1 w+ g& ~! }4 v7 v, cMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) }& Y) B/ y) I' R2 J* c
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */2 C8 ~7 e/ z4 q/ [& w
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 f6 u/ O2 O7 \McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: N! y0 I5 W R' h. |% `}
, _( @" m& p) _, u0 s9 X4 l请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. `' l9 E. M, Z4 D# ]
|