|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,2 k+ {& e* U' C' ~
input mcasp_ahclkx,$ h& T3 f: e5 D0 D/ F' R3 d) r2 x
input mcasp_aclkx,/ m: i& W4 t h% F# @; r. h
input axr0,4 d% W7 Y3 a: v L! L" M
. ~( I* Y! v" }8 e
output mcasp_afsr,0 e5 G" f5 S, n5 R# x4 t/ @1 r
output mcasp_ahclkr,7 _$ O3 w2 q4 t2 ?3 j$ W4 m
output mcasp_aclkr,9 x3 Y1 r% ~1 L4 c
output axr1,
- F+ v) i: Q0 \. g& q1 Q- ` assign mcasp_afsr = mcasp_afsx;& P4 z5 S5 M6 q' |
assign mcasp_aclkr = mcasp_aclkx;6 |+ W2 l+ c0 z- ^: x
assign mcasp_ahclkr = mcasp_ahclkx;
& C: U- a" |" Sassign axr1 = axr0; 8 W v6 T4 Q; ~, U+ E
% z/ ?$ W( a" Q9 Q, _% ~* q在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ( R7 w6 N Z. c- F3 G+ s- P) Z
static void McASPI2SConfigure(void)( I" A N- v; I- x! n% G
{
5 ~9 s) n# Y% u$ K8 }7 ~3 YMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 m. r/ U. T/ T: c: FMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- j- P3 [9 V, k% A7 V6 L2 N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* a9 X" b7 n) b$ x4 S" V7 w- P
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */; S; ^1 M3 b. z& D( r
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 |0 o( e" M# E) ^9 RMCASP_RX_MODE_DMA);
: [" n- L, [1 ?$ G: W7 aMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 }; L4 L) \4 \! e& PMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */6 f. f* J" [' b! J& E, _" o+ Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' ^8 ?3 ~5 u, \& R2 J4 E" dMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 P) x5 G) x1 D- M% hMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& _+ W# h j8 rMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, E0 U$ f; S1 ]1 @0 R( A; n
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" T% x) Y, R" U5 k* p( v5 L6 [McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - ?. j9 [5 \; |
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: {# V7 k$ I0 O. c; n0x00, 0xFF); /* configure the clock for transmitter */
7 K1 Z. _8 g; l' T# B, b! ^McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 m: o7 R5 M' m9 `McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + G5 D Y4 F# _' J) Y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; }, Z1 E* ?8 @0x00, 0xFF);
& a+ F1 w% k F; |- m O( C
1 o9 `6 u3 s9 a4 d/* Enable synchronization of RX and TX sections */
0 |) F, c+ \3 ^7 J3 a/ i3 O. KMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 d2 s0 s# t6 F% I7 p* x5 e( H8 ^
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 j J0 i0 |# @& G; eMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** X/ c7 k4 v6 x& d. u7 ^) L
** Set the serializers, Currently only one serializer is set as- a% ~2 Q1 R: N8 a- P W
** transmitter and one serializer as receiver.
& l) }- ]- `& k4 _# q*/8 n% Z+ |4 N G' b
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);4 [9 V! W; g; \4 Q8 p, [. K
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*% y9 w7 U6 z0 \ A( J& G
** Configure the McASP pins
% C6 X; ]9 h* u3 V3 g* Y% T7 O( ]** Input - Frame Sync, Clock and Serializer Rx0 }/ V1 z; k* @7 b f0 _
** Output - Serializer Tx is connected to the input of the codec
) Y' Y. O. p! R; l# w*/
7 `0 V1 P1 r7 R$ _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);# Q M% E [! Y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ a& _; s: P; h6 h
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 u6 G0 T e) x
| MCASP_PIN_ACLKX
- D9 X& U0 @( L4 j2 }/ U) ^1 E. u| MCASP_PIN_AHCLKX O% F. M& Y! p5 R0 X% h2 `
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */7 G. }" Q3 J8 z* A0 ?+ l
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / F! J, N* `" M8 Q
| MCASP_TX_CLKFAIL % `, K+ }0 M% v, u% f, r0 Z* C
| MCASP_TX_SYNCERROR N0 g) u" }) z& V, U' x/ d1 y
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 0 W: W+ J" q' ^) ~
| MCASP_RX_CLKFAIL
! ^ j6 f1 w$ M! F! h| MCASP_RX_SYNCERROR
; w- r6 Z% b/ n6 y1 e, W| MCASP_RX_OVERRUN);. j% v% o. o1 {: r
} static void I2SDataTxRxActivate(void)
/ f e6 O$ K: ~{
. o( O# [2 A0 ?8 D) n/* Start the clocks */2 I& J' }9 y; n. ?7 ~6 T6 O: u
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: l9 c# B8 \4 ?$ ^8 F ^McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// Z8 b4 \) }5 T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
. h. y$ ]3 v9 N: c& a. U; D/ UEDMA3_TRIG_MODE_EVENT);+ B. v7 e5 ~8 e6 [9 R$ l: X% q' b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / J0 E: r2 ^) P# l. p3 r& u" Z( g
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
9 p5 Y) B9 [5 _McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 y7 m1 u# _, n* Y7 ^
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */* F' j! f0 M, V0 J7 B5 M3 W
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
" ~# Z+ b1 D- k O, |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( l4 Q# N1 y# {; g/ J3 f3 m( qMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 ~5 s8 s& c- `5 @- {/ e4 `. | o
}
: G: U% i f8 r) \* ^/ D9 T- G请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 X$ S8 S @0 O, {& e$ M& f! O
|