|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 }9 l3 {0 ]5 U! Cinput mcasp_ahclkx,
) R& R% G& o$ g! u! r- d) Rinput mcasp_aclkx,
& B) f! e) H8 Z4 [: @input axr0,
b' F+ j; k! h% K ^, L2 p
; P# {8 |- n7 J& f: Y6 ~output mcasp_afsr,
* T! }* [5 j B- b4 b3 uoutput mcasp_ahclkr,
/ g2 z, c# k2 d4 Qoutput mcasp_aclkr,6 Q# n& q& g) o$ K1 j* S F
output axr1,3 I6 i. P7 A g" n8 c
assign mcasp_afsr = mcasp_afsx;$ h% V/ {' B0 i$ e3 r
assign mcasp_aclkr = mcasp_aclkx;
) M% q3 I# o- `$ @assign mcasp_ahclkr = mcasp_ahclkx;
?7 X! d$ N2 r# l2 Yassign axr1 = axr0;
7 W8 x5 k1 w$ S% \# l. k! } Q8 l1 E/ x- @' Z) `1 o/ K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 N n2 B; c; [; q1 N
static void McASPI2SConfigure(void)+ y0 g& H! h4 d, S
{
: Y3 e0 k# k& E- Z m: qMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
% b6 T4 u# D3 IMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */; V+ ^5 U5 l: C; `8 O& @1 M
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) s8 [& I) k6 X0 I5 y! t1 p4 `
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */5 L4 ]) A# c/ t |; z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; _3 d. O' l' T, M3 S
MCASP_RX_MODE_DMA);$ X" t7 j% ^1 a9 `- Q4 u& @+ Y& R
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: ~# H8 B7 q8 U
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 }3 X+ O; P t- g) eMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
D. f7 |3 l! H7 z3 e; ^7 `MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 a/ N* R6 M8 Q9 Q! U4 E
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " h* d4 P+ e: E. l3 K. p
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 k6 H9 ~# \. m) \
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 F7 L. q" X2 _1 \' g. _ @% `; sMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ _* L% K; i! s( y+ {
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; N. J% D$ D6 e! s C' o& Q# t0x00, 0xFF); /* configure the clock for transmitter */
( j' ~' o3 O+ X, u) t' {McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. c7 S; z% Z/ J( S2 hMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 r$ O" {1 K! V: n
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* m) {2 ]0 n: X8 x
0x00, 0xFF);' Y( v" H5 a1 t7 o+ a7 E, c
& u$ d+ t8 _1 R8 s7 F$ x9 p- @
/* Enable synchronization of RX and TX sections */ % l1 @% f8 Z0 v' e+ I
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots *// {) g. H n- {7 Z, g
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* y- a0 T1 C6 i( G4 \
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /* B# E7 |$ a; u w0 i" v. |( w
** Set the serializers, Currently only one serializer is set as
) F7 W! w: ^1 X3 x( e+ q6 \** transmitter and one serializer as receiver.! u; m2 c( i8 P/ a5 `8 _$ _
*/
4 }6 x. F$ x2 |$ b7 \' y. ` d% L8 vMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
0 E- u5 z9 D: l+ t; |3 H2 X$ LMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ H2 O+ u1 M: n
** Configure the McASP pins
4 [# B: T# ^ N** Input - Frame Sync, Clock and Serializer Rx$ j0 C! k+ P/ r! h7 y" `, A' @
** Output - Serializer Tx is connected to the input of the codec
" v6 [5 Q2 F7 o*/
: N$ C- q* m4 IMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);$ I5 W- H1 p/ @/ r' @0 m) d
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; P" ~3 j9 t/ g/ g. ?: Q% rMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 e0 a+ N7 W4 X$ F9 t| MCASP_PIN_ACLKX
% ]& B' a l' d# o; c" Q) r. U p- l| MCASP_PIN_AHCLKX
, b' H, u& {( @. Y; C) L| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */3 Q7 |! j A/ X; x; t! S* ]
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% Z6 N4 C( p: H" n3 X6 `| MCASP_TX_CLKFAIL 5 H, g- X+ Z$ i
| MCASP_TX_SYNCERROR
- D' k% b1 H; d| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; ], m# `: c+ D7 f. v0 N7 \
| MCASP_RX_CLKFAIL5 A) h/ A- ]9 y- V2 H
| MCASP_RX_SYNCERROR
$ c6 ]- i; M" s' c| MCASP_RX_OVERRUN);
8 f2 v+ g/ \' K# l! T} static void I2SDataTxRxActivate(void)
. J+ p3 V8 e: g# ]6 P{8 g5 J1 ^* z9 w
/* Start the clocks */7 |0 R0 [7 {3 a2 {8 f
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) [, J, D7 {% A4 OMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( x. S: V/ S. j$ A* Y5 A3 C
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% b$ j# Y9 G# y2 oEDMA3_TRIG_MODE_EVENT);
4 D! I; u( u* a% e" y+ a& I# bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, O; v" S- k, `5 Q( E8 w9 qEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
2 R) r! g1 w. tMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; h2 B6 w6 l* V2 U6 yMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */: d+ u9 v) ?* J- k! S
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
& V; l* L" C K" ?McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* c9 F, e: `9 G0 JMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
+ u3 ~2 P4 Q/ x. |8 F} + C( {$ s- w6 x' b2 Y+ q( i% C
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
; W0 e3 ~- g$ k. ?( {3 W |