嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
) t/ [# Y( I2 @4 Uinput mcasp_ahclkx,
0 V5 s; r7 H% u6 d2 Vinput mcasp_aclkx,- F7 Y" a) m% o2 Q7 V6 n2 z7 ?
input axr0,( T$ H7 _1 T" ^$ D9 G }" Q
; \" W P/ q& G! T: ?4 @- O/ Y- P
output mcasp_afsr,$ j5 A* {2 }/ w. |" O+ f2 S+ \
output mcasp_ahclkr,2 J" y' g+ u" ~
output mcasp_aclkr,' z. F. Y: u, G6 g1 V7 Y: Y% r; M
output axr1,
/ S5 {0 Z" z6 S" |5 I7 N5 |* Y
assign mcasp_afsr = mcasp_afsx;
/ f" P/ a0 j9 Z7 j; l+ R, [assign mcasp_aclkr = mcasp_aclkx;' v; u& D/ q; d
assign mcasp_ahclkr = mcasp_ahclkx;( }! c8 ~0 G, D+ l3 X
assign axr1 = axr0;
) S2 c' c& E& i0 x; ]: S
" n5 W, w2 W6 x8 m9 D+ R6 L在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
2 `0 t8 M. m' [, R* `' xstatic void McASPI2SConfigure(void)
* N9 `- T- g, D/ L, |& {{* T* Z7 o- z' m- O& ~8 S' y. @
McASPRxReset(SOC_MCASP_0_CTRL_REGS);7 ~: `2 L5 K8 E! Y( a) o! Z; ^2 ^9 |
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
. k6 L( d# F# J/ R, ?* a1 w. H9 uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 Y4 Q- {; X4 \) [% G
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
, x) `5 b) k6 z a+ N t" FMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* L" C+ M' H4 b2 O9 d, A/ Z( uMCASP_RX_MODE_DMA);- s: f1 W2 P ~$ E+ H. Z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& }( U1 D) }. g8 N3 e" ^MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 _: }( |4 \. q9 Q6 Z6 sMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; P% t' @ c9 l- N
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! e' E# Y1 n2 v" s! ~7 r
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # ~; g# W' y2 W5 V1 J% \2 Y. _- o
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
0 T7 d, L, M; A" r) h hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' P0 G. {2 L: |( FMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 d1 r5 h* s0 p5 \" @5 rMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, }4 }1 n( I, J6 m; i
0x00, 0xFF);
/* configure the clock for transmitter */
' Z0 S, v7 `% v3 L0 P! yMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ G- V4 c# _+ L; i) P o4 jMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ ]% l8 i4 @. b* RMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( w, [4 i( i4 e+ ]) [- j. X! c1 C
0x00, 0xFF);+ Q4 @9 t0 p6 ?6 Y4 a
! G g7 a" B% g) w4 c. Q5 t/* Enable synchronization of RX and TX sections */
! J' Z& ^( p/ Y9 qMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
6 n$ \: v5 S2 F+ fMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ F. ? D9 H2 _! s, T! }) o
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*7 }0 V' X0 Y; G( r0 a% M
** Set the serializers, Currently only one serializer is set as8 Z# [3 x3 N1 w8 N* }, i0 a0 h
** transmitter and one serializer as receiver.( }2 X) d# w' E3 G/ z7 f0 I6 m
*/0 Q% k4 M" Y3 j# n
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& }# B P. o1 N: cMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
+ }$ u/ z! M+ S7 j- M7 d** Configure the McASP pins
& j. P4 p/ g' G5 r** Input - Frame Sync, Clock and Serializer Rx/ c. `+ U1 H% C8 b, B z
** Output - Serializer Tx is connected to the input of the codec % L6 j& x) S4 s. A% d3 _
*/( ~; ?0 c v- I- i
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 R& D& W4 H: S/ jMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 @3 c. Q/ `" M) N/ T0 ]; C8 Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% s1 o9 b) n2 B( m( q: N4 u2 x
| MCASP_PIN_ACLKX1 W2 d8 _' _5 G
| MCASP_PIN_AHCLKX
$ W5 z' [* T1 z6 }| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */5 M; a( z2 t% z' v5 Y+ O
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 c3 T( w3 l# `+ W9 {; l5 Y) A
| MCASP_TX_CLKFAIL
$ U! a* @9 D5 z; Y: W, @) A+ \& Q| MCASP_TX_SYNCERROR
2 ^5 [, u$ \* k D" Q' X| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - B5 C' \! s5 P7 s1 J& Z
| MCASP_RX_CLKFAIL
+ e/ O% a$ H5 f3 Z+ T, I2 r5 q| MCASP_RX_SYNCERROR
: E' N+ L* K- r" m| MCASP_RX_OVERRUN);
2 B/ w" R( a3 `7 i6 V}
static void I2SDataTxRxActivate(void)
5 B6 J4 G' v( H: P{
0 O8 K6 f8 x, |6 c8 A9 _/* Start the clocks */
1 ?. k, H% o/ @; w( R3 |McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ W. Z6 t$ D C" e) YMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */5 ^* `" I: V& W3 \3 E" m( j5 ]( H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! P$ o. P* M% k# o1 G7 DEDMA3_TRIG_MODE_EVENT);
& d& F" x1 \* m& B. ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! t# O$ s# q# ~3 @4 f
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */6 M0 @. s D! m
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% C( L! ]2 }( ^; t l+ B
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
; S1 [1 k& w* swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */2 A6 H, x! ]" N& A3 o- P& s
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);( a0 A$ q9 [7 D) x: [1 V; [; }, c8 B
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; f. y# m5 n/ a}
) o) N4 r! }& M2 e/ G2 A* Y
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# d! n4 ?9 j& c+ |, w
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |