嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,' p5 e2 j7 `2 {
input mcasp_ahclkx,
1 f9 H* p7 s* |0 e9 }$ Cinput mcasp_aclkx,: J. [4 m% _- \. t2 s0 v' Q
input axr0,
2 p/ Q: Y3 D8 Y* r. P8 o8 A1 L$ K. X; a4 ^% {
output mcasp_afsr,
6 v$ B$ q: z" Q- ?& Boutput mcasp_ahclkr,
% U( k2 p' d: N; ooutput mcasp_aclkr,9 A8 l4 r% n4 d  |; C, y6 S8 J0 G
output axr1,/ {3 n/ _( A2 ]' z4 _
assign mcasp_afsr = mcasp_afsx;
$ X( F6 m" u! c& X. ^9 Bassign mcasp_aclkr = mcasp_aclkx;4 d/ |0 I  E2 V6 c6 L
assign mcasp_ahclkr = mcasp_ahclkx;7 T! {; t/ j# Q) K8 J9 F) U- L
assign axr1 = axr0;

, l# H; s, }4 j% e, r' }7 G" O' w2 E4 L/ O$ j/ ~: L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
, w( ]/ }6 N6 w+ A8 ^
static void McASPI2SConfigure(void)# _0 X! ?0 }* I/ ?$ _4 A; a
{' n8 p, k6 f% R& t. e
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 u/ O9 I1 T- N9 }" jMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */! e/ _! Z  G& s8 @
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, F* I. a4 M/ s/ q) y* w  o
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
) A( b8 F' s6 e; J2 mMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,  E! E9 o" Y2 g& `/ D6 i$ o2 x
MCASP_RX_MODE_DMA);' w0 Q/ j3 s3 N( |2 `: ^) M& h
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,  C  D/ g9 k8 O, z
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. q) W* A7 o2 {1 k3 y! qMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 a$ M. [# d- {* M2 r" d- S8 g% uMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, R$ f) l* |  j% \9 M" g
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! f; w0 E# O3 x  k! S3 ]6 }MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
5 b0 a& W3 }6 t* C' Y; d: Z. mMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
4 e8 y& }0 P4 gMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 Q/ f3 i2 ~5 }; Y% ]
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 Q  c: a" o  J
0x00, 0xFF);
/* configure the clock for transmitter */
4 ?. U) b' O* Z; {' ^McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% k: P  k) v/ @! t/ v6 X5 KMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 T( _+ S7 L) F1 Z9 _2 K0 OMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
& q. x+ u; y+ k, C' H2 b+ o: B7 v0x00, 0xFF);' Z1 L  O! Q0 G8 b3 E( W

  k+ \/ A" }6 c" s1 F9 q/* Enable synchronization of RX and TX sections */
, V" }- M9 y" H2 g( ~1 ~McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */) a( k0 T" z* @! t. I2 i: a
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 d5 _! f3 q/ k" OMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*1 X% Y4 K9 z+ _4 \
** Set the serializers, Currently only one serializer is set as6 e, f+ p5 n! z0 u  g2 x. _
** transmitter and one serializer as receiver.
; j$ f/ `1 X$ W" E% Z*/
" r9 R+ `0 V! \& q/ ^McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" s0 {9 [( k- l. M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*9 g2 c# y7 B; w/ _1 n  j8 m
** Configure the McASP pins
* `0 A6 S4 P8 i" l7 k** Input - Frame Sync, Clock and Serializer Rx+ u' v6 }. t2 s+ \
** Output - Serializer Tx is connected to the input of the codec 8 {1 r- @: z# Y' m
*/
) k# H% l: K: F- WMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: w" v0 R2 H) u/ c3 NMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( H2 d3 s0 J+ k6 {3 N
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
  c4 N; ^+ |; I. |  D3 j| MCASP_PIN_ACLKX4 V" F8 O" u4 o
| MCASP_PIN_AHCLKX
4 x+ }0 ]4 K0 t, X| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
5 A5 k# g" |, R( [2 ~; `% EMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ a0 Z2 I! f- L' g) j! i
| MCASP_TX_CLKFAIL
, D) J" `8 u- Z+ A1 \| MCASP_TX_SYNCERROR* x5 Z+ O) j: O* Z, H: C" x
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % |, u$ v; f% ?5 G" K9 U5 z" O
| MCASP_RX_CLKFAIL6 l8 f6 ^! K( z: A
| MCASP_RX_SYNCERROR
2 R# K3 v5 A. O: B| MCASP_RX_OVERRUN);3 ~7 u0 V' C5 ]9 l9 J9 g4 G
}
static void I2SDataTxRxActivate(void)
+ |% ?# {( I. C1 S7 S  w{0 A; V+ M" ~7 V+ e
/* Start the clocks */& Z- Q4 Z% X5 X
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);1 [6 S4 Z  B  z7 C" G
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
+ Y% }5 S# u* j6 REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 W' x% R2 ^3 {
EDMA3_TRIG_MODE_EVENT);. e9 z9 Z" C. C$ W- E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, [! h, l1 w9 K/ C* ~) _+ IEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
$ Y" t* Q- \- Z: R8 D9 g( {5 j0 bMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: m& Q2 Y+ ~! S8 LMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
+ K$ y, W, s) X8 rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
8 N" E6 D7 `& o# M8 o- T, R& wMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( x, o4 o; c/ `. @McASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 w7 C2 X( D! @2 v- }% t
}

1 A' U+ c8 I9 [* R& n6 \
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

# I5 q' `% V$ p




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4