|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
u& |+ A% \ S9 H7 n. s: g) D$ cinput mcasp_ahclkx,
1 s9 u& F1 q% K9 u1 b( Finput mcasp_aclkx,$ c; F G( v% F7 T& o. m, J0 u
input axr0,! _# r0 J7 x( o
) x8 x+ c! D; a* Z" X- M* ?! N3 I
output mcasp_afsr,
! D) F. L) Q7 m- routput mcasp_ahclkr,; p5 C4 Y, ]- l( F, f; ~- H
output mcasp_aclkr,
( D, _. Q0 J6 @- _. youtput axr1,# A, V- ^' O( V; [9 s i* r
assign mcasp_afsr = mcasp_afsx;1 B# `3 _2 Y- H7 T
assign mcasp_aclkr = mcasp_aclkx;! \# ]7 F1 _: s
assign mcasp_ahclkr = mcasp_ahclkx;4 |6 E. c/ o# n) R* g- F" m) v2 @
assign axr1 = axr0; 0 P) T3 n( y1 c, g; {0 v: |
; M# v" P2 z& I+ z7 J4 b在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
; F) H" I) B# ?. ~9 Fstatic void McASPI2SConfigure(void)2 y* P4 R' h i- u) p# Z
{
1 p0 e3 `3 ^; X" a8 S: r) X. T4 eMcASPRxReset(SOC_MCASP_0_CTRL_REGS);) g7 c: i- D3 ]. ^8 m9 P( C: H
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( S$ s/ P" C: T. z2 MMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
8 K# `; D G a. }3 U- rMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
$ ^1 [! l( d% uMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* w# `0 \' X( \$ z# D7 _$ c3 k
MCASP_RX_MODE_DMA);
0 A6 J# y7 M+ V( s4 h' }McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- W A1 l+ @7 N# gMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 b# b0 e/ O; n0 I+ C/ k/ R$ \
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) R; e( p7 [! W' t2 J, e! ZMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- _: B& P! k: V; s- f0 O
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # G& W$ u4 f1 _2 }# L. M6 P
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */. j9 i2 d! R, B$ o z# ^: V; D) N2 E% S
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 E8 S7 _1 @, r
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 Y$ Z; N4 {. BMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& U9 i& o3 C* [2 H1 [0x00, 0xFF); /* configure the clock for transmitter */
_; _1 |7 R1 x+ M+ j0 l- l9 T2 K. k' x7 `McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: J2 Z B8 x1 |8 H- d, \McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * }# r C8 m k/ m) u
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 a8 l1 O% |0 R# y0x00, 0xFF);6 W8 L) Z3 c. j- _; a, ~
0 f! J$ i4 Z4 m/ F9 U, N0 `/* Enable synchronization of RX and TX sections */ ! p: D1 b; [8 K% J
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 Z. e" b8 r: M d5 b" ?7 B/ W) A- HMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 A: m) [- O, SMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
`% M+ Q! a$ F** Set the serializers, Currently only one serializer is set as
9 X6 ], ?: N8 \0 c** transmitter and one serializer as receiver.
( k" Q( \3 X& l*/
; ~! G9 m9 A) e$ I" AMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 W) u: |9 s8 m* b9 ~1 r
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
8 R& o! t! T' {9 J1 y+ x% N+ A2 Y** Configure the McASP pins 7 K! S% X, b2 F, H4 L
** Input - Frame Sync, Clock and Serializer Rx
: }8 M$ s& a5 @9 Y, H** Output - Serializer Tx is connected to the input of the codec . b& O7 G6 `1 q: d, ^2 }# p( ]+ H
*// L+ d' P$ t) Z6 a6 R# E
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); ^3 O9 ~9 e! M6 E; I/ g: G8 O
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 r% G" [) r3 V9 L# f" @McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! u3 B) N0 P" N! d2 [| MCASP_PIN_ACLKX% g. ~- q5 ?* n8 t
| MCASP_PIN_AHCLKX" {0 M0 ]( o+ ~& P
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
4 T3 L/ [: x% aMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; x1 {: x) w9 c; R0 Q
| MCASP_TX_CLKFAIL , {4 l5 o/ B& K/ Y+ z i4 M
| MCASP_TX_SYNCERROR/ l2 X# e2 ~8 S, R
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 W- a1 [3 w$ Y6 S. c A
| MCASP_RX_CLKFAIL
) U* K* D% w) n, b| MCASP_RX_SYNCERROR $ y: |8 I, |2 {. F" Z% x* ?
| MCASP_RX_OVERRUN);
I+ o$ R( U. G& ?' j9 S' _} static void I2SDataTxRxActivate(void)9 ^0 y7 _' b# y5 v
{
0 M" S8 S$ [; W- e( n/* Start the clocks */
% E1 P* P/ d) G0 bMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* M" S2 B9 O8 z" B" x
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
2 L6 N$ M- [. N2 w/ CEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 h- `- B( ]$ P9 h! tEDMA3_TRIG_MODE_EVENT);
. Q% _$ g q% ]8 c( S- R; ^: kEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
o) A% W+ A1 i# E9 Y; A( s1 yEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; s* P g7 K4 e W! gMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);( f3 s+ s' Z( a' ~5 V3 k/ y9 d
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ @( y2 V) L5 z, u9 xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; J- Q" ~( |4 g8 P# y: x
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' o. f* H9 z" fMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);6 q& y1 Y- Q" g [4 k5 h; A* r
} & E0 n1 C% f3 T& V
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , t9 y* ]+ a+ Z4 Z+ L
|