|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
8 G8 j* t) |! C% ^& D; x( x( {input mcasp_ahclkx,5 J6 z0 A; h$ H# P
input mcasp_aclkx,
) L4 f- t! `7 l7 K1 f% G( dinput axr0,
. A. w$ P5 d: F4 B1 ]- x% h, t9 _( [3 A6 @# M! M
output mcasp_afsr,1 R6 d; c6 t% t
output mcasp_ahclkr,
( ]0 e/ |9 p/ _9 m; E& xoutput mcasp_aclkr,4 X! J0 z1 y/ Z
output axr1,
" j$ Y# u9 ^5 c0 g2 m* O! e* u6 V assign mcasp_afsr = mcasp_afsx;! T# e9 Z3 y8 {# ], w
assign mcasp_aclkr = mcasp_aclkx;" i+ n5 D8 @/ O7 q! d3 l1 v. ^- u
assign mcasp_ahclkr = mcasp_ahclkx;
# [! k+ |: Z% [! ?3 Cassign axr1 = axr0;
4 Z* G7 L# x' [+ A7 y5 p3 J) Z! p7 p: Y/ S, g" G. W
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % T5 t4 N) U& M. u- u% Q
static void McASPI2SConfigure(void)
( D: s% m3 v$ A$ \{
9 C) }' M0 ~8 d8 p8 I6 LMcASPRxReset(SOC_MCASP_0_CTRL_REGS);- W* Z; A% S P! U) n J5 A
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ ^/ @' R" o) V* x: I. G# }; V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 j" E1 Z f6 |) ]1 k/ \
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */2 i- X, j) D9 T- k1 M) t6 Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 L' }6 l/ t' Z: `/ e
MCASP_RX_MODE_DMA);
3 ~* O; _) A% s4 s! v0 v0 _McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( D& t, ?! I9 M4 {/ zMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. M5 Q0 Z: C vMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & a! J+ P1 y% S
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# r& l& P( \* G* j" R4 VMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& G6 F2 j" |7 F$ HMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */( H j. O6 f5 e. q* C e
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 e2 g' n2 \9 W9 W
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 6 g1 U/ z! m$ I2 X' ~
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ M @7 E+ W! V, J5 G7 y; ~. n; w J
0x00, 0xFF); /* configure the clock for transmitter */! a/ A3 y7 W' [) I
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);9 O- j; {! v7 |: t5 z4 |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 ]7 s7 D- D- s" I `' s2 n7 ]
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# Y _" _1 y! Q$ \
0x00, 0xFF);
9 y. a( u, r& x7 G' Y+ b
+ W1 n8 x$ t( `+ c' b5 J/* Enable synchronization of RX and TX sections */ * V& |+ `7 ]' \6 D
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( s# y r) W$ ^/ R5 p& c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
F# B' ~: V7 l4 z$ dMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
, j5 |, c2 G5 T) J0 e2 `2 r** Set the serializers, Currently only one serializer is set as2 f4 R7 Z5 Z) u) e
** transmitter and one serializer as receiver.
* E- a: f/ A* y% L" b5 G+ K*/
# D) D3 n# O! A5 HMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% d, f/ _" ]: P6 JMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
8 j( h& a/ E! y** Configure the McASP pins 0 r$ F5 n: h0 q) N" A3 f
** Input - Frame Sync, Clock and Serializer Rx' ]* _$ r' q* _/ K! n# B
** Output - Serializer Tx is connected to the input of the codec
% m3 P L" J9 B0 E" O- E# ]7 t# h*/- U; p: t0 Z2 Z& m
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 U# \* D- L# @% e' C
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 l7 B ~$ ^" p, `$ QMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX ]2 v0 X( \* C7 G- M; I
| MCASP_PIN_ACLKX
% y' N: e9 o! q1 [7 l: [| MCASP_PIN_AHCLKX1 }1 f! W1 K/ S: z
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */. y- D% f) L! m' Y& h
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # n( o3 L" X$ y7 ^3 b
| MCASP_TX_CLKFAIL ( @ z) C2 N2 g8 o
| MCASP_TX_SYNCERROR% e* S3 s0 y! F( Y8 Y% Z2 F
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " d* g' c/ ~2 F6 Q/ s6 X
| MCASP_RX_CLKFAIL
" f1 R( K. Z. {0 b. X$ F| MCASP_RX_SYNCERROR 8 t* v! x6 t& ]( J
| MCASP_RX_OVERRUN);* X) r+ {! Z! A7 l& R
} static void I2SDataTxRxActivate(void)
( u/ V( H8 |" M- u7 F0 n{
) P- _: [5 Z2 {! x d# U' H/* Start the clocks */
$ B0 z' E% L2 q4 BMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- T; t9 Z( H3 ?9 c% E% P9 b5 q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */% B8 f" h- S5 ~" I! T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" B0 L5 X- j1 _5 nEDMA3_TRIG_MODE_EVENT);- |* B/ Z. w" C; {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 z! b# p& h4 f0 v2 k: y4 HEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */* P4 V% L3 _# m" {- q
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 W+ ]4 W2 b( e$ l/ c
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" Q: k1 S* C* W7 d$ F" z2 x$ Q* nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
6 R& G* P, e7 h$ w: ^McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 D- R9 b0 S& [McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' D" J2 I7 ~2 H3 @: J8 Z} 2 n* Z7 y, p# E. D
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! G4 r! ~3 a" S" i4 t |