嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,& ?8 W4 T$ b U- S0 y1 V/ K
input mcasp_ahclkx,
' j" N1 a0 J- b" [: S% p$ }" Oinput mcasp_aclkx,
( q+ U: ?; l* _: X" Tinput axr0,
( }& d( N/ L( m; V: W- Y) b$ D! b9 h
output mcasp_afsr,
8 ]# Q/ ]; o* [) Zoutput mcasp_ahclkr,$ w L+ y: _1 n: I1 X" q7 @
output mcasp_aclkr,4 |3 p% u/ T. k- V- M- F+ x" M
output axr1,
5 L/ L4 u' Z% S8 g: L
assign mcasp_afsr = mcasp_afsx;% b3 p( x' K7 j: z3 R3 ^2 |
assign mcasp_aclkr = mcasp_aclkx;- j! M. `6 t5 ~& |! K. e8 x& Q1 a% c
assign mcasp_ahclkr = mcasp_ahclkx;
' i8 C5 B# n' }5 P; |/ Lassign axr1 = axr0;
$ c) e9 B# Q9 \( n* P/ N a6 E
* [: j- L% E- o' `在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" d& I4 D& o% Astatic void McASPI2SConfigure(void)
1 S: P' j6 A, R1 g |{
r; l3 K; `9 I8 jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);& G: a6 j. o) w1 V- G/ @+ g
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */5 W. s8 ?& W* |. A
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 V/ v$ @# f( m& s4 }0 A0 e
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
- W/ p3 K# O' ]. DMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ q# X' _! ?! j1 g/ X8 aMCASP_RX_MODE_DMA);2 _& N3 P! f+ N) H4 Q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! J+ n- f. i4 w
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */# ?! R( ^$ t' A/ X* {- U: e @
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & e( r/ t k5 ^( L J1 e
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( b( Z5 R2 i: x7 b% ]. G9 s' `
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& O- k7 } A$ U: ^5 T- R1 TMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
& s8 @' \" e% l6 rMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, I/ u) k4 H' d0 J5 N PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# C' g$ n" s$ O) t% u1 VMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# r, m/ u& M, |) C/ D' ^8 K, b% J0x00, 0xFF);
/* configure the clock for transmitter */
/ I# F' k4 C% E. r4 P P: ZMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# y! C4 [3 t- t" n7 G1 \
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 1 d. U, O! z; C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( C2 l$ h3 ]; c+ A& X$ ~8 P
0x00, 0xFF);
4 S3 d* b2 l" W4 a( T, C) u
8 X( I6 k: w+ B5 z/* Enable synchronization of RX and TX sections */
2 a: [9 x, O' @$ Y5 RMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */5 }, @, F* N2 J3 x" g+ Y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' F9 P P' e0 d G. \
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( K; ~2 U3 M6 `4 ]( q0 q$ O0 l** Set the serializers, Currently only one serializer is set as' o3 e p8 a7 n" D3 U [
** transmitter and one serializer as receiver.) e/ h' R6 z6 r1 a7 }
*// |7 v# r4 H6 {- [/ p( Q" u
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- |8 E) P) I$ H6 \McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*& p+ n1 W$ f* t- H
** Configure the McASP pins 5 D1 A' l/ @1 J- N$ r2 A3 R( F2 C
** Input - Frame Sync, Clock and Serializer Rx6 R* }; C& w' H/ _& Q1 S5 G
** Output - Serializer Tx is connected to the input of the codec
/ v/ q3 F; f5 r( j*/
; n. i# s. G! c# q- q7 S* _" A; TMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; |5 y g( [- V4 cMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: M3 H1 m# o5 N8 x' V' Y1 PMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX$ t7 V& O6 s2 m
| MCASP_PIN_ACLKX
( D& J v7 u3 i| MCASP_PIN_AHCLKX; a0 Y# D' l5 i. E
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */ M% m; |; s9 d1 x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( y. y8 J5 O, G| MCASP_TX_CLKFAIL 8 d, R, T5 ^% r- M
| MCASP_TX_SYNCERROR) O% c) c, k+ e: t
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : Y5 _% J- v4 V
| MCASP_RX_CLKFAIL- g% \* x2 l5 r, D' I) L
| MCASP_RX_SYNCERROR
5 h; I8 D. z) N) v" h0 Q| MCASP_RX_OVERRUN);
& m- j) Y# Y0 l" O}
static void I2SDataTxRxActivate(void)# p3 w! ~4 ^: A) B# F! F
{( K% O) i8 h! [, V6 t! G `! G
/* Start the clocks */9 M4 [9 M% W# d; P
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);& v7 o4 ^* z. ]* D+ J$ R& |, J
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */; E8 F3 c. P0 U/ X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 o- Y- W s9 \1 d0 U
EDMA3_TRIG_MODE_EVENT);% N; O$ A- J" k4 Y) ]0 A
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 j' o# V* Q7 {EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
/ d3 J: g1 e9 d0 r+ HMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; m2 C) [# v' P. i7 b2 ~McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
k% [, ^ F) N" o+ Nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */# J o- G I- U; P2 T; z# g% o
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 N( w5 Y' F. DMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. N) a/ l u$ M h}
5 C n$ }1 A3 R2 W- m8 S
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
~- k0 s: g; ^' |) u. L% T
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |