|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( }4 D* N, I3 q- C, R& ^4 N, t! Q9 Q( Y
input mcasp_ahclkx,
) ~2 D& l) I. M7 @6 ~. Rinput mcasp_aclkx,
' u8 _4 }2 S" J( n: e( ^input axr0,! ^+ [$ a! y& t0 i7 i4 j! y. S
; ~5 c/ s3 d; _
output mcasp_afsr,: x, [- m+ a9 l8 B @3 u
output mcasp_ahclkr,
# m$ _ K5 @/ p' A3 j& Z3 Zoutput mcasp_aclkr,5 e6 N# e+ r% Z6 F+ O% Q! `9 ^
output axr1,
4 u# n6 {. D5 H* [. C& F9 p& N; H/ R" c assign mcasp_afsr = mcasp_afsx;
* J6 l7 ^" t: A& @+ T- M8 c' t- uassign mcasp_aclkr = mcasp_aclkx;$ ]5 L; |3 c g" J: J
assign mcasp_ahclkr = mcasp_ahclkx;1 n# d0 P6 ?7 B' p, g
assign axr1 = axr0; , n& w; v5 r+ l$ p# U5 x9 Y
9 Y& G g5 {4 U+ r; \5 E5 H- U在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ! [0 X5 j' B& Z e! R5 `& r# C
static void McASPI2SConfigure(void)$ k9 \; W1 D" F/ q
{+ ~+ b4 E2 G+ W
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- a1 e# e& l' B- G% MMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
9 B# Y# V% W8 H, h1 Q' z; VMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 g) C% b& G" v I% O7 l! P$ YMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) q7 ^! C/ Z# d% L6 U2 O0 z# z, f
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ ]6 @+ B! X. ]$ b/ o8 sMCASP_RX_MODE_DMA);# I% t+ E. L2 M5 L- O& i4 L( E4 v
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. k0 Q+ y' I- [+ h# n1 a _3 S
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
y$ A8 ?% Y- f5 y" t; qMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, v- h4 m! y! e2 p1 Q
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% a: s+ _7 w+ f
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; d: V% T6 Q1 ^& z6 VMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- T$ g' J! u/ |' f# z
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 |& f* u1 C. `$ {. P
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ! X+ U" Y. z/ y' N
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,' c# u9 e* @* l/ d% K `
0x00, 0xFF); /* configure the clock for transmitter */7 E' ^3 H" T4 g! V, W3 n* q& z' A
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 l2 D( h. k5 |6 I6 u& [' HMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); , W: K( {- A* u2 G& h+ ]) A/ N% v t
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* H' ~9 X u5 P6 v0x00, 0xFF);
! ?0 J1 e. ?3 }2 k7 H& m! ?5 H, A, w, G. L
/* Enable synchronization of RX and TX sections */
7 f$ y8 v! T0 k8 J) x8 YMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */9 u3 `" [0 h: M7 _. k
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* v' }, S5 Z1 A5 B1 G& z- U0 P# E
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
6 }: b3 Z0 z) _! N) u2 F7 e4 O* L3 i** Set the serializers, Currently only one serializer is set as2 m6 p, v' ]5 N
** transmitter and one serializer as receiver.7 a7 f& m/ M% R- |
*/: b9 S; ^! {- n. _; p& U. O
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); s; q2 _- r. j
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*6 f Z) c# z) ~$ ]- Y4 e# M* S. S- {
** Configure the McASP pins 3 B+ U7 _$ M( k( T; `; o+ \ E
** Input - Frame Sync, Clock and Serializer Rx- w5 g2 o* j8 a& U+ E
** Output - Serializer Tx is connected to the input of the codec # p; u0 Z; U8 V
*/
" \& A) w: d1 A! p9 ~( o8 JMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; g+ v, a& Q9 Z+ W. h# `6 r" @McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
1 O0 F) W9 G# y" p) X, F! `McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; c s* D( c+ }) B, c
| MCASP_PIN_ACLKX
7 P' n6 }5 h: a, A! n5 f8 I| MCASP_PIN_AHCLKX
& a8 _7 W2 W! @* D* x| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */1 Z& i/ R2 d% p* H* h% W1 N5 b+ Z1 l
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR - ^1 j, L8 t9 m8 `3 ~) Y
| MCASP_TX_CLKFAIL 0 M' ]- R9 w2 _/ B: s: q$ e" r8 U
| MCASP_TX_SYNCERROR
" X6 E9 l: [! `+ m| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
; W' L. y# n4 l; Y+ q| MCASP_RX_CLKFAIL# u5 e/ E3 S. Z
| MCASP_RX_SYNCERROR 9 e: K5 [+ g# i, a7 r9 L+ h. b
| MCASP_RX_OVERRUN);' G, C/ j0 L+ `9 L e. Z) f V
} static void I2SDataTxRxActivate(void)5 `3 y8 d5 Z' f" b. S
{
" b1 Z7 _7 z: B/* Start the clocks */# N) _0 [6 n! m- M( G5 t
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL); c8 E; _- }# t* [( q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// y" X p& `- V1 d! i5 w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 c7 w3 d- b- o3 d* t# z. ZEDMA3_TRIG_MODE_EVENT);5 o7 R. W+ S2 d) Y3 f5 x8 V' o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( I# u" A0 R) k( m& u5 U% iEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */( U1 E. X! N. R) }" X
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 e: \( f- b2 C% `4 ?2 K
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */# V4 Y' f0 [+ a# D: v
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ a" u2 S3 C6 Z$ z2 ~
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, z2 Q7 ]2 k/ z- ]: k+ \" FMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);. h: n j* K8 n3 U' [& O! Z" R
}
+ ^ ` c: X- H {' Y5 h请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* ?; _1 ?. T2 U6 a* D" T1 w |