嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
' [6 t8 \) h& M" j. oinput mcasp_ahclkx,
$ \% y6 j6 R* Hinput mcasp_aclkx,
2 a+ _& F4 `( O9 i, jinput axr0,
5 E2 {5 `: m5 @6 H, p' p7 E$ u
2 l7 U# {! a( j! I3 c2 v' ]6 ioutput mcasp_afsr,. ]2 g' O- N: k ~0 t
output mcasp_ahclkr,. `& l: V1 ]; V3 U( o t$ j7 B
output mcasp_aclkr,0 v w; t+ ^: ?: i9 }$ s& ^9 S
output axr1,3 x$ N/ f# l7 n
assign mcasp_afsr = mcasp_afsx;; c G0 \& K3 i! y; {
assign mcasp_aclkr = mcasp_aclkx;
5 v0 y, ~7 R/ k0 A! Bassign mcasp_ahclkr = mcasp_ahclkx;4 H1 }) c: g: V& N) I
assign axr1 = axr0;
5 p0 f7 q$ T8 u# }0 g
3 n/ @5 x# |9 F: M7 w8 Q5 ]在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: d; L9 l# G% S" z( n) Q$ P% S7 n- M
static void McASPI2SConfigure(void)3 Q$ v" d; @/ n
{, h) M+ {+ a/ x+ w
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 [: P% I4 x/ T5 ^' iMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */3 v# j2 F9 W. a
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 f( M$ I- f: @5 FMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
# E O: x1 [1 s* s) _McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! K# d; B& _6 U, Z2 R3 O! GMCASP_RX_MODE_DMA);
8 V* ^, }9 Z8 [* q5 O- Z4 oMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& V! Q3 _$ E: V& [/ m
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' t/ u/ s' B2 M, F) n( c* wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 X( {) V" j( R" R3 \MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 |: \# c& _, a: ~% y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - E7 v9 n& K% X- l3 o# l' K8 _' |& t
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */9 \2 p3 U6 S7 Q
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( k6 a( c- A: p- K
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % F0 R3 Q5 O8 j" |3 @) a7 j! o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( `' |* g j. V* U
0x00, 0xFF);
/* configure the clock for transmitter */6 W9 `4 v0 M" p% t& m
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! g- X7 a& X% L4 y* T; P3 U$ f" SMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! p4 g& D$ V5 q/ F4 W" W
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
7 |/ s8 o! K! `+ G& Q0x00, 0xFF);' V2 X6 a( j, @2 I& z4 P \
5 c) Z: [, {$ g/* Enable synchronization of RX and TX sections */
[+ L+ \" D: L. OMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
( S6 _/ M; B6 u% `1 G! p; p0 t1 F2 Z" ^McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' g+ [: B/ q, Z# P) D3 aMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*3 {$ |& ~# I N# X5 H
** Set the serializers, Currently only one serializer is set as
3 I7 u8 D) {; {, H( O% G** transmitter and one serializer as receiver.2 ?" h! Q* n" S
*/
: M; a* O1 I" F' A( l( `McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 j: ?6 i. O9 \* `
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*! p6 @* u7 y6 e4 B5 C# X
** Configure the McASP pins ; v/ [/ w7 }$ f2 B
** Input - Frame Sync, Clock and Serializer Rx
% E# H- K J3 B1 h3 x** Output - Serializer Tx is connected to the input of the codec : D. X0 `1 M6 b0 M
*/
- i( s' j& ~0 W6 I0 Z; s M0 lMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 e2 ^& Z$ v, V3 y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% A) A2 @& ~7 u: t) x# ~! C6 a; `$ a
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% G7 L9 `$ z* C- q! M
| MCASP_PIN_ACLKX
; |0 |% [' \) A9 M s8 M3 I| MCASP_PIN_AHCLKX
0 s- B& s/ d9 H" m| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */* I6 P5 N0 q$ R. |5 ]1 h
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ V$ O$ F' f) D% o* _| MCASP_TX_CLKFAIL ! V8 G! J7 }" X1 C
| MCASP_TX_SYNCERROR, X) c- u' z' U9 A) a' h
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # I1 n/ _, W+ f9 v
| MCASP_RX_CLKFAIL' i/ A6 |& b! h( W, {. g
| MCASP_RX_SYNCERROR / P2 p! \# }$ d3 R+ M
| MCASP_RX_OVERRUN);. M5 ~& |5 Y; S1 h2 @
}
static void I2SDataTxRxActivate(void)4 S0 W u3 L" G; m
{
9 N5 N: z p$ T. g1 O8 V- T6 Q/* Start the clocks */
4 d& e, ~8 I, H' u) ]4 Z. qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 w* t+ }: c& [; H0 Y7 v, u7 dMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
8 [0 x5 ]" t9 h* k5 f. i& q7 aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 e$ n- O$ N3 u5 a4 J" V; Q; W
EDMA3_TRIG_MODE_EVENT);
8 K! ?' x3 ]1 u7 `: h" f% Z0 _EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ J9 t" \, B* O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
3 V* n8 k. K$ X% L' T+ gMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. i9 s8 E" V8 L# zMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */& e, l# S: l& A8 N+ a9 w
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */6 U- B! K( L) o! w! j
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);# _ B) O" b5 |) R% |, o9 _' S
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);& D; |" j" K5 v% W
}
! j# g5 E' ^& Y7 f请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 L) I6 B' J& z7 E/ _
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |