嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,4 R: h/ z5 j- ~) f, s- d
input mcasp_ahclkx,
- _! E m/ _4 F. I: Q& Z& winput mcasp_aclkx,3 y" L$ T) ?5 f1 |. i" ]7 I
input axr0,% x" ]; n g/ G. ?- F
( \0 H, Y' v( v( g. E# h7 Coutput mcasp_afsr,, {4 U( C% j* p' l+ B) \4 P
output mcasp_ahclkr,
$ J* b0 x5 V$ ?: D2 k9 \* koutput mcasp_aclkr,
. M- G/ r- L4 L& [% woutput axr1,2 u& M% e/ b: [ X% W( R
assign mcasp_afsr = mcasp_afsx;
# |) e* Y/ t5 [assign mcasp_aclkr = mcasp_aclkx;, j: Y1 M3 ?3 H, O! C0 X, P8 s3 c
assign mcasp_ahclkr = mcasp_ahclkx;
: ^+ K$ L7 t5 P. s- ]5 z3 iassign axr1 = axr0;
$ g" L" V; t$ V F
4 `5 e9 \- q5 V+ h
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
4 H3 g+ \9 z- z2 A ?: J5 R) p
static void McASPI2SConfigure(void)% D. e9 d+ |6 r/ t+ P+ d
{
4 B- Q6 b. i- D, PMcASPRxReset(SOC_MCASP_0_CTRL_REGS);7 U$ {% L" N: h: ]$ ]- t5 g S# [
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
3 I* C& V: D( }) K' C6 K7 wMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 M) [1 a( p1 A( T* h% U2 n6 L
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
+ } I6 ^3 b* z2 CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 E o, Q* F1 J4 v& A1 d" D
MCASP_RX_MODE_DMA);
/ Z4 u" ^% [; Q J- B4 |McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 X4 H r: R/ E) pMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */: h. ^9 ^5 [$ j( m* T$ E: }
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
u. d2 n8 L( W( v2 {' v( ~! o" C' b0 d; IMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% [4 z0 v, Z8 w6 X3 ^7 AMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + S4 B; e* a& @
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
. J/ ^3 t2 t1 J; C$ kMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
?! h% _; ~% k. nMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 Z) K7 b6 J. f5 z; H- q" T! {9 j
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 I9 O0 B- n% d$ P
0x00, 0xFF);
/* configure the clock for transmitter */! m: O2 {0 V h) U& k5 C3 ^
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ [) R1 }, F: c) kMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- d3 l9 G$ n4 d; i4 P9 {5 MMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, I& [- r V# ]3 D! ^
0x00, 0xFF);5 h P& T* s5 F# G
, |! m1 Z- i' g& ^" ^1 d. o
/* Enable synchronization of RX and TX sections */ * p6 s' d- R& ]/ y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */& t _% T, ?( e. ^4 M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( v: T1 X, o. @1 X/ _% Q7 o
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
. W# I* \3 m6 _' c9 n7 Z1 s- ]% R- L** Set the serializers, Currently only one serializer is set as* c+ H1 U$ p5 \/ y( ?% r0 |
** transmitter and one serializer as receiver., ~! {6 ?7 a( ~1 M+ }7 A6 e
*/
: @# n! W* ?& H) w% f" }& _$ i: lMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 k6 O5 p; [4 e) {6 V+ k6 ]
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
% S- X8 r& o: V( O** Configure the McASP pins
% y; V+ ^5 K6 p5 s* w) i, ]" [** Input - Frame Sync, Clock and Serializer Rx* n" L% ?0 I/ ^! C7 v
** Output - Serializer Tx is connected to the input of the codec
; ]( _6 z: D O$ ^* R3 ~' q*/9 S/ H2 S! ~0 F' V, W
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 i. ]) q1 s: k/ ?7 FMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& ^* b! ~$ r5 l6 s1 Y( S4 DMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. ^2 ]) [1 ]5 V; D% K n; V
| MCASP_PIN_ACLKX- `& X: j2 k" y, g. q
| MCASP_PIN_AHCLKX
) k, B- `- T; G" A$ H# M| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */2 O, y0 ]& U( `. d! @8 q, W
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 B: n) D; d7 ~% M, V6 ]
| MCASP_TX_CLKFAIL 1 X9 x6 m1 \0 B* a
| MCASP_TX_SYNCERROR2 ]/ F- d& {/ ~. k) P, e W( g
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: o7 ?- _% i- L1 |' T2 ]| MCASP_RX_CLKFAIL
" ?# s6 ]/ c& E| MCASP_RX_SYNCERROR
. i6 V" z! ~3 Y# b |! f3 ]$ ^3 v| MCASP_RX_OVERRUN);
1 R, k8 [* K+ g' P. q}
static void I2SDataTxRxActivate(void): r! h3 T& R5 ]9 z" ?9 G. l0 X
{+ Q* x+ S. `+ d
/* Start the clocks */% e, Z. {( h9 h3 _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" }7 ^5 \2 U- [McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */5 @. i. Q. a; b. D1 Y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ q- `) y# K- p* kEDMA3_TRIG_MODE_EVENT);; B2 H4 d; G, y5 t/ X0 \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , J% [4 d7 N3 a' D! d) {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */3 j- D/ {9 ~- ~0 T- F0 q e
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 J( R) o4 ]6 F/ h" u \0 u! r
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
* Q1 ?# [( J0 G% h8 Mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
: f& s) D' i2 L. U* jMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* a5 H, z7 k( b7 SMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
/ q8 W6 t' z! B* A# h6 |1 h}
/ i" _' }# y2 N( d请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 | j4 Q9 A& V8 q$ s* l- [* x
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |