|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
9 t' R3 R6 Y9 y9 zinput mcasp_ahclkx,6 A: V- d$ h9 X" D+ N$ S8 i& n
input mcasp_aclkx,
5 E( W" H! A$ y3 Z/ H* `input axr0,
1 v: Q4 r9 Q3 @7 ^. w1 U# y: e1 K8 a5 j, [. H% R x4 b$ R
output mcasp_afsr,
$ m/ k( I% E U4 e7 routput mcasp_ahclkr,# X& e2 V/ i# [- u! c$ S
output mcasp_aclkr,
& Q4 l( i" G1 Y5 [0 @+ `& joutput axr1,
2 _6 ^5 a. a# H1 e" d4 n assign mcasp_afsr = mcasp_afsx;6 q/ A- f1 U4 @# w# X- M
assign mcasp_aclkr = mcasp_aclkx;
$ o- t$ H, s6 g/ S' D- G. T3 wassign mcasp_ahclkr = mcasp_ahclkx;( b1 L/ @6 [' S
assign axr1 = axr0; ! L8 u' O7 i! }* W5 R8 {
- ~. ~$ J1 e* K- d" ?1 v在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
, e/ I/ @8 s u* L2 u4 nstatic void McASPI2SConfigure(void)
! k0 {1 s, b# c2 T. R' q& `6 ~4 v7 A{
8 h, n$ Y& s" I2 Q4 v+ \McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; y8 O) t4 \. k: m# gMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer *// x+ z" ^2 p$ z/ W
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* \+ q6 n5 A- c6 @% P1 VMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
5 y% r2 K1 \; q' y/ F: \0 MMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 m6 L; w( o0 L$ I) zMCASP_RX_MODE_DMA);
9 O8 {0 @% R& C% a5 l% _McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* t S+ @3 U g" C; d7 jMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, W5 r) u$ j9 [$ k: |. |McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; q9 X/ x, k% [) w6 ~ V% BMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 e' K5 v0 I- G# L
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
Z+ `2 |8 `. W6 C: |6 E: ]4 ^MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 n7 |# Z1 C' H8 H& H& c" WMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) Y* o/ |% V- |; A* R0 FMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! v( a' ]5 O" q( f% }McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& r; g2 U. k& X k. X4 M, l
0x00, 0xFF); /* configure the clock for transmitter */! ]# r( ~4 F2 p5 g/ {- b
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
# g+ D/ B, C4 O$ {$ tMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% I2 S+ z8 p" z) ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# i* s/ |6 c" K0x00, 0xFF);
7 Q: J! `( a' F. p1 N* C7 O) d) { }5 @9 q$ S8 r8 p
/* Enable synchronization of RX and TX sections */ 0 M* {* [1 [# K$ j- o+ h5 t* e
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ y; k1 j* E; `+ P* hMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 ?0 c; }, z2 w! tMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! {4 O3 ^! Y! S8 M2 H( ~% f# K2 z( A% h** Set the serializers, Currently only one serializer is set as
7 a# h C: ?3 ~- w; I** transmitter and one serializer as receiver.6 B0 k1 v+ q j
*/
& B( t& T9 x3 V2 K; x- |( |) F. y( GMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);- D! }* V* B$ I( P/ z |
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
( Z! N: }* b1 S( [** Configure the McASP pins
/ L& C+ L* L C N& o# S6 T7 T** Input - Frame Sync, Clock and Serializer Rx6 M$ p+ z6 A. S8 S8 p/ t
** Output - Serializer Tx is connected to the input of the codec 2 N: }8 K/ J# }+ }: ] L3 ]
*/" _2 n+ B/ P, A
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) ]9 z; t& {$ }8 `' @; {5 s9 o6 Z) mMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); T9 D! S5 ?. P% i* F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 Q$ A( X3 [0 b5 `5 Y! Z| MCASP_PIN_ACLKX2 M- ~8 r( U" F1 g- w
| MCASP_PIN_AHCLKX
# u5 t/ u, ^/ R p% h p7 P! X' e| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 [" ?# o3 h4 M* @& GMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ `5 a( L; M0 b; ^ q" H& I| MCASP_TX_CLKFAIL $ ~/ U) S9 F0 l5 ~' d+ ]7 l
| MCASP_TX_SYNCERROR
/ E1 a+ [2 T! F| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 x, A% h4 N$ c1 {
| MCASP_RX_CLKFAIL
. M% D5 U! W. r* k| MCASP_RX_SYNCERROR
# }7 T: w7 p7 A; ]# e| MCASP_RX_OVERRUN);- Z2 S8 R. e7 B' X) U/ J& f4 D
} static void I2SDataTxRxActivate(void)
! H* O: F; n* } |* Q& `5 p( x$ R{4 L5 v2 H: u2 Y) w8 z8 V
/* Start the clocks */
+ y' Z5 a- k2 c- \McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);4 N% R* ]. W6 g6 O
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */# Z/ ]1 v) c, f* P0 [
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 c( k1 \0 E* S. uEDMA3_TRIG_MODE_EVENT);
, H& W9 [0 L& ]7 \. V6 Q) uEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - z2 n! z( B5 T" u' e3 n# Q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ L, P" e( `; ], I3 h# F0 `McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" y& N) i6 _9 k
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
* s, C, L- b+ y3 |5 [while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& y$ i9 u9 B, i: b$ K. F
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. @" z. D i# z0 d; } ~
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);: B$ ]1 d- I# `3 I5 p
}
; D+ J% A! n4 ?9 ~2 \- h. s0 ^请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: H) Y V; I) R- Q. a. I |