|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ `. {4 ]6 U$ w: U1 ^9 x! E
input mcasp_ahclkx,* @3 l3 x! H0 U/ S4 f( ~, a! C
input mcasp_aclkx,) N4 y7 b1 ]9 K2 O- G, @
input axr0,7 \; m# t! u+ J& G& ]% D( L
2 h) f! k1 z( y" I) j5 e) o) }& Y
output mcasp_afsr,
1 x( U6 l- G. A6 f+ toutput mcasp_ahclkr,; b4 W) A: U8 u/ s7 z# S' Z f* Z
output mcasp_aclkr,. J; J4 I. X* r$ Z
output axr1,8 g$ a9 }7 F, j0 D+ N
assign mcasp_afsr = mcasp_afsx;7 [$ a' C0 ` g1 u1 ~0 M
assign mcasp_aclkr = mcasp_aclkx;
k. l/ j/ Q( H8 R6 a% E2 R* uassign mcasp_ahclkr = mcasp_ahclkx;
8 O3 s; ~7 m+ n; [; ]( vassign axr1 = axr0; & R, f$ u7 s$ K! f+ W# |; B
5 f! Y n. n+ x8 \/ Y% U: j, o
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 B. ?: Y6 |7 V0 I* M
static void McASPI2SConfigure(void)
# [7 s z7 z, {0 K{& ^4 H+ t: f8 i% d- |+ i0 t3 Z. c
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! b- I# j8 p" L
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
|- ?2 @! F0 ]0 k# l: S' OMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 L/ }: u y7 S6 B& p
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
0 J9 F D, S2 ^+ A( NMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 [) q+ F; Z4 m5 s5 s% s& dMCASP_RX_MODE_DMA);
: t# o4 W% n" P$ Y& \4 ~McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ `% G0 i9 A: J5 r- }$ ?
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 o! k4 d3 ~+ L& z2 ]& D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + {! p$ [7 ]3 ?+ E
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( Y C( j1 r4 V) s+ J
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ' t% d# J2 J8 P& v
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- `( i, }. t6 h7 x0 T5 CMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! s3 `3 _, H* }/ @5 m, JMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); / N) N3 B. d% J0 r
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 F# U% @' q# J$ P8 c
0x00, 0xFF); /* configure the clock for transmitter */* k! E& H' X, E% Q8 N0 c" g
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);% u7 `8 \5 S. @4 p: u
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 n& n3 Z- h& i6 D# C x' P7 A
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. B# ]! Q/ F6 E( x7 d7 d1 @% R0x00, 0xFF);. \8 t5 X5 u% {' f! l9 K9 a! X
3 M. K) Z! b d% A0 I/* Enable synchronization of RX and TX sections */
& \' F4 N5 Y$ p* l# XMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 [$ j$ q# J! FMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" S! p$ P- j1 A5 U& fMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
. \( f( |2 ?# g: D1 Y** Set the serializers, Currently only one serializer is set as
- J" Q: n$ X% l, b; Y** transmitter and one serializer as receiver.7 k& y) B8 p( L5 Y% u2 V2 ?: Z( y
*/$ N6 A* e( B/ s9 y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 G( S9 E, D1 @1 [4 p9 Q) ]9 F$ k) ~McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
% v3 S# h4 f& o7 X** Configure the McASP pins
+ s |' [: H" U. ]** Input - Frame Sync, Clock and Serializer Rx; X' X" ?8 q+ V0 k
** Output - Serializer Tx is connected to the input of the codec ) L' y9 R* ^& m* h- w, q
*/2 I+ B9 ^7 R* m+ P% R) o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. [4 {7 q) i6 `$ H8 P
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* }5 }* {7 H# h3 u' d0 fMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 p$ u! K; D+ D2 {| MCASP_PIN_ACLKX
4 A7 E/ r. Q' ~, Q| MCASP_PIN_AHCLKX6 ^$ v& A. A$ x( T
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */1 g) T" u0 ]& O) Z# n% J7 e
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' ~7 B, t; P6 P8 X8 n/ ]- _| MCASP_TX_CLKFAIL
M$ \/ v6 {7 {! ^- M: Q| MCASP_TX_SYNCERROR6 ~, V7 r. u) T; h2 M
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' O# I3 \4 |0 |+ W
| MCASP_RX_CLKFAIL
/ H6 G" j0 u- y5 a& O| MCASP_RX_SYNCERROR 7 C* ?! Z, j: z( c+ \
| MCASP_RX_OVERRUN);
- [4 ]4 s& j6 \( @/ s M, k! r} static void I2SDataTxRxActivate(void)# g6 |; l- F: ^8 E9 A
{$ W/ F! \$ F* O2 u) O
/* Start the clocks */
* Q1 z2 l" @: x/ ^, O8 q9 |& H1 i7 WMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 w+ A: T% |! H7 iMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */& z# l8 v' M# C& k
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
G R2 q0 J( y/ @& a3 ~8 j- V, QEDMA3_TRIG_MODE_EVENT);
) @3 T, w# G' G6 n* LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ q/ S5 w& I. \- m hEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */- q) Z' k8 J5 y7 g$ N. Y: I
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 c5 k$ k6 G( k: c. g5 iMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& B* Z: ]3 P; ]
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */+ F& u9 L1 V% M! J$ A
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) f& K' Q* c/ {: h; UMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: `2 N/ R( Q( j4 o. _} 8 Q7 [' k* i+ m
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% }# L5 C) R g2 Y1 } |