|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 z3 ^0 K( O7 p0 Z$ j4 \input mcasp_ahclkx,
1 ~3 }7 [* c' O( f' w3 y9 U; [' sinput mcasp_aclkx,
, l# J) |& T5 L+ winput axr0,
, R) h: [ N+ ~4 B T
9 t* _( L* G# D% x, y) uoutput mcasp_afsr,9 N2 ~1 P1 Y8 f9 `4 p E- d9 p- H
output mcasp_ahclkr,- H8 W7 o6 r+ u0 V
output mcasp_aclkr,
$ J: X+ B: D0 H2 l/ n7 U7 {1 Moutput axr1,3 J9 H9 n6 d4 l- w6 I
assign mcasp_afsr = mcasp_afsx;. {, ^2 T) k8 M2 H$ X% G. ?# U
assign mcasp_aclkr = mcasp_aclkx;
9 L* Y7 x; z" a+ ]0 N: L& Iassign mcasp_ahclkr = mcasp_ahclkx;( V8 a5 k1 t( M
assign axr1 = axr0; - j8 c2 e" N6 r: y8 M0 H
7 [4 V# i; N$ ]) j: n: D' @9 f& C
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
I3 L9 }3 T4 N/ l# j; J& m Ustatic void McASPI2SConfigure(void)" x7 r j0 Q, C3 v' Z5 ^) {( a
{; n0 A6 S) m' \8 A2 z6 F9 K
McASPRxReset(SOC_MCASP_0_CTRL_REGS);/ T4 {/ g2 w: c
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) O2 g% H: E' q' H" }McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# N7 e+ z: e5 m0 U/ B
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
% R. B' E5 I+ K! e2 d0 k$ V" yMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 e' n% U8 h* ZMCASP_RX_MODE_DMA);
7 _7 A; j- p9 L+ D( TMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 C1 Q" c/ _: b7 K W0 W2 x/ Z1 rMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ |2 R, s+ a% p7 I" l
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 0 z& n* R$ U4 E, p9 n6 _% V
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
9 i- q# y) _- LMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 n/ J" [$ q9 [9 v& f8 A& z( {
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% a8 m. N, C: V7 n# L8 g
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: c# Y1 k0 s0 W6 V6 i; t
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. y$ Z: h8 z/ B1 o2 [, C$ A3 e0 ]McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 |- s6 L8 R# o! \# i, ?0x00, 0xFF); /* configure the clock for transmitter */" @( L# Y2 R; v
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ E1 d3 X8 q' d' U
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
2 Z# r" f0 {& ^; kMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 P2 S: ]% `4 H) `; X) k0 u. _2 d0x00, 0xFF);. W3 P3 C }! |
* G7 I$ V/ K+ e. |: g8 F" T
/* Enable synchronization of RX and TX sections */ 9 V- u4 j+ \2 Y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" ?/ I1 A: ~/ e1 o7 s. I8 p
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; ]& `3 A) f. j, j' QMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
" ^0 X, c- T$ O** Set the serializers, Currently only one serializer is set as9 \. y: L4 k7 ~
** transmitter and one serializer as receiver.3 [5 x; {. s1 a7 I; {
*/: @4 N$ E' l. z0 f/ _5 i; ^4 ?
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. H( v# J+ f: M6 N N4 d
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*+ G/ C" l8 M" Q# Y+ X' Z
** Configure the McASP pins 1 {5 |& l! S) C1 G
** Input - Frame Sync, Clock and Serializer Rx
5 X: S3 U4 ^$ ^** Output - Serializer Tx is connected to the input of the codec
! J, x" K- b% a( w& i7 l" I*/4 r ~6 D1 {! c' Z9 l$ |: |0 A' R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 A3 Q o5 i oMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
) @4 h9 X! @, Y IMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: P$ `- Y& ^/ l5 a
| MCASP_PIN_ACLKX
/ I3 z7 F1 b% x, X% S- d$ x| MCASP_PIN_AHCLKX# r6 e2 |, d d. u( t
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% A- G4 v/ V: d+ MMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! R: ?: G/ _% G| MCASP_TX_CLKFAIL 8 T# Z/ t) j( z0 w1 u1 ~0 S
| MCASP_TX_SYNCERROR
$ H2 e2 Q1 J# S| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( S+ d8 y7 a. W& u. E( @; D| MCASP_RX_CLKFAIL
. D/ N# B- s2 t: J| MCASP_RX_SYNCERROR
6 p+ @/ h; s/ J: L: A7 V& Y3 z| MCASP_RX_OVERRUN);
c* G# _" F2 h a" H} static void I2SDataTxRxActivate(void)3 i9 S0 l z0 h$ h5 `2 d) E5 T+ ]
{& z; [0 p3 F* J- L4 `' W5 [
/* Start the clocks */
! T5 i* p' c& yMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 D, L5 i. }' f& G( a, s) o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! N% A" ^4 v7 l; N5 B7 F; {0 WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' z1 |6 Y2 N5 N5 T" f3 ]EDMA3_TRIG_MODE_EVENT);
6 u* L' @; l, J; i0 b$ r. d4 REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
! s' M5 D) ]: ~3 t+ V& p: vEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
- E% R) k8 J: j* B% B! X5 h2 h0 \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ }; m; c7 T( @1 l, J0 Q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
3 u/ g8 {4 a* B3 t- }' Dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
8 L" t, c! F+ g0 i6 c- `McASPRxEnable(SOC_MCASP_0_CTRL_REGS);" G" h4 E5 @8 F! K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 e7 s7 H* ?: u3 K( C( _7 F6 [
}
[- C! g! a! g9 u. O( ?2 O: C请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 2 _# ^( f8 m" a
|