|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
! k# p$ x6 n, N, v$ L+ |7 Q+ `input mcasp_ahclkx,8 G9 f) h. J, C% N2 f
input mcasp_aclkx,
6 a M) n, g3 z( zinput axr0,2 Q) W) N. S6 g/ X9 K2 W
+ i3 u! Y' u, v( ?8 N3 Q' u
output mcasp_afsr,
: P! a8 O- c) l0 r9 g6 @output mcasp_ahclkr,
" y( \; }' S( ?) t/ J& ioutput mcasp_aclkr,
) S4 u5 C& h. \9 s% _2 Y! Z7 |. ioutput axr1,
# [3 k, F7 Y6 h5 b) ?2 z assign mcasp_afsr = mcasp_afsx; Y9 a6 {: q3 L' b* z6 ]( ^
assign mcasp_aclkr = mcasp_aclkx;
0 M+ U T6 B6 [, N+ cassign mcasp_ahclkr = mcasp_ahclkx;
6 z9 g/ y; _6 C# ~8 xassign axr1 = axr0;
' u% q3 l; a/ p4 c* g1 c$ E4 q0 P- D- Z# }2 h$ z/ |0 _5 ?' f3 K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
" J$ ] n: N2 t4 Astatic void McASPI2SConfigure(void)" V. j, w- `& }/ A
{
8 r* q9 o0 g% l* pMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ d& \0 I- y0 FMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */& |& j5 a+ c X+ Z# Z* I0 ]% g1 u
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 U4 ^2 }% M; A$ X7 ?; GMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */2 @7 M4 ~- j% ]+ [9 i1 e; Z* P
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( D2 W7 A P& v8 `- cMCASP_RX_MODE_DMA);
. Y3 G F9 y* K$ o) T6 C& e& RMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- G% Y9 x) w$ b- u: e/ A9 W% Y5 {% F! VMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" i! f c( x' qMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' L5 n7 H; H4 a1 N7 rMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. U$ W# g! L* r# _' a# JMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, k2 { ~9 Y/ Q/ A$ I- l
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: s. L- C. j! b- e9 q7 m: m
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* R# p+ \1 @6 `, k8 Q0 q: v ^2 L" X
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 |2 V9 ?8 ]) X2 H. PMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 ^+ O1 D1 L. G9 E* }7 z
0x00, 0xFF); /* configure the clock for transmitter */4 {4 v" P, {, \/ G
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" ]3 j9 W( l& m
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 z8 x% e7 b/ N5 n/ W9 GMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* Z8 z# Z7 `* ]$ S4 g8 ]
0x00, 0xFF);
; T0 H9 T. w! j* `& h" U
) p/ c) @" Y3 y4 o8 r3 b/ O/* Enable synchronization of RX and TX sections */
, _+ m/ C$ R4 f" F* \McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */. |2 P1 i0 V3 n5 |3 V' @
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 f1 g4 D- I2 A0 L# R2 C" H& o3 m. j
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) |. S* x- M A+ G- R9 d! W7 x
** Set the serializers, Currently only one serializer is set as7 G4 u1 C0 T# u2 F. W
** transmitter and one serializer as receiver.4 B9 u- Y7 ?9 S$ J
*/
! m) }- S# h, U wMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# O" G, x# n! y- }
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
. u! m X$ o+ Y# E2 H6 K& F** Configure the McASP pins
; s; v& p H9 g8 q3 o** Input - Frame Sync, Clock and Serializer Rx/ F! Z4 _9 D: f4 ?) \7 p& e
** Output - Serializer Tx is connected to the input of the codec 6 R6 v. j0 b; t/ O/ y1 K& g+ q
*// d3 {% V2 c( A1 W1 g7 m
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 x' T& g! c9 |2 h2 A* o/ O
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 }' _ V/ E! w; j, v4 [
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# b) o% e. _. Q9 g: q) p: U$ |. Z
| MCASP_PIN_ACLKX
# S$ w- a- z$ W4 G. y" H| MCASP_PIN_AHCLKX8 z5 G' V0 M1 h6 i
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */. R3 [% p: n( o0 w" y/ H- O
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 |# L- Z, }: F( \, E( m
| MCASP_TX_CLKFAIL
$ r, \; k4 E# M$ k2 z| MCASP_TX_SYNCERROR; S. E7 c! h1 k7 M9 @; \' }3 Q
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 L9 r! \& S' R' |" X| MCASP_RX_CLKFAIL
/ ]) Q; n: @) A4 o" o2 \' D& N| MCASP_RX_SYNCERROR 1 M9 d* O) Q$ V
| MCASP_RX_OVERRUN);
. H7 m5 G" l8 X) o+ {6 a, m4 ~: G} static void I2SDataTxRxActivate(void)3 V3 D- w; m# o, I
{
! r) ~ W) k, C5 s8 S p7 q: t/* Start the clocks */
# e. e$ ?2 v& r4 jMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. _- a7 N% w1 }0 Y0 x" AMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */: b) [7 t. Z' T+ R f1 D# X- O& z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 ]& P( j/ w x) [' {) q1 VEDMA3_TRIG_MODE_EVENT);
9 @9 d( X* f" ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
; X% x" p) _7 Y3 z) a. X9 EEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
) G: H$ h" w- M2 {( |McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. @0 A( k6 Z. I( k& v0 LMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
`8 @& d6 V3 E- ^* p- y' C! Y) awhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
. W8 \5 ?! x4 D7 S; k* vMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 E. A* `" B# g% u# U/ M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 Y% Z0 s( Z2 e
}
6 y0 }0 q5 ?' J+ s请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. # P2 {' h, L9 V( I$ O* {' c2 |" X
|