嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
8 ^. T' K: s8 z0 T% F) Cinput mcasp_ahclkx,
) t+ i0 V, i( M+ `input mcasp_aclkx,/ z& W8 P8 k+ P# i' q
input axr0,
, L o& N9 a$ y% `# k# ^9 l- H, Y q+ `% V+ E# P" }) i! H
output mcasp_afsr,# _! w1 [/ ^+ z% d
output mcasp_ahclkr,0 a8 l5 Y" n, k# B
output mcasp_aclkr,% `& Z- q/ F. x! U! }
output axr1,! g& ^/ ~; w- w* C; L! `3 q
assign mcasp_afsr = mcasp_afsx;3 _' m1 Q; B9 Z* n- s0 F9 O. M
assign mcasp_aclkr = mcasp_aclkx;2 b6 N" f6 n8 [" N
assign mcasp_ahclkr = mcasp_ahclkx;& j) J9 F( ^- X6 h6 i) B' h
assign axr1 = axr0;
5 O1 w% v2 P- P* Z/ r/ H& ^% F
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
; E5 \2 t8 E2 Y/ V! Y/ Ustatic void McASPI2SConfigure(void)% m$ |8 o8 v6 B9 H8 b
{# P% j/ ]3 c3 s/ i& X j( c6 D
McASPRxReset(SOC_MCASP_0_CTRL_REGS);' K7 u( N7 m- d' n# ^5 k
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// U! y! G2 R6 u+ y0 \
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); p0 g, |9 l" _8 H0 ]$ p
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */; q" U" I# Q d5 b
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ o. a8 M- P' ~+ b% MMCASP_RX_MODE_DMA);' ^; I6 u$ X. T* z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. C* s% `7 K2 R5 i0 C- J7 Q+ X* h
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 ~& W. x \, X- l2 yMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
& [0 ]7 c- D8 W0 x- q0 _! G* OMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" ?$ e$ t: ~" T9 H# e q/ G
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + J& ^/ m5 |* h; d' O
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */# Q8 c8 L& @: S6 y; x" }8 T
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- I; R# h! {# x/ C* {McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ V% @" l0 R, I6 n, u$ ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! a% N: C& I7 S% }% Q0 t& t$ h% b7 J/ i; e0x00, 0xFF);
/* configure the clock for transmitter */ D; S x% Y5 i: P
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ u% ]7 Y! @% d/ h: O/ G
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : I% a5 s( W6 ~8 @5 ~9 n
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ h" V1 J* ?. k+ Y0x00, 0xFF);
, D z, v3 Y1 o! q
; y0 n: q% A& `. {3 d1 s( _$ H5 C/* Enable synchronization of RX and TX sections */
- T; O' W7 ]; ZMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
* l, U) l6 A" B+ h0 ?8 X7 y# _McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 x9 _6 [% S" j+ XMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
' L: |4 D ?9 L: h7 Y. y2 W** Set the serializers, Currently only one serializer is set as; v. P' b) L+ o B) O. u8 x
** transmitter and one serializer as receiver.
' J r/ }/ T7 i0 x/ ^ t*/' O( B6 m1 U* u& _: Z: L
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% A$ h% i3 p2 S/ t4 W# J
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*7 W) s, K u, A6 O& ^3 a& E% P
** Configure the McASP pins 7 S1 u& B/ ]3 l5 J9 Z
** Input - Frame Sync, Clock and Serializer Rx! I% {' _; R' E$ y3 R- B, A
** Output - Serializer Tx is connected to the input of the codec
$ I; D( C& b& I& l*/6 N2 s0 k" g1 T; x
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ y$ J- g6 ]5 ]6 K6 A! {McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; W! E1 t% ?; `7 l! O# q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) p7 ^: [# N; [+ C9 f; w7 r| MCASP_PIN_ACLKX
* t. m; b+ p% p4 Z2 c; H| MCASP_PIN_AHCLKX K; C# ~$ B. s9 G" O6 K
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */6 d! t" K0 O) |. \5 T' s* o' d- f
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + B& e% C6 E1 t
| MCASP_TX_CLKFAIL $ G1 Z8 V# r0 @, K/ Z, w
| MCASP_TX_SYNCERROR9 v+ g0 e7 V* E9 j% o* Q3 d
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 A- x) m9 r( |" K k0 L2 K
| MCASP_RX_CLKFAIL( I/ ~; d5 M% T9 y
| MCASP_RX_SYNCERROR
- U0 K4 g( B* e. ^ {4 Q' Z| MCASP_RX_OVERRUN);
5 [ d; L# e9 f$ w' [8 H" a}
static void I2SDataTxRxActivate(void)7 S6 ]" @/ u% ]0 W" c3 t
{
+ R+ f9 i! m6 Y, e" R/* Start the clocks */' K* J: v9 s/ Z# S4 c- l5 W) I% g% P
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% I, W$ R2 p0 ^/ ^( ?McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
# r& }! [, v J6 y; E0 d4 V' aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% G3 ]/ Y: S0 I8 oEDMA3_TRIG_MODE_EVENT);
" @- }! z" K4 L7 C, _) a. rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 J0 m s9 i* O, h) q6 D/ uEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
; t$ \; k8 N7 j, MMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; U0 D9 [5 U' K+ S' p2 ^0 CMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" B& U m. n% {3 gwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
0 w: ]$ y1 p1 R7 a" ^8 f N' yMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 B; h2 w1 E2 k; X9 a q$ I4 t
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! N! B" V$ \' d" _+ V1 `$ ]$ t}
d' e. K# x. h$ K3 R# O8 c4 @请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
a8 A+ a8 C# K" `$ m' U" {9 Q0 e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |