|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
( `: a" X/ V. Yinput mcasp_ahclkx,2 {$ n" E. f9 v* U& W, I
input mcasp_aclkx,
, J+ d3 w! \" Q/ ]0 Pinput axr0,
& u+ `4 D- F3 k0 v L+ w% d/ l" w/ `% g* s2 Z" A% ]. k
output mcasp_afsr,* E% u. j: @; ~& x* `5 S4 H
output mcasp_ahclkr,( }# G) `$ P# S& y n
output mcasp_aclkr,
# n T# |9 b" p4 d( j8 P5 poutput axr1,, r- _) m9 G. X1 B! m$ O% I
assign mcasp_afsr = mcasp_afsx;# J# U! ]- E5 N& `: M
assign mcasp_aclkr = mcasp_aclkx;+ K0 I( ]' r# x
assign mcasp_ahclkr = mcasp_ahclkx; {0 n: e2 L7 @) e! ]) H+ u- T2 l
assign axr1 = axr0;
+ V) V( N2 o' `' v3 v& F) i& c' i# z9 Y2 j0 ?; k. I+ c
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 5 w# n- p F- i% L) C& D
static void McASPI2SConfigure(void)7 n" Y4 Q6 h9 K7 [
{
2 D' t. ~0 d/ R5 T8 N- }) mMcASPRxReset(SOC_MCASP_0_CTRL_REGS);4 g# v5 L/ O% {! h; G9 s! i, {
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
# o! C/ p) [% k; MMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! h- M+ j# J) Y9 Y. R" k. v
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */& w0 X+ q ^$ | p$ R; m o+ j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 X1 z$ R) _$ o+ l' U* v0 B3 }MCASP_RX_MODE_DMA);* L3 `1 f/ j' s! [) q9 ^# ]( T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 T& [9 E) J' ?( y3 GMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */# [! g1 C+ Y2 A( s
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
V3 [$ w: _; \. x7 `4 ~MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; Y% _2 |( k( V7 x/ J- _
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; ]) Q& j/ v$ l1 ~/ {; DMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
. ]6 ?) O6 \8 j% U9 cMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
m. K6 t+ E2 Q) \McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & |- t. D: Z5 L8 h! G$ m& G
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 U5 l8 o" E. p% _2 P
0x00, 0xFF); /* configure the clock for transmitter */
& o5 k, t' y0 J9 y3 O- i) y3 x" OMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" n# c2 c( _ h4 J; R6 z
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' ~# ?7 Q6 [+ e: k3 H4 gMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 `: U, l& m m; q# }
0x00, 0xFF);
- D; Y$ I. \/ M2 K+ p9 [+ M V2 O3 O9 l& p* M+ k
/* Enable synchronization of RX and TX sections */
, x& i4 `, U$ y# BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
! b; R& E% ?9 \0 T3 ?McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 w1 T3 z& d; wMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /* C0 }8 {0 e7 F3 T- L# J
** Set the serializers, Currently only one serializer is set as" V2 R/ R7 A, M: S' |, [
** transmitter and one serializer as receiver.! q6 y% S( t3 g3 J0 ^; w. C+ _
*/: j0 J0 R$ X. d: w# F: H* V
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; H3 ^. H& a. X
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 M, a' V0 o0 W- a" r** Configure the McASP pins
7 n4 y, x( T! m** Input - Frame Sync, Clock and Serializer Rx
9 K, J W6 p. `' u$ M** Output - Serializer Tx is connected to the input of the codec / E! X6 M% \8 A8 C2 B: ]% r
*/
2 ~4 L, z+ E2 w5 ^) D) [McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* l! V1 R6 ^1 `McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; D1 L) R7 q6 P3 p! q9 P& i3 m
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 b7 J1 n5 k% s7 N| MCASP_PIN_ACLKX) _* \! J6 }# T& x5 W: J% e
| MCASP_PIN_AHCLKX3 a; v+ L0 o# |) k
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */7 w) @5 m( d- E
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " h6 X1 u* |( T( Z. _% u
| MCASP_TX_CLKFAIL
; u/ b8 s/ P. `5 A- P| MCASP_TX_SYNCERROR
, G( G* @+ l. w6 K0 z| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # P/ I0 i/ i* |6 {8 ]
| MCASP_RX_CLKFAIL* D4 M+ F+ ] w6 e( e, h$ [6 X
| MCASP_RX_SYNCERROR 1 t4 a) ?, N% e
| MCASP_RX_OVERRUN);
a: ^% \: z2 f! Q* c, S9 n# R: \" N} static void I2SDataTxRxActivate(void)
1 c+ X5 I) Z- ~. Q{( e: P( T0 n V8 S# B9 a* d
/* Start the clocks */, z0 q W8 v- s1 x
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 _8 q: a4 k( UMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */0 Q; h9 Q9 d2 Y/ _* q3 y9 a) w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ S* W; Q; a& u
EDMA3_TRIG_MODE_EVENT);) |6 _, ~, v1 Q& K, n' ~6 C8 J
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 }% X# p: o. X R ~
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
( i9 A1 R' E+ W/ C! }. gMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, O2 G4 S7 s0 F' AMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */% t( \# @0 L$ {2 D
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
: y- y) P8 S3 u8 v$ {+ jMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! `# M" _2 [( yMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* |/ s, H/ ^2 V( y8 V8 M6 O% v; i}
9 `/ z; r. F* V9 S2 ~请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" r) e( I k, D4 y" B |