|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ {, Q0 X1 b1 Y* w
input mcasp_ahclkx,1 b9 f( ~+ e; ?
input mcasp_aclkx,2 H0 a& o9 p* H- ]9 p& o& O
input axr0,
" T# w$ U4 P: f* _ P+ n
- H- T6 h: |$ f( l, ?4 P# Moutput mcasp_afsr,. Q1 w# {9 F- c) O5 D6 ]
output mcasp_ahclkr,
; J/ O! N, m) S/ @( d7 Doutput mcasp_aclkr,1 j9 X8 ]9 f% o* \
output axr1,
( e# ~9 N0 E1 d: ?' x' w assign mcasp_afsr = mcasp_afsx;$ i% k/ A1 Q9 J
assign mcasp_aclkr = mcasp_aclkx;9 g* L2 s) c5 e4 m9 R
assign mcasp_ahclkr = mcasp_ahclkx;5 d& e% [ L1 v" w% A
assign axr1 = axr0;
# k1 ^5 ?/ v+ t- A9 U; ]5 k# Y/ A3 n% S$ x$ o' N9 d
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 `" i% H$ ^9 T) F
static void McASPI2SConfigure(void)
( e0 _0 r# U5 J. d' g1 I5 n{5 ^7 a+ ?5 T5 W
McASPRxReset(SOC_MCASP_0_CTRL_REGS);. r# x6 l! a! g* y/ V: f
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
, O& g5 s/ B' M7 mMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ P: T* q& }! r$ r) \8 q! x
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ H$ y# ]! Q) {( c2 b1 M, I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 E8 D% C6 D7 l
MCASP_RX_MODE_DMA);
4 Y/ r! R3 f$ a, y; hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 W, @% E: `; A* q: Q8 i8 e2 _MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */( o( f) @* H1 e( Y0 Q: {: x3 j
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, : m+ x+ P7 F' m9 C) L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
- d9 k; o4 X6 z; hMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ J# I8 M9 _* u: K: }/ OMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ w8 d4 S" k6 o) g: s) k) A% RMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ _ P% `- |$ yMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" ?9 c q. |$ i* p) pMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 b2 Q( Q7 D7 G( A
0x00, 0xFF); /* configure the clock for transmitter */
- ^0 J$ C2 Q9 Y3 G! o% L: I3 ^McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 e; e' ?8 j8 b- jMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); & c! i; Z! X. I: i: g
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: ~' l; c9 F! Z; W0x00, 0xFF);& D2 X& ~0 b. `: \ _, S8 q& k
! p) B0 L: ?$ U l
/* Enable synchronization of RX and TX sections */ ! V+ V0 {: p9 c
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( m" V8 F. Q4 K1 I n) g3 o
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! {3 h4 S+ t! V# [0 VMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*& c! v. B; ?2 [/ }2 `
** Set the serializers, Currently only one serializer is set as8 N/ T8 t% ?9 s* h6 }5 f, c
** transmitter and one serializer as receiver.
2 u* l# x* b9 ^! V% _9 V- T3 p2 y*/ \6 K+ r# N: q0 z/ p( g
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 ]! a. O) t0 U6 m& H8 D1 ?
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*% ]9 y9 E. s$ C2 C& Q2 S
** Configure the McASP pins
! t* k$ ?' a# z9 g9 Z; i** Input - Frame Sync, Clock and Serializer Rx! v+ T; V$ _& r1 ?" R1 |3 X5 J% ]
** Output - Serializer Tx is connected to the input of the codec
, _) `1 R* G" Z! r/ A+ D+ y. V*/
1 @, j! }# w+ t) {# Q- A6 TMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- M7 h! g8 |! N8 oMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% j, l3 L0 n) U3 q8 x
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% u/ N3 w! X9 J" q( s2 W| MCASP_PIN_ACLKX
' g! p( g. `& Z: ^: Y' r| MCASP_PIN_AHCLKX
! s" F/ Y3 U5 L6 W% O$ T| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
- Z/ n* B4 Y8 I6 t+ Z% h' ?7 u2 xMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % h7 {5 e9 V# \8 ?: i
| MCASP_TX_CLKFAIL $ V z6 A1 p( s" l; P
| MCASP_TX_SYNCERROR
8 r: I8 p, M g7 u! L! ]' w1 A| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - B" |' e+ I/ Y4 E
| MCASP_RX_CLKFAIL
& l" ~# O3 X( ?9 w0 b| MCASP_RX_SYNCERROR : `1 N4 i' M$ ^$ P4 W$ c
| MCASP_RX_OVERRUN);
9 W: T+ b/ @/ F6 y, e} static void I2SDataTxRxActivate(void)0 O' p! A% V! }7 ?* {0 \
{
& Q$ J# J& ]1 a1 E# w0 g/* Start the clocks */
) T% d6 S0 a$ z0 E2 F- W" vMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 U, Z+ V& \ {5 jMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */# P0 t2 O0 o+ `% w! k' y5 h+ o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% f/ B y8 D$ q$ z: B3 X5 y* |+ R! k
EDMA3_TRIG_MODE_EVENT);
$ a) a! O0 S& x+ _7 ~EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, r" N/ s$ K Z( j- t- _6 W
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 ]) Z! h3 g: r! w( b$ l- O
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ h8 K& y1 U6 J) f1 q1 Y0 f
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */$ V! z, L1 M" b3 e
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
; h: o, Z' c/ k( J0 K/ wMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 w2 d% w7 k, z6 g* u- V( L0 M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
0 B6 C6 u: u, T4 N: u; M! G, \" O}
* M6 O: q2 g7 m* T" |: {. O, c8 n请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
f; C; G, L' v" ]" |0 T( n2 K9 ] |