嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,5 d; N4 ~! s% r5 y
input mcasp_ahclkx,
, B5 ^" t6 Z* `* Q. s& E! `input mcasp_aclkx,
' n* ~2 c2 i. r- {input axr0,, ], O/ e1 _2 U
5 p8 s$ x. _/ a( U% ?$ r& e
output mcasp_afsr,9 b& C/ \' ~1 V% ?0 r& J
output mcasp_ahclkr,1 X* `& k6 Y- l" I7 D6 P% D& g2 s4 F
output mcasp_aclkr,- U9 b5 l `( c& a1 g! e
output axr1,
0 t1 r/ B2 z5 L3 j5 S" H
assign mcasp_afsr = mcasp_afsx;8 t/ n& C4 ~! @
assign mcasp_aclkr = mcasp_aclkx;9 F0 e7 H3 E' E4 A' J3 Y4 Q
assign mcasp_ahclkr = mcasp_ahclkx;/ A" c# l3 p& U7 e: D
assign axr1 = axr0;
8 T9 r; X) C! i: d* q- v' \ i9 s
9 ^$ i X; j" z; Y8 ?在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
5 c1 [( A; |2 Y
static void McASPI2SConfigure(void)
# O# X+ t! D. A. Y/ Y{
8 s7 J ]( y7 Q3 |- @. n wMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
) A# W1 J4 o* p0 O! a$ A' WMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */4 F" ^3 T* T$ L" E& z. [( H, d. n5 t# X
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 J. ?# H! d0 y/ ^8 A& v* q( hMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
* z: N0 j- V* v y# i* R" U, lMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 L& ~5 U- z9 O3 G( S3 S% b3 BMCASP_RX_MODE_DMA);
; o& `; Z" U2 ~9 n9 oMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- g4 E: W! }! b0 Z+ P* g* g% r( o0 xMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 I- G& [2 o" j9 `& d/ }' g8 oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% }; M, ~( D/ V8 l: NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);0 @# B" a6 B% f) Y0 G/ H: R4 Y# S
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* x' v# m/ p' KMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
: x$ j) C3 f' R; PMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 A3 C9 p! X/ i2 k/ n% WMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; }$ a9 M! o9 w& x. w. Y) r$ \
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 q* X+ n! o/ P) U0 m# V2 w1 W
0x00, 0xFF);
/* configure the clock for transmitter */7 [+ U5 V$ e# l7 V5 Y& V4 q5 K$ ?0 h7 C. _
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, {1 w( j6 s( XMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( r6 ]6 z) C- [; ? m. e
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 B9 {0 C) g. D
0x00, 0xFF);! x8 E B0 A" j2 r4 w; @9 x
/ |" a1 @. y' r) s4 i
/* Enable synchronization of RX and TX sections */ X! K0 B9 b* ]% ~; s* }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */4 X" o6 h' f0 _* C' f3 x4 m
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" _' L: U) d# v# E3 fMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*2 X+ g7 C+ N$ ^2 A
** Set the serializers, Currently only one serializer is set as
1 J9 ^! U6 w% {* B- P$ H% L) ]** transmitter and one serializer as receiver.
( Z9 I+ x" S4 s \5 O: y- f*/
X% b' E' z/ V; r9 d6 @' N% G, o rMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 ~6 A, O& K; fMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
- Y& j$ B: H; \4 u& q/ b0 w** Configure the McASP pins . n' j M& x% R7 p/ n: j
** Input - Frame Sync, Clock and Serializer Rx
7 K% u- Q) t& ~# s$ `** Output - Serializer Tx is connected to the input of the codec 1 Z. `8 m+ j0 V/ {4 n
*/- `2 T5 f% f* h( ~3 }0 p
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 I- O1 j* J. v% k, [# K
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) _! ?1 e4 e: ?/ Z# I
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 u- `9 }" w$ O" n E| MCASP_PIN_ACLKX6 S1 K' {" @7 l4 s v
| MCASP_PIN_AHCLKX/ s2 p* }# e0 r1 e
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
8 X4 c+ J* `$ _* C; FMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: `) u( V) p+ p/ Z| MCASP_TX_CLKFAIL 6 B) F& b0 \2 G: B( ], c7 w
| MCASP_TX_SYNCERROR
/ M3 x* g' h0 J2 y5 d3 a7 ~| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: @: D( @. Y3 g| MCASP_RX_CLKFAIL* \' D( z# v) J3 L) E
| MCASP_RX_SYNCERROR & U3 ]/ ~- { {* e/ p* |
| MCASP_RX_OVERRUN);
+ A/ Q8 V+ [- F}
static void I2SDataTxRxActivate(void)( l* q! p6 S2 \ i, V
{+ l6 x* T+ j% Z* p
/* Start the clocks *// K# {/ p5 h9 \" ?# ]! D
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( R8 I! H7 c+ n9 i/ n! Y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */) F/ H6 y5 Q- b/ W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 ]# U6 r1 t/ x6 \6 }3 D
EDMA3_TRIG_MODE_EVENT);
% E, b0 a' Y9 ` S% MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, . l9 H5 O. C3 f+ s6 \" b- m
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
1 C2 Z0 Z( V PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 ?9 t2 i. G4 a) a: `
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
9 A6 u& {, q* ?# J, H. Rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. z& u. P- W8 g9 d7 pMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);- M" \/ A( @ z1 H+ ^4 [. R
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% a( u2 i C; E2 Q% O
}
. J5 J, F+ t: x! n- I8 t- O
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 S; N1 n6 |* P0 s3 ?8 T# J
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |