|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& P' V6 t; ~) V2 t
input mcasp_ahclkx,
0 ]( F z2 d2 c! Iinput mcasp_aclkx,/ v8 j( N/ x; \, ^% r
input axr0,
; Z4 U# B3 U U: G9 E
( Y! X4 o: @$ j* T- U$ \* w; Xoutput mcasp_afsr,0 m! Q: C! {# E2 z4 u+ H; w+ H
output mcasp_ahclkr,
/ T. Q) c$ `* n# O! z$ Ioutput mcasp_aclkr,
: A! O3 M+ R/ B1 loutput axr1,( P1 T' S" K, G {7 A% Y+ X
assign mcasp_afsr = mcasp_afsx;4 f o" }: t8 F9 P; n
assign mcasp_aclkr = mcasp_aclkx;
6 p" K: G) q' j* Lassign mcasp_ahclkr = mcasp_ahclkx;
% @+ P) G$ E; g: v# c R) @assign axr1 = axr0;
! W7 T5 b# ?2 L
9 ~# s& w& g- r4 w" m在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 - N" G. W& R. j+ Z0 u
static void McASPI2SConfigure(void)
: p! ^1 j, w' s4 n{" N" _" ?4 `+ C7 z) P, S; V
McASPRxReset(SOC_MCASP_0_CTRL_REGS);/ [, Y6 J) z5 ]7 B& k# h
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */* u$ @+ I6 T- o2 @
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 R/ V& ]9 h' ` _5 V5 fMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
( Q: T" F) q5 T5 L5 p' ?1 t5 [! _McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ q0 [3 \0 t2 R
MCASP_RX_MODE_DMA);. I1 u V0 R6 Z. Q8 x L
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, e5 g. O5 g0 r# g/ n
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% k( q, j( W' l
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! X, _# v& w1 ^: xMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) ^+ w8 E7 b) @# l/ I+ PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: c: o' P5 z9 ^; Q2 aMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" Y9 Y5 A" d& U. U
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! B$ A$ @! N$ l6 m! h. @: sMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
_! B i& O0 W5 Y; G e; nMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 t! ^6 r3 a; N" Q$ i: P5 T0x00, 0xFF); /* configure the clock for transmitter */
' \. p6 O; e: ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 W* b) u* J5 P' b, ?, p& v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! J9 m3 C& O2 P6 \3 FMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% K- U$ D1 _. T
0x00, 0xFF);
7 j2 B$ E1 V# y9 P' Z6 t8 \7 ]" B& _" k6 \& _" h$ @/ G. V5 q
/* Enable synchronization of RX and TX sections */ ' x5 d8 B3 g) T6 y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
& C2 l4 q: x. }6 i$ @1 zMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) O, j3 M8 R2 H. T; e- M$ d+ JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
& o- L" ^8 Y0 F; j** Set the serializers, Currently only one serializer is set as
$ r& j- D" C6 t/ Q# Y# }** transmitter and one serializer as receiver., w: q( N) l D' z% G. `6 M
*/
9 E! I% v$ L, g' c0 C; H8 XMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);2 `/ n$ ? n9 \! z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*5 R1 r- f$ [/ x
** Configure the McASP pins ; ~+ |1 B @8 v9 W8 |2 G
** Input - Frame Sync, Clock and Serializer Rx
; P7 M. o1 w: Q) J. q( b5 }** Output - Serializer Tx is connected to the input of the codec ( ^6 U; K" k4 ^' `& t
*/
9 W2 [' C5 r# B) T- n6 hMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
8 A0 C! j7 s* r" C. `McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));3 v0 u: y7 `& Y; s
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 ?( L. q2 W7 a| MCASP_PIN_ACLKX
$ v5 M& f0 r4 z5 ?- p% e9 T* W4 s7 l) Y| MCASP_PIN_AHCLKX0 C6 |( d2 ?) j( s; Y
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- U* O0 `8 f* m3 Y' y; N5 Y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& O# r( R' `: F| MCASP_TX_CLKFAIL
1 c; U4 x, L: S# _4 ^! s| MCASP_TX_SYNCERROR7 v/ C* v `% ~: E# N
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! g2 d) r; ~2 ~5 w& Y
| MCASP_RX_CLKFAIL' ?0 Q5 Y+ b1 d# W2 h# m2 {
| MCASP_RX_SYNCERROR
6 P* o' J! }- c! Z# w: Y| MCASP_RX_OVERRUN);
2 Y- q5 {6 p) a& |# `} static void I2SDataTxRxActivate(void)' t( K! L u2 M7 w' n+ c# ~' u
{* c1 K# X0 @; Y1 q& _) K
/* Start the clocks */) K. W1 M' s. u7 S' P( V. ]
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);& } E( z! J% s8 T. O
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
: F- r9 t* _4 v( pEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 u) f' S. m+ [EDMA3_TRIG_MODE_EVENT);
, }# n3 _& {; i9 f& f% dEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 e, x) d; s) B+ l6 |
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% ?2 v) j$ J! L# g# G+ e" b
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* E: L! c# e& c1 E7 k; DMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */( j7 S: s; v7 l2 j0 ?
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
6 ^" [( d( w& v% _McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* x/ T; X. X; i& J7 S$ pMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) D2 P. \% l" {1 C, X
}
- J0 t: k# Z4 s9 V$ l请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ( K& U0 q; }& m# R
|