|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
" A8 i9 o0 R, D* U% z; b# }4 ]input mcasp_ahclkx,5 _6 j( \ L8 n* S
input mcasp_aclkx,
9 l* c/ o6 {1 m: sinput axr0,% e' p: c& Q" a4 k/ i
- L6 d. z/ \& W- s* I& ~7 `
output mcasp_afsr,
( V8 U8 w+ J/ M9 ~5 y$ H2 H& T2 Xoutput mcasp_ahclkr,* D- p2 e% C) Y3 h# k- l
output mcasp_aclkr,# F3 I) e4 e% Z$ N5 `
output axr1,
- N {+ r7 `$ u2 x# Z assign mcasp_afsr = mcasp_afsx;
& q3 Z4 O$ z$ P/ e) R# {- Fassign mcasp_aclkr = mcasp_aclkx;) |6 Z, k# o( k f: A
assign mcasp_ahclkr = mcasp_ahclkx;* M3 M0 {- y: [0 K( Z2 N) z/ U: q
assign axr1 = axr0; : ? u P4 j/ N0 w. t% Z3 p
; A+ L' O' |, j- f) _$ a# P0 G% i
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 . ^1 z5 Y8 P- Q8 f8 Y4 ?
static void McASPI2SConfigure(void)
4 C* _8 e. I: e' E. ]{
. {, x2 \6 e5 @McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) v; g! ?7 u4 p* Q j) Y+ MMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
; m7 o6 v+ T, `2 g5 QMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ N, g8 t# s7 M4 ~1 L
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
8 Y9 h, }2 `$ Q+ z0 f. g' CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( d' q8 u9 E) g3 `
MCASP_RX_MODE_DMA);% r# Q F+ p# c" U
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: p% k1 u1 ~& Q. b( Q6 F( PMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
q$ h: e; V5 f7 W+ qMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 q- @/ b& U7 Y# tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ o% g" ?4 m$ F2 J) P8 HMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 w& L: n1 o7 i- M8 w; _; z7 O# C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ I8 x- o" Z6 y( t: qMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 ?: V( Y# p) b; C2 m
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 U& ~/ ?6 W& C) n1 tMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 e) w6 T5 _ ~ ~0 V0 N8 f
0x00, 0xFF); /* configure the clock for transmitter */
1 ]' L9 Y& {0 S8 j8 N& m! qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( N5 O3 M. b/ F" XMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) e0 C7 f$ A. r$ m7 s
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# d h+ p- L9 O
0x00, 0xFF);1 s1 p7 X& O0 y; r
$ d G( D/ L R' l+ y \6 ]
/* Enable synchronization of RX and TX sections */
; r. Q8 R7 E! v( gMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */: E' `( m$ n8 {% ^' \2 F
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 g* m' R2 s" dMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 w7 ?" K% ?% r. ^" e& E
** Set the serializers, Currently only one serializer is set as6 ~- N+ P) X3 m6 _2 U; u6 u
** transmitter and one serializer as receiver.
3 F; }6 `$ r8 ^0 W- R; A2 z3 W7 y*/3 q% {; C- v% b4 p! Z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ b2 a$ h4 v$ C
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*( V/ T( u$ j1 e6 o7 v2 e
** Configure the McASP pins
: Q C, a* D( D$ O- d, e$ r; t** Input - Frame Sync, Clock and Serializer Rx3 c) M* a* ]$ a; }/ y
** Output - Serializer Tx is connected to the input of the codec - B/ D0 B9 p& I, x; H- l: I8 @" i
*/; V9 s: [8 M2 B! ^; c% h& D8 E( g
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' _8 R) {2 s6 Y1 J% Q o; \: IMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 ]! k4 H7 |7 X( l7 ^/ t- O- B0 sMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
6 u0 s" ]( ]* t/ d! M: \) M| MCASP_PIN_ACLKX
' x, Z7 D/ o' t# L# ]$ {1 e; y! R| MCASP_PIN_AHCLKX
4 M/ m. _0 t$ E. m7 J| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */) {% c. S7 ^ h0 f8 E- S1 d, C( y+ d
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% Y$ K D- k3 H- t| MCASP_TX_CLKFAIL
: v& P4 a; H2 y/ j| MCASP_TX_SYNCERROR, @9 o6 X& S R: C# U+ A
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- A) R- Y8 j: n6 n% d| MCASP_RX_CLKFAIL3 @2 R$ y N& r/ ]1 T
| MCASP_RX_SYNCERROR / h5 ~8 X: o, l) ]4 }4 O
| MCASP_RX_OVERRUN);* E$ H Q9 |# N, T
} static void I2SDataTxRxActivate(void)1 v5 k3 u1 M, @) P; `
{; @6 o7 q5 n! F. \% ^' v5 U
/* Start the clocks */
6 H5 E/ \: A" ~6 C9 w! `0 kMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' D; M6 C# W. U; w3 ?: {
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( |* p6 ~4 U" k. Y9 C$ m. y! Y3 j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! D7 }" T: d) t; r& }0 B
EDMA3_TRIG_MODE_EVENT);6 Y+ y; F( L9 v* ^) |8 E# g
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* x2 }1 V) m6 E. D8 |& X* mEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 I: Z, k" `* ], q C+ DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ N7 ]5 t. I. I! OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) L3 S" R, B; Z" fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
M6 T6 V0 [8 m+ |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);& u5 ?, J# |$ N2 \) r
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' x o) U7 l; Y W: \6 ?7 d. n, t
}
1 ?: H: \0 Z( ?# H9 V; Q请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 ~% C. U0 J8 O$ Q& m2 J! K7 z& e |