|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
2 O9 j+ Q/ N2 R; I3 R. ginput mcasp_ahclkx,6 V6 f( m6 C. f
input mcasp_aclkx,
+ B8 e8 P6 Q' x5 z8 Tinput axr0,; a( `& s4 I" @1 O5 X
6 a+ S) d- ~/ J- `# q; p% J8 P
output mcasp_afsr,* }( i* v5 {1 Z
output mcasp_ahclkr,/ I. d( b/ u- M1 ^2 e
output mcasp_aclkr,2 ^7 z' [7 U% Z" t# K+ R
output axr1,5 ^& Q }( Z# `
assign mcasp_afsr = mcasp_afsx;' q! M6 ?( g0 T ]' |7 }
assign mcasp_aclkr = mcasp_aclkx;
6 g* G8 j5 ?0 o2 C, F; r7 T5 Uassign mcasp_ahclkr = mcasp_ahclkx;2 @! ^ F2 r/ d& B) v: }5 b# k
assign axr1 = axr0;
+ Q. ~5 P8 \: s' Q; y* y8 y) `3 f
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 8 O: h* e3 g$ b& p
static void McASPI2SConfigure(void)0 g6 i# c7 [) |
{
3 D: P( S1 A4 J7 W+ ]: CMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
# D1 I- u, S+ X& y9 H- O0 _. C; ~; z5 ~McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- [: p4 h- q/ ~. `* N, l
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ `: H; N% Y1 H, F1 i
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */0 f, X, x1 r% y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ q( R5 P" [% y. \# a& IMCASP_RX_MODE_DMA);
: G( ]! P! b A, ]McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& h$ v- d3 e+ G, t4 ?3 q7 nMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */, d: o' t, }+ b# ?
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 f, [! I4 q. ]1 r9 U& Q6 O* ~
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
7 D2 I( b: W7 j6 T' hMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / S6 n" ?6 b: @) I- m
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
) h% p! q0 b( d* t" OMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 g5 W/ Y& I* J, X$ T$ fMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ @6 h; e2 B3 @0 t/ cMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. f3 s, i* M" L* A! q0x00, 0xFF); /* configure the clock for transmitter */$ @0 |4 T( b7 N( l0 |0 N7 T; V0 M6 G
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, n' E; q8 t1 hMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " {& m1 \9 N4 j5 C0 J2 s
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& g9 ^6 H j, o- h& h/ m; X
0x00, 0xFF);! ?7 |" u; Q ?$ u
* F8 V- |, m0 m: b. r
/* Enable synchronization of RX and TX sections */
5 N0 i* y" M8 u1 t# gMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 [; g: t3 G( d, e+ q- W$ W. N- l
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' e, P: a3 C3 i% Z* a: ]- GMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 }) c* N& M" }
** Set the serializers, Currently only one serializer is set as) ` C; G* }3 J3 E- x
** transmitter and one serializer as receiver.& L, V! ^. K5 q- F) W, Q# d, I
*// b1 G2 ]+ V$ `" Q( s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# `2 G& ?$ T4 s" n+ @5 P
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
" W8 m, h* }1 U6 v; }" P6 U# L** Configure the McASP pins
6 M! u/ r, I ~9 l- C- {** Input - Frame Sync, Clock and Serializer Rx$ ~9 C) }$ Q% T( j2 G
** Output - Serializer Tx is connected to the input of the codec . S* U' V) T. X! \
*/# p* }9 {/ |' G% k. g( R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 \+ _2 ^) Y: |/ N" q% |7 B0 gMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 Z( V z; Z ^0 b( X
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
, }( Q8 V) n8 d| MCASP_PIN_ACLKX6 |; F1 e2 e( g
| MCASP_PIN_AHCLKX
" ]' w8 _% q+ \2 G7 ?: t& ~4 |' ]| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */! u. v# _9 r1 r& \2 @1 r* c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 h$ a M( i4 S% O
| MCASP_TX_CLKFAIL
: D% F( X! ?& N. O| MCASP_TX_SYNCERROR) W+ _9 r1 Q7 |
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) j) o' K+ f+ B8 w/ ^8 C| MCASP_RX_CLKFAIL
% ]& {, A9 F8 }) q1 T- O! q| MCASP_RX_SYNCERROR $ N+ Z0 b5 M3 X( {- U
| MCASP_RX_OVERRUN);
3 q. V5 P: ]0 u* ^) E} static void I2SDataTxRxActivate(void)9 d- ~$ G& X; E+ H! l
{
4 t! Y0 N. Q& i' G& M/* Start the clocks */
7 \' O5 N ~) ]1 ?7 lMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ n" q9 M3 T4 H. e: V6 ^McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 c, h \+ A+ UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: c7 H- `2 e: q% @( O. F
EDMA3_TRIG_MODE_EVENT);
% y/ w7 Z; H: y0 H0 h1 IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 G* N" o2 R$ n' Q: m. {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% u, w. ^" L% Q/ ~
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 H0 O5 {0 J; ~8 V% ^% g- E: ?( UMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */( R' q7 @8 p! N/ w: {$ g
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
& _ u4 a' _8 o% j" x4 h7 m2 eMcASPRxEnable(SOC_MCASP_0_CTRL_REGS); a f# V7 _) V0 k1 b4 N- |* v9 t
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 v- I* j. ?: |4 h) L
} 2 g0 u( j4 d! H: n+ _6 f6 G
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& l4 {/ Z2 Y0 B2 u! d |