嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,* T' o' s9 N# L* ~
input mcasp_ahclkx,
3 s0 M5 ~, w9 y1 y# C3 N- minput mcasp_aclkx,
5 B7 o$ }* j: O, Sinput axr0,
, K5 q/ B% I4 v" }( P' S* Q. }. q6 q7 t5 @
output mcasp_afsr,
1 m/ M2 W- P0 loutput mcasp_ahclkr,8 K, q: D# o) l" l4 l, I
output mcasp_aclkr,
* W: C' A9 P7 aoutput axr1,. y! l( h+ T. b
assign mcasp_afsr = mcasp_afsx;
$ U4 y+ i7 s" R# s# P* I- n( e Vassign mcasp_aclkr = mcasp_aclkx;
J# U( C- K% _* R) Qassign mcasp_ahclkr = mcasp_ahclkx;" Q- E% D6 h% D: l
assign axr1 = axr0;
7 I; s* b: }4 l9 O6 b( D
3 c3 p7 Y0 u2 A: [5 {! b1 |在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( y; h( t2 j# h3 J7 I; \static void McASPI2SConfigure(void)
) V! N5 \" |9 [9 w{
! G; M3 {* G2 P) YMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ }# R- w! P: `% V R, Y' U) iMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */) L- r9 A0 Q/ s6 b! {* w y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 c. K3 N% B8 p' X- n( Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */% R) q0 N6 D+ ], M7 v9 j0 I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 w. j i, ^, l( B% E+ xMCASP_RX_MODE_DMA);9 E5 X3 W8 ^2 T7 V* R
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; e" u* D( ]- a9 t: X
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 Y$ Y0 P% x5 r2 @ b# X2 w
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " d0 X& g7 W( V$ y. U" U
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 q$ M7 }7 \3 ^6 u! Q
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % v j2 k9 s0 M4 M) B# T
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */; s j( B' O( o6 l: ~; Y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
1 { G5 g( Y8 J+ j% `McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * B# _5 X" [/ Z3 W2 |" t! ~
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ h1 [; k9 ?- l
0x00, 0xFF);
/* configure the clock for transmitter */
# D* t6 S: K9 p* O" }7 [/ n3 x, gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. E, I! D$ m, _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 I8 ^! S; h$ T* _
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( @$ b9 s4 ^" J1 c# o0x00, 0xFF);8 y8 f# C6 x7 m& p# h$ z3 A% V
, `) l# Y' r, {. z* V
/* Enable synchronization of RX and TX sections */
$ O5 q* T4 C8 P2 p) Y EMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */0 X4 r E# z! y7 i! S! z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! I+ F x0 Q9 ?2 L) J4 Z6 T
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' n8 a4 [1 d) f
** Set the serializers, Currently only one serializer is set as
6 L1 R, Q7 ~+ L4 R( V; m# F1 T2 T5 x** transmitter and one serializer as receiver.0 E! X1 h4 B4 d$ T! y, l: G
*/% S; c2 c0 J8 J0 T. V
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ a' C5 ~& [, o3 q, j, ?McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
5 F9 A9 u8 _$ V+ \& [2 o3 f** Configure the McASP pins . H; q6 }, s! S/ ?7 b
** Input - Frame Sync, Clock and Serializer Rx! Y+ n: q* R& D) N) z- \
** Output - Serializer Tx is connected to the input of the codec $ q: b, K) A$ ?, X" L0 A& M3 |, S
*// q; {6 \3 A1 w2 v+ i1 |3 g9 s
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% ~* n4 I2 D/ Y0 N1 a% c' iMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. |9 l- ~8 s4 N' s5 PMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" S% J0 y; B; s. ~3 C& R$ S| MCASP_PIN_ACLKX8 I( a0 s% G3 o# n
| MCASP_PIN_AHCLKX& U: f1 }8 [: r z, R* Z: `) p
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
2 u# z/ M0 Q+ g* qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
* t5 F* d' @! G9 s) A# h9 F6 s9 Z| MCASP_TX_CLKFAIL ! I y4 B* Z3 L. L- b- {
| MCASP_TX_SYNCERROR
& I1 D2 w; g2 a5 X# |3 |" E| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 P& p5 d* _4 f; U7 T1 }| MCASP_RX_CLKFAIL& E% z' p" e7 E$ ?" u
| MCASP_RX_SYNCERROR
1 p: p7 l' x9 r* r| MCASP_RX_OVERRUN);
Q y3 N& A; N}
static void I2SDataTxRxActivate(void)
, d4 M/ _5 t8 H3 v' z" q{
3 j" U6 d# I5 z/* Start the clocks */ c Z( B' C/ @$ j5 l; }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' Q) y8 y0 s! \McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer *// O2 }, u8 ]* W3 L: t3 Y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 c5 P' h3 v0 Z' R$ FEDMA3_TRIG_MODE_EVENT);
: o9 r; u& C% P! DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
! G: h) i( s4 x; F3 S9 g& QEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
+ @+ V" l. `6 T9 i XMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* V1 ?3 A5 B2 k6 JMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# F( p4 k* {+ n" O* J
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */9 B5 c( y: p. F9 U1 F
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ h9 ?3 n. r; s U- D
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. E- J' G( t1 w2 F; j: `% O
}
7 b7 U* D# Q: f. p% _) g) W
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) {, G3 C7 V, _
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |