嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
4 a6 V- F8 R. ]0 linput mcasp_ahclkx,
* e$ s% P6 R3 K6 F, C; w, a% ginput mcasp_aclkx,0 D* H: w: e& o$ L
input axr0,
% m( _+ N* f1 K7 ]# D- @1 h2 O9 Y+ L7 ^: ]3 X
output mcasp_afsr,
6 i, ^0 C/ Z) D; q& goutput mcasp_ahclkr,: \/ ]* F* n3 l6 u4 t3 |( P
output mcasp_aclkr,
( E( S: Q* K* Boutput axr1,0 g6 B+ S" x: c Z
assign mcasp_afsr = mcasp_afsx;& p* J! B h4 \- F7 `9 w* Z
assign mcasp_aclkr = mcasp_aclkx;5 p+ M ^/ Y5 U+ l" |
assign mcasp_ahclkr = mcasp_ahclkx;. @& R+ O: N; Y5 ]
assign axr1 = axr0;
0 j% w' K3 m) `
( N) H! I) L) q# `. S在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
5 @; J7 C, N6 Q" D% t
static void McASPI2SConfigure(void)4 ]# U- ^9 l J3 |$ d# w" f I; R" |
{
6 x7 g2 O9 m. K: H0 h9 ~5 BMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
1 D; @) H- P1 F2 `McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */0 u" w8 C7 S: `5 s. I( M4 H! H
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ \% S' K( A9 ]1 x' ^7 K3 a3 g' D
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
( o8 @- `! [# ~% Q6 `% T% U( oMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, X) `% `2 W: Z0 FMCASP_RX_MODE_DMA);# J5 {' t: m/ D; `8 H
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. M8 J4 \' i! Z
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 Y* g( b6 f0 _! k yMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 Q3 T6 E( ^: E8 O& D, u% K/ ?
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. w/ P, w/ a3 \- c6 o3 i% r9 s; p4 vMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! Y/ ~# R7 i2 Y, e3 m+ K+ FMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */! ]) A3 w5 \7 E& c8 L+ Q
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
Q3 J- @/ a8 g2 ^McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ c0 s4 T9 L0 Q& J8 o& v: l \
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 d0 r; K; ]: L& I/ o0x00, 0xFF);
/* configure the clock for transmitter */; K# _! z X) G7 O' t' d. s
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
) ]& @- H+ ~$ k. [/ eMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . j; b; \3 ^! Z0 F1 r
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% a s* q3 N6 c! c- w1 K- z
0x00, 0xFF);" x; d/ y4 }6 W& w
; y: q3 h5 b8 D! F) c4 i6 Y! U% f/* Enable synchronization of RX and TX sections */
0 Q/ [& O+ _0 h# w! C& zMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
- D% h: E: x! j! F4 HMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ B* [! H* ?+ T ^+ n3 ^
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
6 q2 X# V8 W0 ^0 o4 F9 M: Z1 n" K** Set the serializers, Currently only one serializer is set as3 l/ n, ~, `9 |# E! @5 d+ K
** transmitter and one serializer as receiver.
: e% ~# I1 [* c1 U- H*/8 v. g( y) u, |- J1 _1 g. m* v
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 Y2 R% h: m! w) EMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*7 B5 a- f7 G" A! p
** Configure the McASP pins : a0 j9 J( o0 O" ], W3 b! `
** Input - Frame Sync, Clock and Serializer Rx5 v/ y0 k1 c3 M) { A2 e6 i
** Output - Serializer Tx is connected to the input of the codec $ s& A' I: M" s3 W' v
*/
4 H$ ^/ T2 B% l4 H3 d2 U- K( NMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
4 m. `0 \: L o; n. N9 HMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, v$ |- F: a7 d4 i2 C0 b" q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 O$ n' v9 ~) \) n
| MCASP_PIN_ACLKX# @* ?' }* e) {8 M
| MCASP_PIN_AHCLKX
) U! R7 ?2 e1 S2 G3 w" W2 D| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
- Y ] H* Y; Y3 J) kMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! G4 b7 Z$ ` F) `$ _$ S| MCASP_TX_CLKFAIL
: E$ ^% t, z9 l! a$ s7 |7 K| MCASP_TX_SYNCERROR
9 w% m0 \& P1 {) {0 V1 J| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( o3 ?4 \( m0 W8 x" K( r3 W9 g| MCASP_RX_CLKFAIL4 c& p' ?. [. h2 y+ e$ g1 W
| MCASP_RX_SYNCERROR
- ^& Q) L- ]/ b) V$ [- @* u! j| MCASP_RX_OVERRUN);9 ^4 f4 @# V! ^, N1 \% @4 a
}
static void I2SDataTxRxActivate(void)
" q$ |" {9 a* U. o$ A+ @{
$ M" K! z8 a' U& ~/* Start the clocks */ ~# m ^1 g/ {$ ]. c( k, I) |
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" t1 q% `% n2 k- G" ~
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */% w" |( R; |: r8 k
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! r# c; ~9 U/ A/ n; o- c
EDMA3_TRIG_MODE_EVENT);, D4 q& R7 y+ V8 ^- L+ v: a
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 ^; N5 ~& Z; ]+ v; v
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
2 {: _* R$ |, }2 d' S3 pMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 O! T1 ~# }! M' uMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
+ @8 y( o0 ^! N+ }, Z6 v+ G! q! zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */$ _9 t) D# |& c. S( P! k
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);; K& `- ~, S# j' ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( ]8 N' v) ^1 I
}
) g9 T4 p. G9 h3 O1 U请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* e( I3 r" H8 ?' C! ^0 H7 _
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |