|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,; S9 I( V: y4 f! q3 E4 x
input mcasp_ahclkx,7 v( ]7 [' ]9 {0 m$ C
input mcasp_aclkx,
t1 t5 v4 v }' M9 I+ Winput axr0,5 @4 n1 O" U, v+ I
6 x R* o/ W4 E9 poutput mcasp_afsr,
) g" }0 i/ F, R7 C' c6 goutput mcasp_ahclkr,
' ? {1 D5 U8 s4 G, Woutput mcasp_aclkr,
0 ^5 A" A5 d7 J0 y5 i. I" Doutput axr1,7 v7 ?& y5 U9 a5 b& b% f# `
assign mcasp_afsr = mcasp_afsx;
) v! }- q8 {% o1 Massign mcasp_aclkr = mcasp_aclkx;
n1 |: d; e9 }9 Z% q1 {! R0 Aassign mcasp_ahclkr = mcasp_ahclkx; E5 L& Z, L" o0 q9 Y
assign axr1 = axr0;
% V4 |1 W2 ^7 _3 F: Z3 k
" ~5 f4 L1 F1 R9 ^在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
1 ]- A% ?" i( S2 Jstatic void McASPI2SConfigure(void) }. w% |2 z7 @0 V8 m6 c7 i, k
{/ P, A' D& ]* a \% W# h
McASPRxReset(SOC_MCASP_0_CTRL_REGS);$ u( a- j5 ~4 Q3 {& v1 n
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 Q A7 B/ e' o# @4 i( XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
4 Q7 o+ `( Y+ G, W8 n; nMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */3 z% G- p3 N0 _: D
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 C: @. k# Z/ Z( G7 C: ]1 H/ ?' K3 U, W
MCASP_RX_MODE_DMA);! b8 D' x ~8 \8 \$ \1 K
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! d# K7 E2 Y9 H- s, l2 A
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
0 x) o* M: H: {8 \McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' `7 \8 i' G) v& z8 QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ r9 H1 Y& x1 k: [+ r/ Q9 q7 N7 CMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; L# E! R7 i, ]! }
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
8 |; }% n" g3 vMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) P+ L. d2 v1 n) A, X5 v- G- G0 n+ {McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 N' j# ^. W9 d: p8 n# RMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 J5 w" [ Z4 X, }. A/ Q0 m
0x00, 0xFF); /* configure the clock for transmitter */
1 _1 i# S. ]% Z4 N" UMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. Q# Z3 T' R( q6 c4 A. iMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: s+ K$ M) b/ H. Z: W. g# O r) ?McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," h1 e% \, g- x6 u
0x00, 0xFF);
9 `: @! B$ v) s: U; c+ N- O
% c% v1 z. J- d$ z' g/* Enable synchronization of RX and TX sections */ ' {" \6 d. Z* S1 B8 k! `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- C" }0 R5 X' Y8 N, _5 i' }: d
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( b3 M# g8 g7 HMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
) P* M+ ]1 I2 {( K# ^3 F** Set the serializers, Currently only one serializer is set as
% Y) K; j4 M% m5 N: ?) {/ R1 |** transmitter and one serializer as receiver.5 H) x i5 b e: D$ I; s5 `' Y
*/
' |! Q, z) |8 \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! [$ g2 n1 J2 ?- r9 E4 l
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
r$ D, }5 v& D6 }3 a** Configure the McASP pins
3 ^. K1 v/ ~5 l: p0 e. c** Input - Frame Sync, Clock and Serializer Rx
" l/ { j( b! }0 b. n7 [% a** Output - Serializer Tx is connected to the input of the codec , n0 N! g& `8 \) i, E
*/
3 m" p$ _- W' I8 QMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- }2 u9 Y2 W+ r* F) R0 D
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) \, U" v g# l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: P* a/ m+ p# t' _& G| MCASP_PIN_ACLKX, t3 J0 H# Y( f: B' n. E4 u
| MCASP_PIN_AHCLKX
( |5 F( Z/ N8 i9 F: a+ E6 R| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
$ c& h* T: ?: a1 H1 u5 GMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- c6 j3 p2 K2 c! Q0 n' \2 O7 u" D6 {| MCASP_TX_CLKFAIL
8 D; f' p2 V x7 \/ a: G1 k| MCASP_TX_SYNCERROR! R) H$ s2 v- M( \6 X
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % ~: d s' d3 ]" b' f# C: R
| MCASP_RX_CLKFAIL+ t1 j8 S. P0 V& u; p
| MCASP_RX_SYNCERROR
( m- }* S) W5 M( w! \| MCASP_RX_OVERRUN);
0 G- I6 E) o; [1 y1 g; a} static void I2SDataTxRxActivate(void)$ n. y* R. v% _4 ]4 o& {
{
; t. D9 J" l( e/* Start the clocks */
+ Y& ~7 @2 L l+ A8 u+ ~" j5 ?McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);1 T% ~: F/ D0 A! F
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
- |: O* x8 n% _4 ?, L" H# e6 H% ]* jEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 h8 S6 d3 w" n, v, ~2 c
EDMA3_TRIG_MODE_EVENT);! O. a1 e3 D; }+ t- ]7 U* a( ]3 Z% e
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , p- _6 [5 K8 {) e6 H) C% M
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
8 R% L5 v) @9 L0 y* A# a' n- ]McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* t) a7 ?) |1 R: E: J% vMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */' @5 S: q i, {) j
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
], {& s* l5 ]$ i: N. JMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, d/ }, B% y" e' F1 B! i& |McASPTxEnable(SOC_MCASP_0_CTRL_REGS);- ?* a, e; A- g: |% x' a% F" r
} / w7 U1 ], e. _. m0 F: m" S* x6 c
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 6 l, D( r( _8 Y! e
|