|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,: A- T$ a% h5 ]- x
input mcasp_ahclkx,( I/ u9 M! K3 _+ e. [! L, |6 o( T
input mcasp_aclkx,% x0 @+ j6 T( E# I
input axr0,
0 ?2 B! Z: r4 [/ @0 a* \' `- a$ F9 i+ J/ O% R( t7 A; ?
output mcasp_afsr,
# K- x1 S: e2 M, X* \, Z J: t; Coutput mcasp_ahclkr,
4 V" N ?1 P$ doutput mcasp_aclkr,
1 I5 z' B6 c' D3 R: R7 Joutput axr1,
% z/ k# O1 y- s assign mcasp_afsr = mcasp_afsx;
. I3 u* K5 x4 o! k, \% Qassign mcasp_aclkr = mcasp_aclkx;% \+ Q2 ~0 I0 r; y; N" n8 S4 H
assign mcasp_ahclkr = mcasp_ahclkx;
( P3 I. G- Q. {! j2 hassign axr1 = axr0; 5 W+ b4 y E9 f4 ~! h) O
1 X6 Q; K0 R1 |' m4 M4 \0 D
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & T4 o+ N" @7 Z; V5 \! b& U+ c+ D# A
static void McASPI2SConfigure(void)8 T$ |9 s T) P; U5 Q
{
9 K" h! U7 P& v+ M: q0 F# lMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
! p% O0 ?- L" u1 J3 j( ?McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- g% ^# }! m; j' C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 k! X3 ?4 e/ @
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */: j" ~! J# L" k! I/ j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
x, S7 z4 Y0 E; ?! z; i5 VMCASP_RX_MODE_DMA);
4 B# B- h |1 ^, d; z. ZMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ o9 N, f- ?6 j8 e
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */( U: s. u, @$ `6 g
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 K6 u- {; R& ~+ {+ tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; y- c8 X* N1 ?# N; B& IMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! U: \$ \5 T/ }9 j. zMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
" t* x P0 g5 B$ A4 BMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 m* Q6 j" @% Q9 |* B4 g7 C$ }7 j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 }* t( A" X0 [9 p; k8 _; _% AMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& c2 M$ M. n; W; ?/ _; N4 h0x00, 0xFF); /* configure the clock for transmitter */1 q2 Z }: `* a; F* A, @/ i
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
6 e2 R2 e' G* D) u' oMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; o0 d! z0 F* M) g* }' c2 B
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 F0 g9 a9 y; R5 p- m" ?
0x00, 0xFF);3 a0 }. ?; U+ b: _/ k. M8 Z2 B+ V
& d$ T. |$ _. h- N/* Enable synchronization of RX and TX sections */
& _. s3 V& r' ~" l0 X) k9 n _9 r- XMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ m) F# V% W0 a, V! e& J
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);7 } C( u' n5 K0 r# [1 [" M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** U$ z9 j: \' N
** Set the serializers, Currently only one serializer is set as: |: y% T" R1 P2 C+ v
** transmitter and one serializer as receiver. d2 [0 L) z; W# l& }$ w% s7 u
*/" d7 ~( [, E& D8 \
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 H+ V7 K/ s& _9 [8 n
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
; N3 B x1 H* G+ u& P4 m$ p** Configure the McASP pins
( t1 e i5 E/ ]9 @! ^( I* i** Input - Frame Sync, Clock and Serializer Rx
; k1 }' U y) M5 q" K. G** Output - Serializer Tx is connected to the input of the codec . C% q& W3 c+ a1 e! f+ |
*/
, ^0 W6 h0 B- p8 D# s$ X/ VMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( |1 @, r, h1 S8 i$ V: K) lMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! D8 B* J/ v r( @8 K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- I$ q2 m, {: B
| MCASP_PIN_ACLKX
( _% {. S8 r! f# o/ O* }) u. H x* x| MCASP_PIN_AHCLKX% {$ N! R* ?7 E% _' ~! ^
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
' C% `" U9 Y! e# KMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & S' L4 A/ X( V1 z) H/ {, T
| MCASP_TX_CLKFAIL
. L4 E: \6 {$ o% Y% g, \2 z| MCASP_TX_SYNCERROR
; x6 g( M; }$ `- f. }8 q| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % @. n9 W8 L* g" `
| MCASP_RX_CLKFAIL
@$ z$ z2 S9 p1 D: A| MCASP_RX_SYNCERROR
, m4 n; ]1 q0 ^: j' s( B| MCASP_RX_OVERRUN);
' ~3 y! T+ d @} static void I2SDataTxRxActivate(void)# a% s* n9 ^" V( w+ T% b
{5 @% W; x* [# N* c& U0 R8 ~
/* Start the clocks */ v8 x* O5 U# h- n$ {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* {& J! ~& [! C6 g0 p2 f3 V% x+ F# a
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */) n7 t/ ?. K3 u* d3 U- i: Z7 L: T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) W% b$ [. V% s) q$ Z# a. ZEDMA3_TRIG_MODE_EVENT);2 K! b' N+ U- S- M0 _$ p' l
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! U, [0 l4 T2 T/ A" @
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
( X3 e I+ H% I9 b4 v, bMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' S6 X$ Y& q" c# w
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */6 `! p7 Q: [0 K. L( ~2 d
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" w M" d1 x6 r+ r _" r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ }, E* V$ r1 ^' n# J
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 a C# Q2 A9 ?* ~, j2 z
} # |- U: r+ _) X* L) K( W
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 E5 i& I- Z+ h% W) L" z |