|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,' u; T) S) `0 Q. |5 H8 S; Q9 `' }
input mcasp_ahclkx,$ b; T. I% d4 T# F% K3 _* @
input mcasp_aclkx,
- _) u$ R& o9 V0 O9 Dinput axr0,
0 [, o0 A0 u" S/ w7 N0 j, o0 @# m6 c* M5 i2 U' Y3 M* l, S5 B
output mcasp_afsr,( ]. k) W7 |" R$ J/ [9 G* P
output mcasp_ahclkr,; M, U M$ W6 ]/ ~
output mcasp_aclkr,; j! a+ i* z6 ?8 |% f4 e
output axr1,
; \9 Q& Y. Y3 q4 c assign mcasp_afsr = mcasp_afsx;
9 I* s* F& |6 ^7 A" E5 t& Yassign mcasp_aclkr = mcasp_aclkx;" p- q5 [: u* _1 {
assign mcasp_ahclkr = mcasp_ahclkx;3 k( F+ k% C6 D7 F. v& v/ v
assign axr1 = axr0; ; |* H W- Y! G5 m0 q6 H
' F. ^; Q# F. d; @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
1 E3 N- D; ]& ~& X, mstatic void McASPI2SConfigure(void)
5 d) s0 y9 R3 L+ F5 n8 ~{( D+ M* e" | m& Y
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 B }4 B; F( ^+ EMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 s+ n; a: M. U; m9 }" e! F8 \McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ R3 s1 l. j5 _9 W$ x
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */" {' o5 s8 V0 g! Q: r( x N, h* I5 S
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, `' M. B2 ?4 K1 d
MCASP_RX_MODE_DMA);# p: K' c8 @0 ]! F8 @, x6 I8 W6 c
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% g" |" n/ \. K t2 I# IMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 r3 ~- u1 w8 U9 m% D! lMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ G# c; ~0 }& I$ t3 HMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); m/ a; T# x& g2 q6 C, y5 l. D
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . X8 O( p; B, s+ Z' l
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */7 b/ @+ {: I* K2 S* M- q+ ^8 ^
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' |( C& x, [. p6 ~) @1 e7 i oMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); / Z: Q* q0 g1 S# |. ^) T$ B# k
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ |5 i* d3 u6 j3 J6 _1 P7 L0x00, 0xFF); /* configure the clock for transmitter */0 \: N- m* D9 b
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( W# n0 [! ]8 P7 M/ DMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) [. r6 s$ z/ w: o# a1 P5 G2 I
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 f! }4 ?& ~0 k9 x, k+ ?
0x00, 0xFF);! S. z Z$ X, j. l- c5 B
: P' J0 _. m7 N. A/* Enable synchronization of RX and TX sections */
# F; V7 _5 m' |+ {4 p0 UMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */0 y/ M, b4 z4 t" `" s. Z# ~
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) k4 j1 N* o( b3 ~! N# JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
, u7 a: i# M6 \% I1 G5 X1 W. t** Set the serializers, Currently only one serializer is set as( T5 v/ o- I7 l' |! a' E
** transmitter and one serializer as receiver.$ I! S9 g* u# C* q
*/
2 _7 a2 e& ?& o1 |4 R7 `/ ~McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 I. c4 S- W* EMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
3 |: n! B9 H( f$ ?# V& W& P, s** Configure the McASP pins 1 u. t- F' p: k6 p8 W7 F6 y
** Input - Frame Sync, Clock and Serializer Rx
2 L+ b* e8 C) Q0 T/ ~) F* ~/ B** Output - Serializer Tx is connected to the input of the codec 2 O* O; M) ^' G
*/5 y0 ^2 ^8 W+ @6 h D
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 V% p4 W- a7 p) Z% ?/ d2 h
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; _% ^7 m, Y- M1 r8 u) R/ U# XMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 R- ~6 f" x" D* p+ F; t| MCASP_PIN_ACLKX
) e! O% O. @7 Z% a" K, `| MCASP_PIN_AHCLKX4 V) | h9 C4 b8 F" K
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */9 [& ^5 ?1 ]$ [ `% r8 G" k! y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 F1 U+ R2 @1 ?3 l1 j& }4 H
| MCASP_TX_CLKFAIL
- N7 m( s: s: b. k$ I8 @7 z| MCASP_TX_SYNCERROR2 k+ B+ `, M# _' ]! ]
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " `- s# n! A- s8 X& b* E' F
| MCASP_RX_CLKFAIL
3 ?; C! Y+ V2 T2 `2 n" P- f| MCASP_RX_SYNCERROR
6 G9 F2 d8 H% m% d4 || MCASP_RX_OVERRUN);& O2 r) X5 ~4 p2 {, L! K4 _: t- E
} static void I2SDataTxRxActivate(void)' {& E* ^. u2 U- p5 ~
{
' t6 t- ` a+ w0 G' e4 t, ~' V/* Start the clocks */8 s2 Y$ B5 }* J, D
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 Q: B) N, q. v! Y5 C
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! \: |% r# R A* T) {% V! uEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* ]# J7 i: l& |3 C+ |/ O, lEDMA3_TRIG_MODE_EVENT);
3 Z& R* M1 ]* | T% Q5 IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' J5 j7 V: B2 T" z: O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; j7 T" k" k6 `/ `) YMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);: n$ f3 c+ M8 {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& j, d5 r8 n% Y% O7 ~& u' n
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
; R' h1 O! |( s/ s7 L6 h4 t+ k$ GMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);) N! j& y9 {/ |3 U& U, }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ s& B) ]/ J" s* t+ F! G7 L7 ?}
7 N D# D5 q9 u7 m! ]请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 7 T* I/ P( Z6 h/ k! y
|