|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," q* G/ u7 z- |* I8 R, ]
input mcasp_ahclkx,) x% S) T5 w9 e! Y1 ], X6 G
input mcasp_aclkx,* }1 \) a& s+ f
input axr0,
' G6 T; o d* r0 r! c6 g, z( R5 n. A2 P4 Y1 F9 C
output mcasp_afsr,8 L& k0 m I" X# T
output mcasp_ahclkr, C0 @/ E! K* n5 }, M: P( k" D0 j
output mcasp_aclkr,9 A6 `/ B' x/ x1 _; Y# p, z
output axr1,
' j7 G- m1 v, x0 H. I: s assign mcasp_afsr = mcasp_afsx;; r6 j# U7 ~" Z0 Y: v! v: T2 R
assign mcasp_aclkr = mcasp_aclkx;
4 C5 _. H, ~* G) a8 xassign mcasp_ahclkr = mcasp_ahclkx;
6 d; e* ~( h% n& D- p+ @( V$ _$ Dassign axr1 = axr0; 5 M# Q* y: v1 W% x. Z# n% E
' X4 k& A+ W+ J! `
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) l0 J2 r h% |3 o2 x5 d. P% P
static void McASPI2SConfigure(void)
3 g/ R5 Q2 E; r4 \, \{
' ^ t( T6 S: j, Y1 ~7 sMcASPRxReset(SOC_MCASP_0_CTRL_REGS);9 d- J4 C i+ [# l! v' e. h
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 X. V7 T2 @' e% ]8 ~2 U) t1 X# P. ]McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& j& N8 |& f$ D0 N: {' q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- p5 j9 Q% h @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: ^/ b: _" I5 \- \; P+ h
MCASP_RX_MODE_DMA);) h6 f5 h$ O3 [5 E* b
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ Y; I! N) G4 S+ A+ D0 l6 D8 J" |MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */4 i" U5 n3 M8 x! V" ^. d
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' U k/ v8 N" {. aMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 m, a( L0 a7 ] ]6 i+ [McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ N f% h, C/ u) m [MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
8 c! U; _4 ?6 n0 R iMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" q9 K; `6 @) j( r, b' UMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 t7 h; g; O( n1 H0 w( ]- r
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; i: O% r& d2 z; n+ V" m
0x00, 0xFF); /* configure the clock for transmitter */
) D5 M* N2 G/ f4 w" p0 qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; v2 ~$ D. c/ b
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 I+ L2 D% n# B" F9 A" V9 e: dMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! {( n `6 ? G; G0x00, 0xFF);
) G' L! W1 e4 J) P4 g3 M
- j- H# N( Q5 H+ _0 Y* s7 b/* Enable synchronization of RX and TX sections */
: i* E; g2 R4 H# y2 m7 Q: t$ E4 H! E# BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
# g) m r0 o% X& g0 gMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* L h- w/ y! q W+ V2 B
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 i8 a( r0 z. i" N( A5 I& l1 n5 P* D** Set the serializers, Currently only one serializer is set as
8 ]- N. f4 d4 E/ _6 {/ d2 i, }; q** transmitter and one serializer as receiver.
% r$ m7 N9 {0 u" X+ q$ \*/
1 c* d- i# |: C; u5 E E3 mMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 |0 f5 A" B- h) A' h2 pMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*- F% r0 b+ D' }" q
** Configure the McASP pins 6 F4 U5 q6 q8 M4 w. ^' v
** Input - Frame Sync, Clock and Serializer Rx2 p- B$ A' ^ W$ q# w
** Output - Serializer Tx is connected to the input of the codec - ]. L+ L" L N! Z
*/
z M( U J. |0 ^. F) X: XMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 P$ J7 _9 G4 r, ~9 `1 }McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ Y1 w' a1 j/ x( |* ?, F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX I E% d( Q6 B- J7 e
| MCASP_PIN_ACLKX
6 H; H- C$ [4 G| MCASP_PIN_AHCLKX
( j* x$ a3 Z8 y& t| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 t- y2 n- V* ~2 sMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR : `/ Y1 o( T4 e
| MCASP_TX_CLKFAIL
0 v" n# ^' [2 w$ D, e2 [1 S| MCASP_TX_SYNCERROR
- y+ x6 s- `8 F4 Y5 C, I1 l| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. N$ w8 S! o. |4 g( g( O| MCASP_RX_CLKFAIL
J+ n$ ]! q3 U( N3 C| MCASP_RX_SYNCERROR
! S: P; i" a9 u& v: B% T+ A| MCASP_RX_OVERRUN);
. T+ ?7 G" h |2 Q1 R9 k- u. T} static void I2SDataTxRxActivate(void)' ^% g, o0 c8 ~
{$ B- {1 ~2 S5 \6 c
/* Start the clocks */
/ @ P {' p+ k U) |McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) | p1 S* Y: ^: c, ?# @
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
5 ]3 `4 }1 d& j& WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,3 b4 } X$ ^7 U
EDMA3_TRIG_MODE_EVENT);
' l4 ]2 I) D* r# p2 _( fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( Q8 P4 ]& y5 f) W- C* X- |. `
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */& V) }9 e) ?) i2 \
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* S$ k) v7 C0 x' I$ IMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero *// P+ n) b" V/ D! [
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
/ T. L2 j3 b. Q1 Q# |: uMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 E% @0 H' x4 k: ?0 A5 cMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);! w7 M7 l1 l! n! v$ g
}
) t. l, U g2 p- E1 W, Q+ B) U请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' p, i1 V# O/ N9 R: F5 N8 z
|