嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
6 u6 N6 v, {# V' Hinput mcasp_ahclkx,
8 }! p" o. _; R4 w3 Tinput mcasp_aclkx,
, X' W$ _( g4 R' `5 Z' R O6 Zinput axr0,+ b) S4 \! w0 Z& E d/ D6 C1 |
' i) l* y; \! d7 ]& H
output mcasp_afsr,6 R+ N5 P. m& d% p L" W% L8 O ]
output mcasp_ahclkr," p) h9 {2 g. K" g% F1 x
output mcasp_aclkr,
+ [) ?. n6 t- D# }0 @output axr1,
2 Y1 `+ S0 i- Q1 _
assign mcasp_afsr = mcasp_afsx;
2 m/ }4 ^$ W- {1 ?- G9 zassign mcasp_aclkr = mcasp_aclkx;/ ?0 |* \* N: [# [
assign mcasp_ahclkr = mcasp_ahclkx;
) N: ]" K; n4 N8 Tassign axr1 = axr0;
; h8 z" s& a& D& \9 |- i0 y9 }/ F$ O* M
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 `7 v5 |/ _ }( zstatic void McASPI2SConfigure(void)
' C* _ L9 S! H8 |{: O! Z7 F! c! Z2 a2 Q- N
McASPRxReset(SOC_MCASP_0_CTRL_REGS);4 t, e( M) f% ^5 n# q1 b3 y
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
+ ^) S8 q U( s7 DMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 L5 w5 K) M- N: y$ W
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 S7 ~6 x9 m# R3 `! m
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. t, `. M4 i; p) k/ r2 M/ f
MCASP_RX_MODE_DMA);
/ c. J# n# o4 ]3 ~, |9 f7 eMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ q- w) x* e2 c- k% GMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 O; r" M; ]# u( I4 c0 A+ o
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 x2 `' K9 |9 U; p: @MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ L9 m! ^2 T: F4 v& t! l! P
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! u& b* g8 q; X
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */, u$ s) Y8 _. G1 t' e4 U
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 A1 w" A( d1 i/ B0 `* f
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; R2 h$ @$ F# k Y7 T7 G3 WMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, n# G& Y# D. }7 K! k o
0x00, 0xFF);
/* configure the clock for transmitter */
# ` ?7 ?6 {2 V( z; R! MMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. M5 e9 T! H* {8 W( h9 E9 G) F
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, f8 D. Q( M3 `' i* j: t: ZMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,+ n$ Y, d% ^, @5 p
0x00, 0xFF);
I0 h6 w; z- j$ ?3 G
" O9 G( i0 N! d# [4 y/* Enable synchronization of RX and TX sections */
3 D& [7 a& `) ^( h5 j# j1 L3 iMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
% _9 v' _& Q- G5 _2 c4 X" bMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
{/ m" z& i$ EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
: j) t1 g) ^% a* j** Set the serializers, Currently only one serializer is set as9 \& @2 q- p2 r& z
** transmitter and one serializer as receiver.! v; n4 @* t1 n, c; O
*/% ^9 o2 v& \/ w" h5 R! \$ s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' K# L4 q7 b6 z. pMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
$ ~- z1 @0 _0 N2 T, `0 M, b* x** Configure the McASP pins
. a4 R+ D2 v' d, i. ~** Input - Frame Sync, Clock and Serializer Rx8 G, f1 v5 ~3 a" S/ _; J/ `, K
** Output - Serializer Tx is connected to the input of the codec
& o& w I2 d# n! G*/
( b {: x! P6 }/ F3 JMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) S- q* U2 z' l6 b
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 p' S4 k+ y- R( EMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 N+ o1 l b5 ~' V' A$ U) I
| MCASP_PIN_ACLKX" T/ a& w5 A9 ^9 o* i, I" H! C
| MCASP_PIN_AHCLKX
$ A, \% {0 Z% o! D7 N0 E| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
+ |0 z4 n9 T. c2 `McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 W9 z7 h$ ~ j" T9 {) s, r# Q| MCASP_TX_CLKFAIL , F5 c$ y) L5 N8 `8 |4 \
| MCASP_TX_SYNCERROR, H6 o+ V8 ~4 R. L' X6 @
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! R6 q" O) z* v7 W" g
| MCASP_RX_CLKFAIL
% K) ~. c$ h2 Z* l| MCASP_RX_SYNCERROR
1 t5 `/ z0 v2 T3 @5 k| MCASP_RX_OVERRUN);
: p7 l2 h) z) b- W/ n# p7 Q}
static void I2SDataTxRxActivate(void)/ F# V1 q2 z) w8 `6 [: r
{* H' y, D- x" y
/* Start the clocks */3 J# y# h6 o4 v- n4 q |
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 Q) U+ N, L( w8 I) |4 Q$ _( o5 C2 FMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */1 H" t9 K! r: @" i3 B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: @$ t: N) M: Y* }& x+ j
EDMA3_TRIG_MODE_EVENT);
3 V9 g& |- D) v5 uEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, y' N' j" X) Z) rEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
+ M* R8 H, Y0 ?0 N9 r3 z: PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
`2 Q1 C1 j$ [8 ZMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
% w1 _# |6 q+ R5 k- |8 g: [5 Z" T- nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */2 K: q6 B+ n' Z0 _
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
" A* I1 `5 g9 l) |' U# yMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 F# O; q0 C" @7 D- L
}
* h7 g1 o7 n5 E8 y3 @0 Q( J请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 A4 [4 Q% J- T/ J, I' r2 F
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |