|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( E7 A7 m! {- [) k
input mcasp_ahclkx,
" ~( L9 Y! f6 xinput mcasp_aclkx,/ l- F3 Q9 r2 c$ Q* |
input axr0,7 t! a, O( s' G& _' k
! c: `3 W6 E$ v2 @8 R
output mcasp_afsr,
, m. W/ j+ ^/ o0 O/ _9 E' L$ l6 doutput mcasp_ahclkr, f' `4 @ h/ y3 r d
output mcasp_aclkr,) b3 I# x# y6 l# L2 I" U
output axr1,
- ^* A1 }! X; c7 y! D2 f/ ~$ v assign mcasp_afsr = mcasp_afsx;
4 Y/ F9 Z! N% C( j: G1 s5 [9 @/ `assign mcasp_aclkr = mcasp_aclkx;8 `4 C: P) k9 l( J" @5 n, f; b
assign mcasp_ahclkr = mcasp_ahclkx;
# e# V: I7 g/ j: t2 lassign axr1 = axr0;
$ b: Y' c: t+ r' b+ L7 q
9 M5 Q1 c7 L0 H" n$ `在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
0 L8 m0 L+ |; q7 D$ Z* n' cstatic void McASPI2SConfigure(void)
- i- o9 c# L9 n+ J. t{
) B R4 o- S6 iMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
, E8 y6 L9 z1 ^, c zMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */3 D5 X9 T( i3 R2 J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: I* J& q( J! L# b f; F
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
, S5 x% S9 V/ ?/ X! I( oMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 M, O8 k) p) N& O/ Z, x
MCASP_RX_MODE_DMA);
/ [0 A! c- M$ t/ v) kMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. U! d* C' y7 sMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ Q6 O9 q: i% H/ I( f) _7 I1 j
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " i1 V! P6 B# H- a$ e& ?
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ C/ F! _$ v, `McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, , z# \& @" D5 A' O
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */7 A3 H' _. M7 l2 P y1 n8 }$ p+ @
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 p, p* t( i1 d/ g
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) c9 l' l0 L- J& N
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* `# l0 t7 `" Z$ D# G
0x00, 0xFF); /* configure the clock for transmitter */4 @0 E0 ~+ J, o8 H d- L6 K/ D7 V
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
7 p& L( o8 ~! T- d4 IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( s" K& Y$ J6 }1 xMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 ?" U. ]7 ^. ]5 m0x00, 0xFF);
# M4 p w7 Q. O$ M7 g
- p4 @) M$ H4 t/ A: ^( \! C/* Enable synchronization of RX and TX sections */ ' Y8 E! t3 b& b3 n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 b% O% r# N- O- oMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# U, a m" h" [1 N' AMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
- b& E9 f4 f6 F6 t5 h: q* e** Set the serializers, Currently only one serializer is set as
% ]( I- A( {# B: ?2 V! V/ J** transmitter and one serializer as receiver.6 `( Y- q+ d; M7 R6 J$ i# y6 C
*/
6 X& Y4 w( i5 @! `McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ j: G. ]7 O" H3 \1 T. [# h( \6 |McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 i; s& S- x- b** Configure the McASP pins - ?( z3 L0 G& l) U; \$ B
** Input - Frame Sync, Clock and Serializer Rx5 a: ` ] T$ |* s0 C* }2 R# ~
** Output - Serializer Tx is connected to the input of the codec
7 @: Z$ a( c: g; f% P7 K*/
9 `7 X/ i. `" v) {McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- a$ U7 g9 T9 j. b3 RMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" F8 x1 G5 D! _3 ^0 x! p+ h
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX0 h: p# @5 }( U( T$ y7 p# S$ \
| MCASP_PIN_ACLKX
/ A' ^0 `8 i6 f$ A2 || MCASP_PIN_AHCLKX% k; x6 R- {1 j& M
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
4 s2 b4 p- b0 c. R0 e* GMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 j7 @+ F! |* Z' N$ b| MCASP_TX_CLKFAIL ! n- \! H( e* @! z* R
| MCASP_TX_SYNCERROR
( v. z; t- @- ?| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
2 y8 T) M( T- K| MCASP_RX_CLKFAIL/ c$ {9 k9 s8 @
| MCASP_RX_SYNCERROR 3 m; Y' f1 [( _7 P3 v
| MCASP_RX_OVERRUN);
2 o) z. V* Z6 S2 G( M" P} static void I2SDataTxRxActivate(void)
5 S& B! r% c. W8 E) A{
s/ J2 F8 {. s Q! c/ n% q, g9 [/* Start the clocks */
. b- q0 |+ d* o5 p& TMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 x4 A5 H, B, x% a1 D
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 K" z* E* A2 B; L* a9 i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! S2 R+ c! ]7 i
EDMA3_TRIG_MODE_EVENT);' Y% x, e6 k; f0 t4 {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% G G4 I4 I+ ~ J" vEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */5 O! Y: j% D2 `6 c+ C3 i& U o6 n
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 X n& y' ]9 b, K$ f
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ v: H* G4 K1 ]$ Uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, k7 D& m' k* cMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ o; F! H) h0 D, I
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' b$ _+ H' ~9 R# ~- I: w: v
} $ ~. j& o# w8 h. P3 x1 ?% E1 I
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 l' l, Q2 N. E% p/ t |