嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
, [4 ^( c0 w+ l& |% N; S- Xinput mcasp_ahclkx,% q+ i5 b& ]8 @ J' u9 K
input mcasp_aclkx,- _- p2 }! q0 p
input axr0,
" b: d# W3 }( c( O% f, P3 @" p% v
g5 [* `- H2 }* \9 Z$ routput mcasp_afsr,
5 b$ e% }: T2 n% H( I b( ooutput mcasp_ahclkr,/ W+ b" \- P9 D& N
output mcasp_aclkr,
+ G. B$ d! L& h7 }% Uoutput axr1,$ L }+ N' n% V* @- |+ {
assign mcasp_afsr = mcasp_afsx;
" C" p& M) C" Q y7 R1 P6 O/ Oassign mcasp_aclkr = mcasp_aclkx;
( _! y4 X' u9 Jassign mcasp_ahclkr = mcasp_ahclkx;
% ~3 b7 v5 _9 S2 k1 A$ y1 \assign axr1 = axr0;
/ W! Y( g9 }3 R; k
! L8 i* d: B8 g$ T: u9 P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ s* Q& S$ E6 f; f/ l5 v; h' X
static void McASPI2SConfigure(void): Z9 \3 K9 U7 D. n/ S( U
{6 M7 w6 Q/ Z. q8 q. o
McASPRxReset(SOC_MCASP_0_CTRL_REGS);; I. Z, F0 K$ U- v
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */: G/ V1 b% u8 @+ V; Q( V- x0 _
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 G3 w h7 z& {& O% C3 y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
$ o3 q( M" A/ i5 |* D( jMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( W2 Z9 C/ D2 t+ XMCASP_RX_MODE_DMA);& r$ m- X- M0 X. C' o" G: P, Z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# i4 b) P) m- d6 T- u9 o5 P
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: V+ g" C" `$ s, @. D9 rMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 ]4 K0 Q/ n+ r! L6 ~: p
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. Y6 j0 y2 `) m8 iMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 e- e8 W. \+ U/ LMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
* T4 N! o- a+ [( r% U9 r0 u, A5 gMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 V. ?# v @) n
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, A$ G5 e. s# jMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ w: D+ b e% J+ c0x00, 0xFF);
/* configure the clock for transmitter */; a ^6 @+ I- t7 p+ q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 S! G, c: l: U+ E* P' d% u; C
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& \3 Y8 P& m/ `" BMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- `" @! w! ~5 V9 I# J" e0x00, 0xFF);
* S# U% @( m# Q6 L% i5 S3 x. V' R$ l; [: P. S
/* Enable synchronization of RX and TX sections */ ; M9 N1 p( X& G. B
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */+ v0 m0 q" z% B* L8 V+ D6 a+ p
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, H/ {% J! V+ a6 K% P. k
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*4 S8 s( }" ~. M' W/ s+ ?4 y' g
** Set the serializers, Currently only one serializer is set as
- t# k, l: _5 @: T3 t$ p** transmitter and one serializer as receiver.1 A- r- I/ g( Q
*/
- Q/ A& C! i# C" \, dMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& S {$ X3 I$ u6 [* tMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
' P5 z5 e8 B, c7 c** Configure the McASP pins
8 D* ~! ^3 q2 Y** Input - Frame Sync, Clock and Serializer Rx
' ]7 D' s" f4 t) b& k8 a( l# A** Output - Serializer Tx is connected to the input of the codec
6 ~" y% T8 X: R1 k) P3 Q*/3 N8 b: N* W3 s: c3 w; U; ^
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" F. Z* k+ ]6 r2 B$ X5 J
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 B+ n: q: c, ~) j" AMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) H( ]" t+ K* ~+ ?4 O1 ^
| MCASP_PIN_ACLKX7 l4 H5 n) ~+ E( `' _- k
| MCASP_PIN_AHCLKX# J, ]: v! W% [$ c9 @
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
- L1 }) {/ S6 OMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. K& Y0 e- v# n1 E* S| MCASP_TX_CLKFAIL
4 A7 ?. G6 i- R( \* t' g| MCASP_TX_SYNCERROR( O- E4 ?3 Y9 a2 J- Q
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! C% p l, |' k* a6 R| MCASP_RX_CLKFAIL! @5 O5 g8 E, @
| MCASP_RX_SYNCERROR 8 A; Z8 R* c% j0 i8 F0 @
| MCASP_RX_OVERRUN);# Y* Y) t5 f3 S# n; ]) y+ p
}
static void I2SDataTxRxActivate(void)
- ~! `0 y2 U" U; b9 P{8 y' I) J" N4 A' J( L1 c
/* Start the clocks */
9 S0 I2 A" T- ?+ ]- _( `McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 e% |% X& l8 ^0 xMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
6 {+ \& `7 R9 E3 WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& R E' z" Q8 y8 P6 } Z7 q# lEDMA3_TRIG_MODE_EVENT);& V+ r' \" L2 C' w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , [9 {! k- y8 a8 s# b ^- \) x" q" a
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
& \" a& ^1 ?3 r/ E9 P8 O9 U, n0 ^McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; b+ R+ q; T) H3 T1 G: J$ b+ L3 \McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */6 o! O' B1 V/ ^ T9 Z* i
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
/ d' |4 p4 P0 L$ S+ dMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( X$ Q% A4 }$ v5 [2 M2 RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 H; D- \, _. r7 g" f}
~- [& X2 Z) S7 H. _' z请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 G2 v. f* T7 C
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |