|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,6 `' c' q/ [' z" f+ w4 a
input mcasp_ahclkx,: Y" ]9 u8 r. `: b. J5 b) b! s: z
input mcasp_aclkx,) [8 H+ M. x, D5 H
input axr0,: v9 l7 A/ W, e- D
, o0 J; Y. ]; s% b- B
output mcasp_afsr,& o* O8 h7 i! O2 g% P; c4 q1 B+ [
output mcasp_ahclkr,2 I. A) J Q& l- u
output mcasp_aclkr,
. T7 f! i0 [6 d7 T- @7 i. I G# youtput axr1,: G5 I, T: B- `% w; Z5 {
assign mcasp_afsr = mcasp_afsx;! W! `+ L& I, s, Q& `
assign mcasp_aclkr = mcasp_aclkx;5 v9 Y5 v8 k) t; t
assign mcasp_ahclkr = mcasp_ahclkx;6 i' x- c/ |4 S
assign axr1 = axr0;
) d7 U5 f7 |" R% Q" e) ]$ G# L- w8 b, q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 $ O: M" U/ k8 W7 g& p" d
static void McASPI2SConfigure(void)/ } J8 G9 W& V W2 B2 q8 d
{
, z% U) O3 P2 M' ^2 ]: @, kMcASPRxReset(SOC_MCASP_0_CTRL_REGS);5 t7 ~ b" w* O) L: N
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */3 y2 L" d7 z2 f1 P& q1 @8 l
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 U4 |) a. X) F; A7 p8 A
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- O# p6 d6 Y7 R6 ?
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 ^+ b. d b+ c7 y+ I
MCASP_RX_MODE_DMA);
0 q7 r) f7 }2 S A' l! l, jMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 m2 D0 p/ p' d# qMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; h/ }" c$ j# A$ x8 D# KMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 d. N0 J' m+ ?6 y8 \ hMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 [1 w# @- J! H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 {% X3 x, h3 o, | vMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; k l1 P; M' Q0 b G! S7 l# l3 FMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 T3 l# P8 ^& B0 i O* w
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
0 ]2 t. H& ~5 \+ RMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, F2 m) i g6 B
0x00, 0xFF); /* configure the clock for transmitter */
' d% u/ O. ~: @2 |* o7 cMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ h. I3 v, f5 W
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + q1 P% ^4 s/ C9 \
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 C6 A5 c. e+ K2 z$ g0x00, 0xFF);
# S5 k J# R3 `, }! ^) c, \* p2 |
; @; j3 t5 ?5 E" T L6 `% R( A0 l/* Enable synchronization of RX and TX sections */
! V* Q; ` I+ b0 Q$ jMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 q, o5 K+ ^! d* n
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 ^* T5 Z( [4 f/ E8 ]% T# h( [# w- [6 t
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*" s4 V5 H" z# ]8 K9 u) u2 C1 s& _
** Set the serializers, Currently only one serializer is set as: \# f/ G& P# M0 Y
** transmitter and one serializer as receiver.7 B' j4 @. `9 m6 k3 p6 @
*/) Q, K9 X6 U* a; f2 e
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 x; N( {: b8 G+ G+ v7 l2 uMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*% l) y7 C# ~' {) i" m. S
** Configure the McASP pins
5 k- ~. i" I4 q** Input - Frame Sync, Clock and Serializer Rx
Q' g% P& p9 T/ }4 M* w** Output - Serializer Tx is connected to the input of the codec
) _. a4 g7 f- ^& x! m*/
; q# @0 p) H: q7 Y/ S& `" L( \# w" eMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 C" E# y Q1 h1 }* ]' VMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! f, T a9 j* G4 y0 t) E) T% Q8 S! yMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 Z. D+ K) ^3 ?7 g- I3 x5 [8 J| MCASP_PIN_ACLKX
$ N) {/ g; j8 s& ]) `% J9 \| MCASP_PIN_AHCLKX1 o3 H g1 t1 `. X5 C& _
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */( j% w) Y* K* i* C! D
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + _# |8 Y, o/ y. S
| MCASP_TX_CLKFAIL ( l& K$ i w' j$ @" ^
| MCASP_TX_SYNCERROR
4 p. v" N! |* p2 l0 t| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 v0 I1 i7 J ?" v
| MCASP_RX_CLKFAIL; |7 H- B* f& y. O( a( _
| MCASP_RX_SYNCERROR 5 @) e% @3 n# P9 i
| MCASP_RX_OVERRUN);5 l0 T9 F; u6 i6 k5 M6 W
} static void I2SDataTxRxActivate(void)
2 m8 |/ N, v% Z' Q$ V* P{
3 f' C3 P# }# l2 A# x, w/ D/* Start the clocks */) A+ P, D3 ? G" X) n
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% E. H" c" I# IMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 S- U% ?8 A5 R8 M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 ]) j+ c& {# B) o( F, i$ \
EDMA3_TRIG_MODE_EVENT);
, N; P" g2 t" e) n! M1 I( J7 |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! A' F7 ?7 k- s. v* w, A
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */; _8 ^5 L$ j) h" ^/ e
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) v8 T9 ^3 p* P$ ~8 [/ n: \
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 a1 x+ n" ?* S, {0 `4 W
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
6 L% I! l* k+ NMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 I; L& T& ~& z( f5 lMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) U5 c6 |: J3 ^7 \1 a
}
. V/ K( a$ w' S. |请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 D# m2 V: z D |