|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
( p A7 p' u1 J! n' Binput mcasp_ahclkx,
. \6 z- `$ q+ [) }/ T( J( Tinput mcasp_aclkx,: k! j$ I) n5 D2 i. v! x; m
input axr0,; K/ S$ z) h7 Z! L: z
% |3 E& B) `0 D! r, d
output mcasp_afsr,
. U* |, N. Y6 J2 v# Aoutput mcasp_ahclkr,
/ v8 q4 x: { R# `0 o* f5 Moutput mcasp_aclkr,
1 b6 N2 j9 L! E9 I2 woutput axr1,
; C" \$ o0 y& m$ d( L' [ assign mcasp_afsr = mcasp_afsx;
& c6 x, Y! i, r' j7 y, Rassign mcasp_aclkr = mcasp_aclkx;1 L) Y0 K: {7 f
assign mcasp_ahclkr = mcasp_ahclkx;
g2 C' _ ~' |9 z% Vassign axr1 = axr0; 6 O% ]9 |# x ]6 H
; e2 d! I8 U6 l2 O在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 - L) N9 {/ o# A" q/ S3 a2 C" s
static void McASPI2SConfigure(void)
- L0 g% C1 i# q+ N{+ u# ?0 i- g- D
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 |- |7 C: N2 @* s/ yMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
" T1 k* x( ~- }. m4 a% EMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! F" E4 _ L |/ R% n. \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
5 M0 I; [+ y/ ~6 a7 o& tMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% z( I: v, u3 O6 YMCASP_RX_MODE_DMA);4 G. h& y# ^8 ]! ]
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 A7 H3 b" b1 H* T0 J) eMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ S: w3 [* V1 m( @McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " ?" r0 C' u+ O# q4 A
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ @1 Z: z0 e+ Q- M3 n
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; z1 w0 b& v( y$ n
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver *// C4 d7 k: _) n( P! U5 G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, |# ]$ q. q6 X! WMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
9 Y& S8 F. v4 YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 H9 ?- S$ r0 A# R2 Q. {7 H0x00, 0xFF); /* configure the clock for transmitter */- Y0 q& R. p& D/ N% J: ~% M
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% R& s, v3 E+ U& _, B1 jMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / {. l9 o1 d) @( [$ ?: Y3 q) ^: U
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 }+ V, r6 _+ T$ j2 R3 r0x00, 0xFF);
* \+ `, f2 O: |$ ^5 |2 U/ T# m. c9 a. s( I( ~( q
/* Enable synchronization of RX and TX sections */ 8 n5 u! `1 |3 g. w- f
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ A2 c3 R0 N! _; G
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# r5 Z2 E" a# o5 O3 GMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) ^ F1 H$ H0 r" A8 r
** Set the serializers, Currently only one serializer is set as) O# [' c- ^* M9 r
** transmitter and one serializer as receiver.
) Q% ]6 B2 ~& j5 Y4 Q2 L*/
; f1 o0 @- M; x* K0 kMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 p1 x5 T0 X4 n6 @5 i: H) |$ R
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*5 ~& W9 _+ k* H; k6 Y/ \
** Configure the McASP pins
) q: s" k! e0 ^' m& s* q** Input - Frame Sync, Clock and Serializer Rx- O3 N0 s1 m0 ^, G
** Output - Serializer Tx is connected to the input of the codec 1 N8 h1 u; F" U1 E( {2 T& h8 _* {
*/
+ c3 f% x& S+ @$ o( |- g( j. GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) G a8 {, ^( \8 P/ v! F0 X
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 c! ^. {% Q r
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! M8 E' E3 A3 t# b4 ~" E1 P| MCASP_PIN_ACLKX
T& J: @' ? w2 V! l1 r" A| MCASP_PIN_AHCLKX
U! i) J/ g+ v: n8 A| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */. M* `4 o8 A; ]( l" i
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- V9 b$ w" \4 p5 u! f| MCASP_TX_CLKFAIL
* d3 A" ~5 ^- d5 S8 ~* \ q4 G. `| MCASP_TX_SYNCERROR9 f9 G. n9 g* f
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! M2 K3 ~! C( @0 ?- t5 V' d8 F' f% W| MCASP_RX_CLKFAIL
0 j& W- I6 H6 O2 f$ T' j, a0 C| MCASP_RX_SYNCERROR
! F1 `8 _. Y0 c| MCASP_RX_OVERRUN);, R" B9 U) ^3 _! m
} static void I2SDataTxRxActivate(void)
2 p! L* g6 O: \4 v+ `1 u{! @3 p, i& ?$ E' q4 J/ j+ T2 w% l
/* Start the clocks */
( P M5 Z! z. @" q: QMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) V H4 A! s% t" o f& `) V
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */ P2 I0 Q* M: c$ s& x. m) k9 N5 f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ q0 [$ n! ]( u b' O4 q% `
EDMA3_TRIG_MODE_EVENT);
# I' X( B8 i' I' }* BEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 @7 G/ R4 ?9 h8 `EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */# K4 \$ N. V o0 u8 Y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);; H6 m( L& B; z0 r
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ D( g! m' I( I. e" U( Zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */5 ], N" F8 s* J$ O+ r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 J9 H+ d. u; ^6 I! t
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 P. Q o4 ~" a! x, G: K
}
; l' s: w: F* `' K: h. O4 u/ D. E7 `请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 R8 o5 M5 ~% Y' z9 V% S& k |