嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx," s2 z- |5 ~& l% N' ~* [4 m
input mcasp_ahclkx,4 D+ M* D) Y1 i0 B( h+ e
input mcasp_aclkx, m+ h) R# A( H: S( x3 j
input axr0,
# r& w$ }1 b( M2 p' f- x
9 @# H8 e/ M! Q' houtput mcasp_afsr,
$ ~0 ?+ _1 C V/ s0 C2 t8 youtput mcasp_ahclkr,
0 t0 p9 k; t- E3 b1 j6 woutput mcasp_aclkr,9 M* p3 a: b* K" M P
output axr1,! s" @3 P- Z- V* T+ s& ?
assign mcasp_afsr = mcasp_afsx;
8 A$ C6 z- ]# _, [$ _& ]' o9 Wassign mcasp_aclkr = mcasp_aclkx;
1 ?. g0 j2 X* n+ K* I" b7 i% Z2 @assign mcasp_ahclkr = mcasp_ahclkx;
$ {5 P. U5 j2 g* r7 ^: \" k4 a6 passign axr1 = axr0;
/ `$ D% N' Z2 ? M. _6 q
. R* d; X, M* I6 q1 M在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! ?6 P! ^9 u8 N4 s8 u0 T5 H& W
static void McASPI2SConfigure(void), h5 h' w0 o& T4 Z/ \# b
{- S3 ?+ a5 d1 v: V: D
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
' v7 n/ F1 H+ o. a9 ^4 IMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
; {: b: D9 g7 ]2 e3 UMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 B- B: b" y7 k
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */5 H. T/ Q2 N, \0 u
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 j: _) U# k8 I2 }! jMCASP_RX_MODE_DMA);* U3 l; [1 N: M) F9 g: e# @4 ?$ j
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 I! B% K- ]7 i5 g- C Z1 gMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 G8 B$ f$ Q3 G9 ~McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 ]3 L0 V# d ~0 w, S/ @MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; D1 @7 W& A" ~+ V: {* X3 w9 }
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' E/ A% z" ^/ s1 B( eMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */$ {2 A) t4 f3 L( N8 ?& Q% C
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ F. R* h9 Z2 {+ C; d6 r$ ^
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 Q' j6 l+ K8 ~& A! V
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 Z1 z" D) \4 u8 {& k$ h0x00, 0xFF);
/* configure the clock for transmitter */0 M" M6 j: A: K% G) x; n9 b* d! z
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" @1 e, w0 `0 G9 Y7 t4 d5 K; H* R: _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 k' b/ e' [8 A& |. }
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) l: \( M8 S3 R0x00, 0xFF);% e- q: |% K1 w t" h3 X
. }/ q" i) A' C5 i6 y! T/* Enable synchronization of RX and TX sections */ + f9 Q: E3 h, x5 |
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 k6 M( t$ v' P) e7 e6 g
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ g2 C$ u, q3 L+ n
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*" y4 u- U$ C3 U, ~9 K# N/ t1 w0 m
** Set the serializers, Currently only one serializer is set as
) E. \8 T& a- G6 d! d. Z2 V** transmitter and one serializer as receiver.
$ j% d: J7 b1 _/ ?*/' A& T6 e) D) M, A$ w3 M5 s8 h$ @( x
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
0 t( U% s' }0 I# g, nMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
3 u" ]: @( G. o/ u" ^** Configure the McASP pins 4 j( H7 a; b5 `
** Input - Frame Sync, Clock and Serializer Rx: ?: ]' W9 z8 x0 H& d
** Output - Serializer Tx is connected to the input of the codec
/ p- N7 D1 b2 ]5 Y0 v5 O# ]*/5 t3 r) N, \1 ]5 Q
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
, K- H u+ L8 ~6 A# r0 d; Y' ZMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 Q+ d. Z, J3 ^0 q6 P, T" YMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ U6 H8 b# d: f| MCASP_PIN_ACLKX
3 ~% b0 Z1 Y" e| MCASP_PIN_AHCLKX
& Q& f- I E C7 m% P3 ]# h9 k| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */3 m& b" C Y0 v; A
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 L/ z3 l) R4 v5 f0 b
| MCASP_TX_CLKFAIL
6 n; ~5 L$ o( q- [" K y8 {8 O) C2 _| MCASP_TX_SYNCERROR
; @$ d6 o4 Y! s3 ^3 B* D y5 || MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ B5 D2 j' N# n) f# G| MCASP_RX_CLKFAIL& \9 r+ }" w& e- E
| MCASP_RX_SYNCERROR ( ^3 F$ P4 B: L# }: K6 a5 f# o
| MCASP_RX_OVERRUN);
6 W; i% _& A9 j0 X" H1 b}
static void I2SDataTxRxActivate(void)% e2 X: a" W# i) k' m
{
2 Z8 q& d n& b" ~" S _/* Start the clocks */$ }) P* s0 [+ c/ w7 O4 [: y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 U3 ~$ h) G5 |* h+ Q- m- K4 |$ MMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */. z! K, \2 T5 d- J L9 @; b3 G. Y( x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ V# _) V$ n& K: E4 I4 ~' UEDMA3_TRIG_MODE_EVENT);
$ i5 {( H( v9 X5 @! P6 sEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 K' p9 p( M8 M7 OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
" Q8 z1 } w/ g/ {McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, n2 R9 L- V, q1 E0 l3 V5 e9 WMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
; t" A& a9 c! v2 Zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */. k* L( n5 g9 W3 m4 B6 l9 M& U
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);& P- `4 h: b& h7 |( \4 {8 O* e3 G) F
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; c; q* M9 G$ n a5 t}
; S7 w4 U2 I$ W! w, r
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: i/ H |! I8 L7 t; {
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |