嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
; g$ \" C1 S! i( ?input mcasp_ahclkx,
8 |3 F9 q- P' J0 ^ jinput mcasp_aclkx,7 _- ^( X/ S, s5 ?9 f, A
input axr0,
# g- L( ]3 X; w3 ^, n, }0 n4 }# B
8 M* Q+ k& E3 s$ B, F! i, Toutput mcasp_afsr,% g* f: x K/ Z& B. p
output mcasp_ahclkr,0 i$ I& P- x* O8 {( N7 V& e- b
output mcasp_aclkr,1 h( f; Z. ]0 }4 c5 z' F6 \
output axr1,( ^1 U+ Z% B4 \% q5 m0 g
assign mcasp_afsr = mcasp_afsx;
2 _% c* _+ L4 r; i5 r+ n# d% sassign mcasp_aclkr = mcasp_aclkx;* n# Q* V, N+ X5 z, `/ l+ C
assign mcasp_ahclkr = mcasp_ahclkx;
0 v, `, F9 B) g" u: Y% h& Zassign axr1 = axr0;
- u4 y- C+ E. C' b8 m4 Q; t+ f2 c5 } }6 v/ F* C; v% i6 K0 i9 [
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 k0 I# y/ e6 ?, b* ?; A
static void McASPI2SConfigure(void)* l. T/ {) L% a. r) t6 U
{8 s, K! @& u9 U. S( J1 z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; t0 ` Z a" B) e& x5 m8 t+ `+ AMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* I) S. |; @* S9 ]. h( LMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! J- Y3 V' G2 c" \
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
, ~# G/ o7 W! z. g" m7 W* VMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 \( ?4 E3 r% q: a$ k
MCASP_RX_MODE_DMA);/ K q: z% q7 y0 l5 J6 U& E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 D! U2 D6 J2 c* x: R$ X4 p
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */& d8 H+ O. ^+ m2 w3 v1 e2 t
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 n8 F2 I$ Z. r) G1 lMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 f$ I/ S, f& q7 Y9 p9 e- P1 Y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % q* M* R6 }7 E: ^0 U
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */7 x& `9 e }8 J r( q0 A: Y. e
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 k9 @* X% p- l" }4 o
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); # e) N* F5 ?: N: N" n
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& t; }+ E: J9 _6 `# Y0x00, 0xFF);
/* configure the clock for transmitter */" H8 K/ r+ o v# F+ \
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ _* v% a$ @+ m0 W( a3 jMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; h1 K, ^2 c8 P
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& x: L; a4 g' t' [( j5 L1 m$ j
0x00, 0xFF);* K1 r- a1 b. Z! q8 d! n' n+ f
% B8 c- ^. x4 E6 @% `/* Enable synchronization of RX and TX sections */ : f) Q" J. L/ q* D" ^; Q& S
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ d3 n; [4 l/ i' B% w) m, s: DMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; F$ j0 ]! \3 T- K! c: v
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' O6 T- G. l; v! D% v. D* d
** Set the serializers, Currently only one serializer is set as
% G4 ]5 u4 M, _, }/ l @1 H** transmitter and one serializer as receiver.0 W& o/ O# c* m8 ^
*// o6 c' B, Y5 T V! Y3 T9 {
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" S2 X& \6 _$ }0 q
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*: Y6 l) Q ~ H. H: j
** Configure the McASP pins
- a; H0 x* |9 A) A, |** Input - Frame Sync, Clock and Serializer Rx( h/ D, k& u5 @4 C6 l. G
** Output - Serializer Tx is connected to the input of the codec
/ z& Q5 q4 c$ U3 _7 Z8 `. X3 y*/
3 E! Q4 C9 f% X" m+ kMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( g* d+ ?" b/ N# J) l/ k( i. EMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! e( P$ J* [; l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 F4 l( G7 m1 {) V| MCASP_PIN_ACLKX, {6 ?, Z5 Z5 n0 c- P+ W
| MCASP_PIN_AHCLKX7 P/ T0 T! j3 E3 k* y$ `
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
0 r( |6 G4 q* p/ r6 \" ^, TMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" u) X/ {( y# N6 v Z1 [6 d| MCASP_TX_CLKFAIL ) X, \/ R8 i" J9 T' O/ M& g) a
| MCASP_TX_SYNCERROR B* s# ?; n, p2 r3 `
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " ?8 \0 v& z. I4 W! v. ]$ W! B1 ~
| MCASP_RX_CLKFAIL
% Y8 C/ @+ i2 }5 o' H| MCASP_RX_SYNCERROR P2 `2 U$ o9 ]/ Z" o3 _
| MCASP_RX_OVERRUN);
; o5 Q! y- X, E t5 b% H: i}
static void I2SDataTxRxActivate(void)
. z/ |/ h: |3 p9 B! F{! y T/ d$ @+ v) ?6 g: T
/* Start the clocks */+ k2 P+ g) a& \) o1 P
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ p5 Q8 f. }' |3 Y* A5 f) c
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
6 l' ]/ G# n8 SEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 v# z( i5 o$ i, u( p
EDMA3_TRIG_MODE_EVENT);' {' e: ~# F$ q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % r% O7 S: q8 r
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
$ r# }5 n5 d- C% t2 UMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 ?! z( y$ l, CMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, T; s$ n) k3 n$ K/ f, Wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */, r: G- F W* C8 ?. y
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);3 \) C: O" Q- r+ o) S+ H9 }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
8 t# r3 p5 {5 e}
2 o( F; x! e i, }$ A5 \请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ i( ]: ]2 v( z* L5 C+ k2 a
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |