嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
% A6 J; ~5 b5 i- r1 G& U7 Zinput mcasp_ahclkx,
T" O6 J5 E* m0 t! ninput mcasp_aclkx,
6 T1 E) l r. N$ u$ }' l. `1 Yinput axr0,1 J7 @, p4 \4 D: Q2 S2 [7 w
1 `; V) n4 z; N! O) Koutput mcasp_afsr,- c+ c1 u$ o7 ]2 }6 e
output mcasp_ahclkr,
G% t$ H$ P' E6 m- ?output mcasp_aclkr,2 l2 }; B; y# |# ^! U
output axr1,/ v9 b* Q9 ]+ B
assign mcasp_afsr = mcasp_afsx;
! s N* F; e2 q+ _assign mcasp_aclkr = mcasp_aclkx;
3 d5 z3 q3 [: j% |" T$ Aassign mcasp_ahclkr = mcasp_ahclkx;! _4 n3 x" h) E& |+ |9 m2 x
assign axr1 = axr0;
+ s6 O p& W1 c
5 `( E8 q9 }! R% J* y. ]* h& b
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
2 \2 b: Q! G2 O' A( a* {4 k
static void McASPI2SConfigure(void)
$ N3 F" A9 s: ^$ x{, H* V7 [% a2 ~
McASPRxReset(SOC_MCASP_0_CTRL_REGS);" r% k7 u9 P4 a% V2 M+ E: ]
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */4 I9 H& Y U, x+ k' a8 \( q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 V0 U1 Z7 ?5 O! v( ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */% W0 Q3 \. u. [! s; X# ^7 h
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ |% v) `, r2 o" z ~
MCASP_RX_MODE_DMA);7 V: A d# n3 |. m! C
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," V5 `; O/ E$ c9 ^% x
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; Y. ~4 h" W2 `9 t: X: X' U; [
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
0 y# _: s4 u/ r$ yMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( j! a4 ?2 D/ q8 v
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 i1 J d/ f& N) n: kMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */" x: w& r( m9 k' A
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 S1 u/ r7 h6 ?* t
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
: |* s8 ~& g4 q Q# V6 ]McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 d& B0 W; W3 _8 R2 N. C5 y0x00, 0xFF);
/* configure the clock for transmitter */6 q, ~) g) T$ M" J) w s+ ]
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 j& ?( T# z& |& c: z, d$ _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . Q B3 X5 {, k! ?2 T
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: P" Z4 S0 h: b( |* o0x00, 0xFF);! ]% S# C% D! m* v8 m9 u8 C9 P% _
x1 ^! n1 ~0 G+ Y$ r
/* Enable synchronization of RX and TX sections */ " e. g7 @2 g) s3 j0 F8 }/ H7 {
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ w+ L4 S1 F; L* Z) H W0 r$ mMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 {8 O( C( ]/ I5 WMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*- E# o" } T2 v
** Set the serializers, Currently only one serializer is set as% ?% A; p: N+ W1 O; w8 F
** transmitter and one serializer as receiver.; e7 j9 j V, N. O7 z2 r
*/
* b. g o2 G: ~McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ s' v" c! g4 Y' S8 Z: o
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*8 [1 A" w' z" R. W9 G" W
** Configure the McASP pins 1 n3 O1 ~3 {4 b# L2 ]7 U
** Input - Frame Sync, Clock and Serializer Rx# H" l+ u4 @" C( ` s4 Q
** Output - Serializer Tx is connected to the input of the codec - \6 @" `/ H6 H( M$ v) W
*// P) G7 \; b; t4 D# v/ M$ w7 g
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. B+ L, H3 N( p3 Q2 l9 [0 A* i) ]
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 M8 v* r* b3 I. f6 ?
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 M" i9 R e- N6 Q( A) u
| MCASP_PIN_ACLKX
6 ^0 z# E4 V8 K _| MCASP_PIN_AHCLKX) N0 Z0 R7 l5 S3 Q. y; i
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
: k# j, ]; I: Q% G# J, PMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, ^' z6 E$ ]. N% T. u| MCASP_TX_CLKFAIL % R$ n! L4 {: i* N( Y
| MCASP_TX_SYNCERROR0 z2 P0 l% w8 c) J/ Q
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% [4 Q5 ]3 A) E0 H H: b0 k" t: g| MCASP_RX_CLKFAIL/ ~' D' Y( K. z' C: p8 k( o3 E4 G
| MCASP_RX_SYNCERROR 0 ?4 }7 w# L* S, @% o @ d
| MCASP_RX_OVERRUN);
% w# `# H& E, P: ~" H8 u}
static void I2SDataTxRxActivate(void)
, B% u9 E x9 N{
% w: ? j- z. P: k8 P/ w/* Start the clocks */
/ m' W3 d- R8 }( sMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ f& ?# g0 G* R; P, x1 W6 a5 F+ EMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */) ?, r& X9 k& Q# I. O0 ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- Z6 Y2 p( J* @, Z/ {EDMA3_TRIG_MODE_EVENT);
r2 L% A, w' ~& UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ L6 ~/ `( N6 B$ h) v8 ~EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */* m2 Z2 r- g l0 |6 F: z7 u0 o
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. o6 M6 a! V, i3 x3 r- u, W( C7 j
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
[1 w' |5 K: S7 fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
; f" h6 P& U# \3 ~6 W* w3 WMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; j8 l: y4 @1 v8 V" N+ p* xMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 W" w* J4 S, [+ A: b3 l- \) u
}
5 O1 _2 }( r% }" R
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# w" {+ K5 r4 a
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |