|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,2 j* q5 L$ j( K& Z
input mcasp_ahclkx,
+ [, Y* \1 R. ^! winput mcasp_aclkx,. ~- M% ?/ \/ F2 u# Y2 s, g
input axr0,/ B" m2 g0 q; F. ^
% }! k5 C" l7 k3 T I. z' W# doutput mcasp_afsr,
& u/ m- s1 Q ^, Youtput mcasp_ahclkr,5 A: d) P k7 B3 l* @8 _5 q6 x" G
output mcasp_aclkr,+ W y& U" D1 ?& A+ ^
output axr1,
7 {0 d% e9 `( D8 L3 v assign mcasp_afsr = mcasp_afsx;$ R d: S( ]5 o* \% d( \
assign mcasp_aclkr = mcasp_aclkx;# W, q/ h7 B P4 z% n) J$ n; X* X
assign mcasp_ahclkr = mcasp_ahclkx;
( N, b( c# V% f5 Aassign axr1 = axr0;
( ~7 F! K5 I2 C) ^. l: ]# u- u3 O! @3 {% k; k8 q- O1 q7 i
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' e0 H- y2 ~3 [" {! X8 @) L
static void McASPI2SConfigure(void)
. ?7 C( F: B8 @) [2 N3 w8 |) Y1 T{
8 h$ G) I K5 _& S6 L, YMcASPRxReset(SOC_MCASP_0_CTRL_REGS);5 H2 o' ^ @6 M7 h" P$ g
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
4 A O" \+ I. {8 `7 |McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! g# t3 Z) W5 }; o) d8 cMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
) p( U- W" e1 X# d) E9 M5 A4 mMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 o* C+ J4 r1 {! ~" E& s9 s
MCASP_RX_MODE_DMA);% [2 e) Z$ j' E: i- c- k3 S
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 {) h) p* h9 a7 T+ O3 _. ^: _* ]MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
( u+ b0 ?0 [) [McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ S7 }4 a0 W [8 o3 T. {, `0 JMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 A6 p9 w8 K7 }; N# r+ }McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + @1 @/ n6 q. Q5 ?
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver *// |5 s+ i! O: i- g2 ~3 ?; t
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 \- |; ]0 U7 G, t
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& E" ?7 v3 ?; D# L0 `: aMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ ?. L0 Y0 ^: n" N% x" P
0x00, 0xFF); /* configure the clock for transmitter */
/ f; U) Z7 }* Z# R/ I0 j zMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ k/ ^) [* u% s7 @& p( ]' l
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% C# v6 d/ {' I% D. CMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, A8 B) O$ u4 s N+ d# q6 L" ?+ f4 E0x00, 0xFF);
) e8 I4 h' {: P/ F' M* X( b3 ]8 s7 T" G
/* Enable synchronization of RX and TX sections */ . w4 g# V# U0 T7 o
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 U% X; r( Z+ y9 y- e3 FMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; K4 B8 @6 K" I9 @
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
q/ Z; X1 v$ I# B** Set the serializers, Currently only one serializer is set as8 c/ J+ e1 O; ?1 |# [
** transmitter and one serializer as receiver.
8 X0 s# v6 `" `1 D+ y# i- t- [*/0 h- V; \/ m# N. ]
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& O: e; F. J4 |6 Q0 BMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** q4 T# d' A# U3 s( q; v! i% R: W
** Configure the McASP pins
5 ]. ^; L0 h0 z** Input - Frame Sync, Clock and Serializer Rx3 d% C$ I; n4 r' Y# _
** Output - Serializer Tx is connected to the input of the codec
% e' }# ` g; L. B) A3 J* ]4 _*/5 O* F5 `" |% [+ i5 Y+ ?. k
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);# C4 C- Q2 `: Y$ \+ ~
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' [% ]) _* t" M) y' X) l3 H% B8 S
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 p& |1 A" A! P
| MCASP_PIN_ACLKX
9 f2 m; F( c4 E" i1 E( r7 B+ i7 A| MCASP_PIN_AHCLKX
% K# l5 J/ p7 R& ~) h/ [| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */6 k/ d# b4 F1 p/ r$ g3 R3 @
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 r& r, |# ^) z: F+ M# \7 O+ _$ {
| MCASP_TX_CLKFAIL
" r- g. q: b, X# o+ k, C: y& X# d| MCASP_TX_SYNCERROR/ n$ W! u0 S; x1 c- B/ Q
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 Z/ D! O* W- X* v$ w| MCASP_RX_CLKFAIL3 G+ ?' w; V( q6 U& u
| MCASP_RX_SYNCERROR
2 f* r1 K2 D& a3 J| MCASP_RX_OVERRUN);
: q; c0 q, E% q A5 D( A} static void I2SDataTxRxActivate(void)
' h5 x2 G! V# \2 x0 B( i0 u7 ]/ `( Y{
. ?& o" S# ~# h$ E% R5 D2 q/* Start the clocks */* f% {6 C* V* Q/ H( A% L2 \0 W
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* Z8 `8 T& Y0 HMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */% r( T8 s% j: W3 V S9 t7 Y: N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 l' z! S Q5 sEDMA3_TRIG_MODE_EVENT);: O* {! U3 f( _) S: Q& j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 | l: |; u0 ?/ u8 K1 h+ r
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
7 a! } e3 g H% qMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ I# @- V H1 o& _# j8 C) s8 b+ H. e8 nMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
* `$ p" U. ~7 L$ t$ T$ q, S" L- h2 owhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */9 `- ]6 d( S! N# B# {
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 O2 F% |9 D9 ^- S7 V, s* |( x
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( y' o+ i" @* Z}
& W1 t! S7 A2 j& x3 y- P6 e' n请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. # Z, J& U% R# g0 A; J
|