|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
& D- E' F" R8 P, Kinput mcasp_ahclkx,
" O5 O4 b4 V$ C. Sinput mcasp_aclkx,
R- W% j% y2 i8 X. kinput axr0,
' V. A/ D: \6 u. G& l9 w; J9 a- M S/ d/ G) K R! h$ \. u, K
output mcasp_afsr,) V% J) L$ B$ o$ Z* u
output mcasp_ahclkr,
2 `/ V! R( C9 O/ r, \9 B% [output mcasp_aclkr,7 c9 e1 m4 |3 Y. L5 R0 ~, `
output axr1,
% V, f! x" j0 }) Z assign mcasp_afsr = mcasp_afsx;
+ r' J* V8 `8 X1 @assign mcasp_aclkr = mcasp_aclkx;
# w0 W, j: X9 w+ hassign mcasp_ahclkr = mcasp_ahclkx;$ `" D, G, {9 L
assign axr1 = axr0; , q) i0 K' b8 {( c
) H$ c/ c, ^1 k/ t6 Y8 ^+ R) |在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 * w2 s, E5 P! U2 n) W1 n
static void McASPI2SConfigure(void)& z1 M3 L% V% q8 x
{, ?% W& R- d8 g5 j0 t
McASPRxReset(SOC_MCASP_0_CTRL_REGS);' I1 r% w/ U4 R: F
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */7 N$ u& d9 }3 h9 u
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 d* s( D Y+ k! l
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ H( ~5 E' l8 ?! V3 L$ |+ ]
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, d0 j. I. ~& B1 C* r" V* L3 n9 @
MCASP_RX_MODE_DMA);8 c4 _" Q8 ^' t3 M& ~) M: F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 W& P9 u- n4 l5 x9 p% |MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */9 ~9 K: S8 J( S6 T4 o8 ?# B! r- a
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, . x. S" H7 O" Y4 [$ ^( z/ X+ a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 o$ m5 o. a) p$ H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ t+ R2 J* M( B7 nMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ e4 r; _8 v9 O# L# H6 z4 i) J. BMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 _: ?1 |6 c. t' XMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 _* F4 ^ Z1 {) Z9 ]% h; T6 yMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32," R9 t* R7 f0 |' Y0 I' k* j7 m
0x00, 0xFF); /* configure the clock for transmitter */3 a2 v1 |! E N H
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" k2 x: O1 E/ Z
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 ~3 @ z7 ?* T9 c% F$ x: B
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) E: r& [3 c2 P, N, x
0x00, 0xFF);
: s9 s( I+ L) }9 m8 p7 S5 d1 f, Q% L+ ]
/* Enable synchronization of RX and TX sections */
) O* T6 }0 S) B* h6 @9 H4 i/ WMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */% d& ^7 s8 l% |5 C) c3 e
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: A4 N* W) k) L* `1 d. M# R3 kMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
J) G' e7 ], O) ?/ X$ Y** Set the serializers, Currently only one serializer is set as% G4 r: L% Q% ^1 B+ `
** transmitter and one serializer as receiver.8 A2 _' X7 h- o1 u# G
*/# b1 x$ F; D' V: G6 k- s |
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: I! \. P+ Z) [/ U+ F5 r5 y( n8 ^1 D; S
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
' J5 r; A5 {. K& M A, Q5 }** Configure the McASP pins
# |$ H$ K& s' Y** Input - Frame Sync, Clock and Serializer Rx
h% e$ J4 [. g" [, l- I5 Q# [** Output - Serializer Tx is connected to the input of the codec , x8 F+ e7 m) i" Z: o
*/
5 g1 \, O0 y' @' a: ZMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: J8 A; y2 v* v7 J! m. T6 oMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& m4 { @+ }8 J. l* X, q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 ?; [7 {4 y# O: H3 b( }| MCASP_PIN_ACLKX; a2 ]- h4 ~+ n! G
| MCASP_PIN_AHCLKX- _% W% a! ~8 ^ I0 Q
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */% Z. Y. `6 [; o3 }
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 G2 x7 Y. j9 E7 Q3 q
| MCASP_TX_CLKFAIL
: M: J3 A A+ A0 \) c2 }, I| MCASP_TX_SYNCERROR. c* x8 D- Q. F, X8 I
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 T5 k# I- k$ ?9 o/ j: U, h. O
| MCASP_RX_CLKFAIL
" |( I. x J5 f7 N1 i| MCASP_RX_SYNCERROR 6 I7 I5 T' k2 j9 f
| MCASP_RX_OVERRUN);
! k7 [+ Q3 Q+ P/ f3 J/ ]) Y! O} static void I2SDataTxRxActivate(void)5 M/ J- E. d( j+ P2 f6 o
{% s) L. t' u' R% d
/* Start the clocks */
: u4 Z }& A6 J1 [: k' CMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 J2 v7 K& v& i
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 m4 G( W3 p9 |* q: {! T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 j! i9 B' Z p# e
EDMA3_TRIG_MODE_EVENT);
+ d6 x! n% r' @, l/ ^2 e% VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 }) Y5 g* f+ t: C# S
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */: D" l3 R& W. W8 @8 p
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% C6 R& R8 m2 f: r) \1 K( v* {5 u
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */$ D: z7 N% O! U
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
; Y5 E s) a1 y0 ]/ v( @+ NMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- ^0 Q1 B) Q- e1 X- D9 rMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 R! l2 J% ]* f% S}
5 R: V/ M8 K6 y" R$ f请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 ]( L0 U& j- S0 D( R |