嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,8 Z" i8 n9 G' f$ [! s1 F4 @
input mcasp_ahclkx,& b8 j/ U8 \/ K& t5 j
input mcasp_aclkx,
0 a( K1 s( {" @$ h( D$ ninput axr0,
8 x9 K, \& p* I; ]3 @, ]$ t, z E' n1 H+ _, @, ]/ q" `
output mcasp_afsr,
3 r1 I" z$ L4 z9 n' Z; F2 boutput mcasp_ahclkr,
# x4 s! p% A0 o0 W/ Q* i) uoutput mcasp_aclkr,
; _8 q, X# H/ e$ ~, r) R% K: Xoutput axr1,
1 [) U) V& ]3 M
assign mcasp_afsr = mcasp_afsx;" I& a/ \7 j0 a# W$ L
assign mcasp_aclkr = mcasp_aclkx;3 b( a4 S0 ~8 ^# f
assign mcasp_ahclkr = mcasp_ahclkx;
' d( P+ Y% c c0 Aassign axr1 = axr0;
2 ~- h( P5 A; r$ n1 n, f {! ] R2 _) v! F
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. Q7 ^2 x+ o0 u2 P: Y$ {
static void McASPI2SConfigure(void); O" D& e) C- S8 f7 t$ M
{4 W. u; T8 ]/ K9 `6 X& N- q+ W* e
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* f2 C# N' ?9 yMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */8 T/ x3 U1 m% p! h
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 `0 N4 I5 ]7 u$ i* x5 n! ?McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
) B. u5 C% s* T' C8 n& Y' o; AMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 L" M7 X! @3 X4 O& h
MCASP_RX_MODE_DMA);
! E- w/ w8 T) a: m w) l$ KMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, S- ]- A. T7 _
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 K8 w7 I/ S# \" A
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , B, W7 i2 v1 W9 J( A& S
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# J( [' C O9 _McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 u4 B- c- B6 f, L& G
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
5 |+ R' ^2 D( x/ h9 T7 s9 rMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* P8 D2 N0 Z4 w6 X- P# E7 t1 C
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( Y1 A( l* i1 n5 V8 B! L! D. R
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
, H3 }0 G3 Q) |' z, Q( O3 z# t0x00, 0xFF);
/* configure the clock for transmitter */
/ N5 A( A; ~% k! }& YMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 _7 A7 C! C' r4 s0 D% p
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 m' l% F, X* Y v. W
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" C9 c, L( F% k7 p! s0 M% P0x00, 0xFF);* m+ F/ j& E* l
7 L- A' U0 |* t, r& j% L/* Enable synchronization of RX and TX sections */ ( I6 d s; b8 q% e
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
: N; a6 g1 b" z4 OMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 i, W$ B, A% XMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
- n0 c/ I: T1 o' [** Set the serializers, Currently only one serializer is set as, L" E( Z8 t- c
** transmitter and one serializer as receiver.+ I, Q& c' O6 D6 a* a8 \. ~- w
*/
7 G8 I$ h" H! n0 G3 Z6 D: Y- Y+ E0 p, ^McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 T# F$ q$ v) b1 N! U
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
, w' I, h! s H+ f9 b/ T1 r! u* T** Configure the McASP pins # @- H8 ?9 N4 N0 H4 Z& K
** Input - Frame Sync, Clock and Serializer Rx& F8 H* i6 ?3 M H8 R
** Output - Serializer Tx is connected to the input of the codec & A6 O7 g& m, g' K! ]: u' _: m
*/
b8 z+ v3 e3 U+ VMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); ]8 C1 x& \' H. U5 R9 n- w, V
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! L7 W' c( j' I" oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 I! H# N% l, u) B
| MCASP_PIN_ACLKX/ O4 U4 a7 L0 V, b/ @+ }
| MCASP_PIN_AHCLKX5 V6 ]+ l& W6 ?3 {! C
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
+ [- x! Y) H& k h8 w: RMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % f4 h. C6 G( g1 O9 k% ]
| MCASP_TX_CLKFAIL
& f/ Q. ^6 q ?% a9 S| MCASP_TX_SYNCERROR
. T; c X* G+ _1 o9 b1 P& T$ T; u| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 W# s2 {2 m+ B) |' g) f9 Y| MCASP_RX_CLKFAIL
' c: x8 J- n% i% \/ r| MCASP_RX_SYNCERROR 9 h5 G" |4 Q( Z; y- L9 f( T& V
| MCASP_RX_OVERRUN);( L9 J3 y+ m7 r# n) o- A; i
}
static void I2SDataTxRxActivate(void)/ {5 v0 R6 O% q2 ]! p2 M% t
{' ~$ M$ ]5 f' d% q7 D
/* Start the clocks */. Z" N2 R' n+ Y3 w1 \& n& Q3 j
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 C% q# I2 k$ t% U! D
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
, G/ L. g6 F' p, T1 j" M NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,$ R. W& P7 j" u- T
EDMA3_TRIG_MODE_EVENT);/ y% g; T0 t# W3 P# Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # t+ W4 L3 `, z# Q+ |
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */8 ?" ^, ?# _1 D3 I$ d: Q a l
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ |2 J8 W) F* Z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */, K+ F5 u, `( Q) ?' g, e' }
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
+ x6 P9 A3 U! LMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 f( l5 d; _8 oMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);* s! S; \, {( O8 |- @$ v8 N+ K* {
}
6 n, X! Z9 t4 o( F4 ^: b& Q5 x
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& ~. y$ n9 N( O* H- r! s; y. O) T; h
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |