嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
+ p g# ?% Y, ?& _0 {& t2 einput mcasp_ahclkx,
! i; L5 ]$ V- V4 {input mcasp_aclkx,
7 t# b; }$ [9 q" k! l8 u7 C+ C0 j: Jinput axr0,' S P" ?: G9 e( H
0 T* S% b- N# G1 U
output mcasp_afsr,
0 y- x* C) ?+ G& K1 `output mcasp_ahclkr,
, e, B7 F% x" g' `3 ]8 poutput mcasp_aclkr,
1 r: q$ V: R+ y. Z4 S/ j7 m: x1 houtput axr1,
) c' Q$ T+ c5 K; _# N
assign mcasp_afsr = mcasp_afsx;
2 O, W' Z2 \+ D- `4 Kassign mcasp_aclkr = mcasp_aclkx;
3 e5 W3 m. ^* _+ z! ]! x* _. `assign mcasp_ahclkr = mcasp_ahclkx;
2 h) N3 Q% |1 i* Nassign axr1 = axr0;
, V3 M4 t# v! T/ y1 J2 Y$ T' K3 G- ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. B2 X. k) w! f' ?4 X% f3 ?static void McASPI2SConfigure(void) C* Z/ \( G5 C' S
{( k* X5 D8 w, H) o; r S: g! J
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* g% V' a) s2 n1 m+ cMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */* _8 K, S7 A3 s+ i/ v! s4 r
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' T8 ` D4 a0 ^; [! GMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */# l: h( R: q& r
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, x2 @# E) x, ^# d
MCASP_RX_MODE_DMA);
# v& G D0 o5 w' t$ f" K) jMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 [0 u, T# h% c% \8 v7 MMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 `" j8 q* S4 p/ @3 Z4 h& n" Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ f' K1 O: O1 c, e% a: [0 n. ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
- [$ h& q2 d; G4 N8 oMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 C% @6 T* ] p+ G1 B/ T5 r
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
$ ^# e7 u( f- R0 M4 LMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
* L; f8 T K C: |$ u' LMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & z/ w2 v; B$ `' L. l/ f
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# n6 S/ W# I. Q0 ~' v+ `0x00, 0xFF);
/* configure the clock for transmitter */9 L( D+ o4 r1 R" T+ [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 x, s3 I7 [5 }7 ]$ Z
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 G* L k7 ` F/ XMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 u: \. y3 |& ~+ Y. P# ?' E5 B
0x00, 0xFF);& q _* k* C$ }: y& c
j2 `) Q0 S2 j | w/* Enable synchronization of RX and TX sections */ # {/ s: a8 q4 H- z& Q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
5 Q3 z: D0 a3 V& r0 {! p/ bMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ C3 ` A! d" J$ f% bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
. s F d# G& d' k; x2 y, U) Y** Set the serializers, Currently only one serializer is set as' K- S( m4 l0 O3 z Z5 I6 I
** transmitter and one serializer as receiver.3 R. p( h% D5 I, K8 i, }/ K$ D! t
*/6 c# |# G: m+ E @6 d
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* Y9 n; N& w! y4 X
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*. p5 U3 \, I$ \: x4 @( S9 Y
** Configure the McASP pins ! s0 e, L5 B' n. V/ r7 Q; g
** Input - Frame Sync, Clock and Serializer Rx
, D1 E9 `9 |, s9 a$ G: X5 \( [** Output - Serializer Tx is connected to the input of the codec 6 h% C; }/ G, @
*/
; ]2 A) E7 F8 _7 a7 W# A AMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
& o" ?7 i& ~, \$ I6 w6 d! m! _9 CMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- R) D ?( c' n+ T" T. ?
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX \: ^$ G4 S. j5 I8 }
| MCASP_PIN_ACLKX
* d# k! d6 d- J) x8 x| MCASP_PIN_AHCLKX5 ?: H7 _1 U% m6 l+ E8 H4 _8 |* q- K2 q
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% B$ w& ? |/ M4 m+ R. n
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + M( o4 i1 _0 M. Z( L2 h9 h
| MCASP_TX_CLKFAIL
+ a% r9 I _( ^$ c& h| MCASP_TX_SYNCERROR7 ~9 l7 P/ S* Y$ S5 |- D- t
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # f' ]9 g0 q' f1 t$ P
| MCASP_RX_CLKFAIL
2 v3 n' G3 v' |+ r| MCASP_RX_SYNCERROR ; \) S7 V# ?3 @! m) t8 x7 S
| MCASP_RX_OVERRUN);: u* ~& Z) e+ V
}
static void I2SDataTxRxActivate(void)" t% S" D! t" ]. D) _1 Z0 Q6 O8 D4 ^
{$ J* o3 C+ R" ]# P. w
/* Start the clocks */
X# d; u- {+ n- R! t" fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ P& C& G. W0 I: Y+ _& L$ nMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */# u" V9 _& B, L6 Z, e; {4 e
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 S( r) a( C6 j* v# q! x' I3 i
EDMA3_TRIG_MODE_EVENT);
/ k7 F( U2 a+ p% P) |" qEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & E- D: f2 E x- t4 ^1 B
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */' j4 H6 G7 J8 L2 K$ h8 ^
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 P7 f0 K' |$ U5 ]( b3 `McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */, b5 ^4 s ^& ]4 r& l& D
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
: e2 H( s3 B0 G0 P' W+ tMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- j* a$ E* t1 S# _& RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- W) g0 a, d& s$ o8 r. h( d) C}
; {& B6 c3 m/ \, d1 F
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 B9 g0 e! h) d, U
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |