嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,' L; o! X' [) p% _
input mcasp_ahclkx,9 W" A: n: O* j% Y
input mcasp_aclkx,
+ K) ]7 q; `: D- y- @; hinput axr0,6 E9 n( X$ H! h" ]
! W" T+ \1 r6 ?2 W5 W3 ]3 [
output mcasp_afsr,
# X- G6 k9 V) C8 K" Goutput mcasp_ahclkr,
8 r! W! _5 Q; n" woutput mcasp_aclkr,5 p1 ^) ^, P& f$ `$ l2 p* M' d- E
output axr1,+ g& }+ \7 x: P2 F+ ?# `! @
assign mcasp_afsr = mcasp_afsx;% r3 e `' J9 v1 Z" t- @/ \
assign mcasp_aclkr = mcasp_aclkx;
' |4 h7 H1 _5 L+ O3 u, M, R! I$ Lassign mcasp_ahclkr = mcasp_ahclkx;7 [/ B7 @* o" O7 |
assign axr1 = axr0;
* x4 ?! o" e4 u3 Q! ]+ c
9 @8 @! ^6 I( D9 J* Z- L- z# O4 o
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: b; o: L' [$ g: n. h+ Y& @3 y2 o7 R
static void McASPI2SConfigure(void)& ~* [2 |' d& g. ]! ^0 f4 s: R, C: r
{
% S. S# e5 y5 ~. I2 CMcASPRxReset(SOC_MCASP_0_CTRL_REGS);2 Y& G5 p( X" |3 Z A
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */4 @7 J4 J4 I& j& _: ^+ \; I \0 N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( q( P8 U" \# v. A4 b- y; WMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */% P) T# x+ N( K5 o: r4 Q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) t, u+ {! T5 p; C2 t5 y' u6 {
MCASP_RX_MODE_DMA);
/ t6 i, m# P! ^8 {McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" T3 w. z, k: f# r, Q: |5 N+ k4 ~MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
J# S! {- f9 U/ @McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # t6 A4 b- [8 H
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! j. `$ ~! D4 s9 k" ~2 d
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * r. K: ?, S4 x0 F) U, f; e
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */ c, K) v# K' `# ~+ o
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' c. A* _* S2 `' g* r5 r8 yMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 e' ]/ l1 J' I& YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
W! I2 r l E8 I! w0x00, 0xFF);
/* configure the clock for transmitter */
! w+ u" W. u7 V; q; l7 F1 xMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! J6 n( h9 u. K& ~/ F1 f8 |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! _+ v- o1 ?+ A1 A% ^# t1 ]McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- A% D7 M Y; l6 ^2 `- M0x00, 0xFF);
Z+ o& R) @5 q1 m
7 v5 ?0 B% D8 I5 Z" L) M6 e! ~/* Enable synchronization of RX and TX sections */ 8 j/ u# R* l& b1 U; N9 R
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */4 d( B) S4 W; O0 u( m7 [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 i" B4 Q. d4 \
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/* G* j, _* R# t" q) X7 B" d
** Set the serializers, Currently only one serializer is set as
+ }; M0 ~9 O, v** transmitter and one serializer as receiver.% G9 h! q4 W! z5 ~) D- O i
*/( Z! `0 q9 d S( Q- s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 r2 `, m9 I: mMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
8 c6 y' _% l4 o# F6 W" `** Configure the McASP pins
" J( W# C3 k# J* D8 e4 o** Input - Frame Sync, Clock and Serializer Rx
" v7 w+ s$ E1 x** Output - Serializer Tx is connected to the input of the codec $ A0 H# o! c+ k/ B9 v
*/; O0 c5 |, K. @4 X) G6 ?
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) a& ]/ p# ~) r% X, D$ b7 b5 ]8 T
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
- ?, m$ {: R' `( _McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ x# R0 d2 y, K% |. ^* I, k
| MCASP_PIN_ACLKX
7 @8 X* l. _2 Z| MCASP_PIN_AHCLKX7 ~! P6 ?* \' l) A) w
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */" x" X5 X" X7 K8 b" t3 L
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( l5 d8 ^6 K H- I$ b! P1 h; _| MCASP_TX_CLKFAIL ; Y7 u* `" \2 L0 w3 O
| MCASP_TX_SYNCERROR/ d; s/ T+ u4 N; D5 \
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- d6 b' B* J, @4 H# K/ Y/ ?$ m| MCASP_RX_CLKFAIL
2 d. C3 ]" {3 ^4 ?4 R5 p| MCASP_RX_SYNCERROR
6 p0 N" H! J. X9 ~| MCASP_RX_OVERRUN); Z# I' Y- w. ~( E# ?
}
static void I2SDataTxRxActivate(void)* N8 ]" r3 R5 x/ s* m
{5 n/ z9 T, l6 I# Y: E9 G i F9 T
/* Start the clocks */1 q/ R K* h: ?
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ g: l. ~! T" z; D( |. L5 \4 E) QMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 _: i9 O" [" f7 M5 u6 B+ b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 U5 i7 c0 \6 H. w5 j8 `% u0 ?EDMA3_TRIG_MODE_EVENT);; W T0 w7 J, V- H; J8 `- n
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, . Q+ Z+ l2 d/ K u" R# S
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */( ?% p9 @! x" Z" {% t& e5 z7 M
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. [+ Q2 |' @: H
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
' e1 b. [- k4 D* l6 vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */5 {$ R+ M0 E8 ~' G6 Q( @
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 D* o' X3 J3 z) L& _ m: sMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 r/ A/ s: o6 Q [}
0 n7 d# e$ e. t请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 a* e" w5 w- C& s) t
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |