嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
2 ^9 N. D6 N4 |9 ~input mcasp_ahclkx,
! i A! A( X% Y2 f& W/ x _input mcasp_aclkx,+ ?0 C( N5 s8 y; L2 s; @6 g/ z' g m6 P
input axr0,. b* I% v; E- B, l. k. k5 Q0 w! D
$ |3 C8 e1 P6 d" o2 V3 y
output mcasp_afsr,
+ f5 C4 M: Z- U7 o/ o" ~8 k- Houtput mcasp_ahclkr,
/ R# m# \7 Q& z2 Routput mcasp_aclkr,. Z9 G( C& a: s7 D6 p% X2 a6 T
output axr1,( I- q. X4 [) d$ M" K
assign mcasp_afsr = mcasp_afsx;
, G9 _6 c6 g. I5 U, U( m0 g: S+ C" Jassign mcasp_aclkr = mcasp_aclkx;
- s, b$ l, P6 N, f( Z% vassign mcasp_ahclkr = mcasp_ahclkx;& |8 R1 R/ Q, _* ^
assign axr1 = axr0;
+ s" q4 \8 k$ F. r* m; M& o" c" K# }, ~ B- ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
/ T& {* N, L6 {1 ~1 k H& N3 |0 e
static void McASPI2SConfigure(void)
6 k/ H+ R6 A# B) _{+ s( t5 O* B& x& a& P% |( @ i
McASPRxReset(SOC_MCASP_0_CTRL_REGS);0 D3 r. N6 y% `3 P& v8 G
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */0 D+ U* {6 r8 ~' _) T& ]3 d+ u
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
) n! c9 _2 f1 g2 fMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
9 O L2 F- y5 t+ f% H" p5 g5 {1 pMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% V+ G7 ~* W+ T/ Y) i( I: pMCASP_RX_MODE_DMA);2 _/ C& r9 N8 n8 z- m
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
t9 B1 R7 ?" M: K5 q: O9 L; |MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
- x6 ]+ r3 R( o" r* g3 b: d" bMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 _5 S9 a1 F1 |$ H3 C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 ?/ L" |2 J- s% x' |
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ' N: r1 y9 I$ }* F8 ^ y; w
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
$ ^4 }3 S6 l; Z4 x% y, l* NMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( U2 w6 f Y3 M4 C) |# R' r5 FMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 r; ]! t# u" ]! l3 k; wMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, J, U/ S& d( X; j0 G
0x00, 0xFF);
/* configure the clock for transmitter */
; x, j% _5 w: I6 @( U8 n" kMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. ~+ n$ V3 p: F" ]) _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) p0 I9 a% x) U3 n6 C. j9 l
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 _% Z+ b9 h) }5 j" C0x00, 0xFF);* r( v- o1 ]/ [# m5 z4 a& X
0 \* A% a- U& p8 j$ g1 f* t/* Enable synchronization of RX and TX sections */
: p1 e1 V- L) B0 c) fMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */( Q( q. a) `, X s% a
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ }: h& B8 j2 qMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*$ M5 \8 k; b' b' N: [2 y
** Set the serializers, Currently only one serializer is set as) M) |0 X: ^/ F7 g+ g$ N
** transmitter and one serializer as receiver.
`) K& Q+ N3 i8 N; u*/
$ M- ^8 P8 ~! ]" tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: }! Q& g) ^( u+ UMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
7 N" q% e. c* L4 o; T& a8 h8 `* E** Configure the McASP pins
4 |& \. V; l" ?! t5 f** Input - Frame Sync, Clock and Serializer Rx( x- J( Q" S' A% @$ [
** Output - Serializer Tx is connected to the input of the codec 7 S2 b+ e* H, a* f% j) \5 q
*/% S2 ^4 i4 g/ I9 j1 z- x0 e
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* O0 X5 v! y2 TMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; J( F7 B+ b6 M. ^McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
, a2 {6 l1 {: X) ~! \! i0 c* r" b4 N| MCASP_PIN_ACLKX
V& m9 J6 e0 h: B6 d" g| MCASP_PIN_AHCLKX( w& m# [! o8 S" p1 U6 }
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */$ }* b: E! P/ X; q* ]
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 x" L( _+ N2 c' m0 Z3 G
| MCASP_TX_CLKFAIL ) a: ?$ z6 n; E
| MCASP_TX_SYNCERROR
8 z6 X: ^6 E2 t3 y- }( _/ I& V1 G }) X| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' Q/ o* t( z. ]# s| MCASP_RX_CLKFAIL
" [: C/ w9 K7 u| MCASP_RX_SYNCERROR
; C0 x# ?+ p) e) \) `% @| MCASP_RX_OVERRUN);! g, B, } i- v- O; v( j& u
}
static void I2SDataTxRxActivate(void)8 U9 _" C W( G8 p; m# c7 @' e1 n
{* O# S4 j$ g5 Z. v. u
/* Start the clocks */+ Y7 G* J8 D1 F2 C" R3 w1 F! _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" I( v% y2 P. ?' g' \8 j+ y$ ^McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */2 P1 q0 b: l A0 q2 D5 w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 \& c6 {7 d* R4 z2 C* @
EDMA3_TRIG_MODE_EVENT);* l) \8 G) x' e
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: {/ S2 O5 W& r: @& hEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */& @# y3 L1 n" ~9 x
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 v$ X1 k8 j. A; ~& P1 w
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
/ I+ L+ o. r( O; _. J* Uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */1 E+ Z& `, ?' ~7 Z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 l5 u8 J7 j7 MMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) y+ r* m- d, q. ~}
2 T& `9 u# z" m* J9 O' z; Q
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ q$ F- X& ?# V2 c Y \
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |