|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
% ?3 `( \( m k; e! u: R: \input mcasp_ahclkx,$ r% {, s! t5 F6 l# r% @" j
input mcasp_aclkx,
: F& |3 ]6 G2 _! a5 C. e1 }input axr0,2 j7 k7 v, E( o1 z/ i- V7 [: v; Y
: H6 E N& N8 `: @3 v+ \! N2 E" }output mcasp_afsr,* a( y* G( A; @
output mcasp_ahclkr,
U' j9 r; B8 a+ koutput mcasp_aclkr,
" M+ ] Q( b7 A; {' n N% z. s$ Zoutput axr1,) c* C* O" f% V; D4 z1 e- V
assign mcasp_afsr = mcasp_afsx;2 P( p& B) X4 X T
assign mcasp_aclkr = mcasp_aclkx;6 e; X) p9 v; F* F! l& o& x; Z8 [7 Q5 k, K
assign mcasp_ahclkr = mcasp_ahclkx;
# x7 { C) d/ C( B9 A; h2 r. J3 bassign axr1 = axr0;
" l- M5 H9 _8 ]. p& Y A# ~( Q2 C: Q9 h2 ?7 T# z# A
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' r& P" c9 o9 j4 v
static void McASPI2SConfigure(void)( M1 k8 W! J2 ^# A( r3 a
{" {& w8 a+ p/ M# R h6 c: @" K
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* s: Q8 Q1 ^( A B- IMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. r9 a0 d, {3 d0 b% }0 |! k
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' o' V* f6 C* O' Y8 K
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
$ r7 M5 c3 s- q% n! G5 A& g& UMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 |; C' o) L/ `0 C
MCASP_RX_MODE_DMA);" j: R% c' s* U; [: Q! s6 f1 \
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 W( ]( b+ Y, b# _+ QMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 E* r5 f {: m' V! f- Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " o: C! J6 r" p8 \) J) }% |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* N3 Z4 x! W+ a0 _: U. KMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, O3 {) `4 Z: B9 K7 Z
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- w( V; q) U2 R( A) wMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: W& M' z9 u/ F1 l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; m7 X+ E* v$ a& [: x7 nMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ `! k' F' z4 B8 P2 V g0x00, 0xFF); /* configure the clock for transmitter */7 S) F m0 t- n. S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: I" Y, d1 [; V1 K% }McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
4 q- O2 H0 Q ?. ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# P- f% v& w( }5 c
0x00, 0xFF);! ]" ~6 W* L! H$ G
, s! t/ i. ~+ a/* Enable synchronization of RX and TX sections */ / E6 O% A, |% r2 F- w b
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
% I7 I- ? n% s6 x: `$ YMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 l3 A/ i8 Q& d1 O( nMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
( ]8 C$ e" v6 }' J* _" d** Set the serializers, Currently only one serializer is set as# f" P" |3 W3 b; N! z/ E
** transmitter and one serializer as receiver.
% M' {- `! g9 a*/4 X6 g i) A l: |7 l
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 y* J- A0 u3 KMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
/ o, ]6 ]; n1 Y' B2 z1 l** Configure the McASP pins . d& M6 g1 D9 R. i1 d8 ?
** Input - Frame Sync, Clock and Serializer Rx
/ @' Z( g7 x( M' ]** Output - Serializer Tx is connected to the input of the codec
( ^7 }* A1 J; T6 `*/
( U4 q% S E! M, m; v: e1 k9 {McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); h# e3 `4 d- [& g8 G' t
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 [+ j) l l' N6 ~: ^' e' |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 k: h' M, p S, }2 n4 y+ b| MCASP_PIN_ACLKX
. m. x' A4 p8 f% ]! K* h: B! h| MCASP_PIN_AHCLKX
$ U3 B: V% d# ^: k| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */$ \4 Q4 N% a% ?6 E) O9 d8 m
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. g1 X3 X- B6 ?/ x8 O$ U| MCASP_TX_CLKFAIL
! {7 {* ]: m% c, Z, ]) Y+ ?| MCASP_TX_SYNCERROR
6 x6 b( {* k& F/ s- ?# r# N% ?. {| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 \% H( o) ?2 n' f3 @7 Z
| MCASP_RX_CLKFAIL+ ^) e5 ]) g% A. W, o
| MCASP_RX_SYNCERROR ( j& |+ c6 w0 |' S- a
| MCASP_RX_OVERRUN);6 O' C" o9 p$ Q4 ~- ~1 W
} static void I2SDataTxRxActivate(void)
0 r5 A- u, F# V7 N5 R{3 d' Z- c- g( P3 f. J5 ]
/* Start the clocks */ L9 K: F* K/ E* j8 U& {, ^- D3 }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ A0 S6 G! C# b. F. E. p3 x# jMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */$ F% d4 Q7 z5 l1 k/ M& d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% K+ C8 e2 p# k7 P) t, X2 S$ ~EDMA3_TRIG_MODE_EVENT);
8 X/ Z) D2 V& ]) j( P/ ^. MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : T; T6 h) p. z2 Y4 V) U6 d
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */; B3 u* i. q" J5 j+ E
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ m& o* r5 G' o0 T
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
* l, t# a- T) _' q% C3 mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
5 S" j/ G9 a) \* L9 YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ a0 ^/ |' v! a: Q" S% M, i" g- d/ t
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; g2 P) A" {9 Z2 W; |( g! Y6 |
}
+ c+ V( s; r/ C) u" s g8 ~! @请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. - F" F1 ]6 X$ _7 x' R' b4 n
|