嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
* n: [: I' O4 H% u0 |3 |9 C% `input mcasp_ahclkx,
3 ^% p1 Q7 m/ r0 S2 `0 C: ?input mcasp_aclkx,/ n% B, R% ]3 p( j/ z; N# X
input axr0,# |& a! E ]8 q) y- E
% X2 j) \6 q9 c& L3 loutput mcasp_afsr,2 X' P4 ~( C0 J) T
output mcasp_ahclkr,
7 u9 s( J2 l2 I, F5 X+ Moutput mcasp_aclkr,% ]8 X" Q0 k, v6 h
output axr1,
9 L' @) k7 y; d) G3 c0 t3 g# i
assign mcasp_afsr = mcasp_afsx;. ^9 a# S5 c) ~" a5 t7 z( R# _+ ^' `
assign mcasp_aclkr = mcasp_aclkx;$ y. J" n0 `# P1 `
assign mcasp_ahclkr = mcasp_ahclkx;5 h+ |1 L7 R' ?+ l/ g
assign axr1 = axr0;
* _+ X. J7 V4 p% l
2 f$ S9 C( Q( B1 p8 z+ i$ I# i在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( j# v' j6 ?9 K5 S
static void McASPI2SConfigure(void)
, G! j9 g, U9 Q, m9 K{ w* {0 P* X& e# @2 W' V
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
: M+ @, k/ @+ TMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
6 ]3 G1 O7 u3 GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);( v ?3 E# d2 n
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 _, J0 p5 Z: ~
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 j* T3 R3 H2 l" U) c, }MCASP_RX_MODE_DMA);
* l7 u/ S) \7 ~ w& [McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 r$ I: U+ G, [/ n7 `! [5 e3 c
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ {% H" S: T7 y: D; JMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, |7 j2 J$ b: m8 m
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: \4 @* E6 J7 `" J) |6 G5 C
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- }! `1 {1 g: FMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
* _( i0 Z5 T E( U7 |( sMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" ]: Y9 ]3 ^3 m4 g( p9 R
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 P3 J( Y$ g, r' iMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; n8 }1 {% V4 t) Y+ {, t5 q$ ^
0x00, 0xFF);
/* configure the clock for transmitter */
) e4 H+ L/ s; i0 i+ T F8 YMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' J4 V- v# @! d# M3 V: O6 [McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 p; N% J; X. v0 \; HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
2 ^( K; f) V" }0x00, 0xFF);
7 b- _" C4 P% B1 v' }" B9 N/ G) O' M3 Q; e/ l
/* Enable synchronization of RX and TX sections */
$ L9 Z) Y/ R" ]7 O$ wMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
* V2 z$ Y( V NMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 G8 d" z/ ]; n! vMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*4 i z) n5 c9 F) Z: j7 b% l
** Set the serializers, Currently only one serializer is set as) h( @" R( q3 U
** transmitter and one serializer as receiver.
1 \2 t1 f( N( V5 ?$ q*/
7 ?7 c# X3 C! y/ Q! GMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% Z/ N; z1 }. o; Z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
4 z) f" f9 h- A** Configure the McASP pins
$ x9 J+ d1 @3 q. ^% h& p$ U** Input - Frame Sync, Clock and Serializer Rx
, d {2 U) C4 d b** Output - Serializer Tx is connected to the input of the codec ! G* q, I; j+ E4 g u r
*/
6 \ F7 t0 r/ x0 W1 s' TMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
, E5 H0 `8 q, X$ UMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
/ Q' C; N% @8 B' e; WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( H; E5 Q5 I6 V/ Y; G9 Q
| MCASP_PIN_ACLKX
6 w& w+ Q. Y! P; k% Y$ l, P| MCASP_PIN_AHCLKX
! H( v5 m- B. V3 R| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */, Z1 A1 z" u) d" O
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / F( l$ A9 K* H1 r
| MCASP_TX_CLKFAIL 2 G7 ^- t4 Y# [. N6 o8 n
| MCASP_TX_SYNCERROR& [! p- y' ?* b7 I
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 0 i& ~# Z d' t& f, G
| MCASP_RX_CLKFAIL
4 I9 N; L: k5 p1 n% X| MCASP_RX_SYNCERROR
4 k2 G; G; L: O4 R7 ~| MCASP_RX_OVERRUN);& ]% G& }& A; D2 n1 Z
}
static void I2SDataTxRxActivate(void): N' p" ^, Z. ]! ?. u8 U( F a. [
{
! K0 Y y/ N' H; T$ \' S/* Start the clocks */
; A% [. l1 j8 Z9 gMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
s9 y6 r$ A" o2 D$ S4 Z1 aMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */! i2 i9 h+ S4 s7 r7 h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 `! c# k: y$ i& b3 [, c* a2 }7 bEDMA3_TRIG_MODE_EVENT);
6 d0 k% y- c4 K9 L6 FEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( A+ b- E; Y9 G8 H3 y3 `: b
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */* L) g6 @* Z" b+ I) b1 b# M2 q+ q: ] F
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: g5 M U3 k. SMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */" l; ~ G7 d) z. j5 M0 l
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
9 m8 x: X6 R) ]5 g* |" K# _McASPRxEnable(SOC_MCASP_0_CTRL_REGS);; K* S5 c. b R; |& k3 V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 a5 I4 ~8 N, I5 ?}
* b2 T! z! N' N& W& Q
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
p' \+ g* {& L! }" M! c& ]! W( y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |