嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
+ S. ~+ A) e! y# t: A; k% S. m6 _8 Hinput mcasp_ahclkx,5 h# i9 @$ G: f4 }3 S- R7 {9 G; N6 @: d
input mcasp_aclkx,! T7 W- `# M9 }! ?
input axr0,
/ n& V2 p- }/ ]+ X3 t4 @; e% f: y" \' y2 B4 X7 G: R1 {2 D
output mcasp_afsr,; b7 D7 r& `$ j; t8 G/ m3 S Z
output mcasp_ahclkr,# H" `6 c; Z2 i3 R; D
output mcasp_aclkr,8 P7 F: R* ^/ M/ _& ~, D# |
output axr1,& h* k* w# q+ m' [3 E( {# ]
assign mcasp_afsr = mcasp_afsx;
+ x0 f# L( d$ U1 P! L. }5 V* }assign mcasp_aclkr = mcasp_aclkx;
" P8 v: A5 v- N$ n9 S% B; massign mcasp_ahclkr = mcasp_ahclkx;" D! K7 z% |+ z6 v4 v8 b
assign axr1 = axr0;
' j( [9 Q9 j3 `$ r4 s6 ~) H9 d8 v
. X! _' Y) L% m* ~! B在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
5 D" L. X1 q/ e0 P
static void McASPI2SConfigure(void)
! C* S# N. n% q$ T" t4 X{6 s( V% m4 D; K
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 { H' u- c: b3 |* eMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */3 z5 J/ F3 D4 ?' L L" w2 p( `
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: m6 G" A& U" M3 f$ sMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
/ T: S- L1 e" n- ~* zMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 U; Q9 y0 X* `6 D+ F
MCASP_RX_MODE_DMA);. d" g1 d; g8 \( [# ^3 T% B
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 S+ @0 f X2 E( m9 {) }7 gMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 f* r, ?8 P- ]2 J3 Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
_. T z4 W: R7 bMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 L0 ^6 v. ^+ ^4 y- r9 UMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 [- C- f5 @0 }% }0 ZMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */" G: s2 U4 Z' r# S
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" q( D& y$ \5 w+ _# |1 oMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 G" d2 Q7 |, z% r6 PMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ |! U1 L$ Y+ k
0x00, 0xFF);
/* configure the clock for transmitter */
R- l M" J1 [0 SMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* I( n) P$ g4 t" C' J; h4 V
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 E1 a2 C4 O4 f/ ]" T" d$ T. S$ cMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! Z. n6 z( V/ u$ a+ S" |0x00, 0xFF);
7 u( T6 N# B) E) h% T+ ?2 z# d5 ]
8 ?( ?- F; ]& C6 A; S A/* Enable synchronization of RX and TX sections */
7 b# p& v% j- l: w2 v1 r7 H DMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */$ K5 `9 c8 ?3 ]# m& S
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( Q# A3 G- k0 ]$ Y" G" ]" t' v& NMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
/ M; C8 s# n4 i/ b** Set the serializers, Currently only one serializer is set as9 M6 r7 }' k) `0 j9 p( g
** transmitter and one serializer as receiver.$ q z- G6 ?9 |8 Y; E; M
*/
' @$ |( S' T; x$ Z% `" ^! BMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" z, J3 g& Q j6 L1 a
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*" i, H K# B0 I& n
** Configure the McASP pins 5 F) X3 E/ K. W3 o' U4 w
** Input - Frame Sync, Clock and Serializer Rx
. u4 h. x" W6 L# y. g** Output - Serializer Tx is connected to the input of the codec
( u1 f% k0 C$ I3 \3 u0 Z# k*/7 {8 o5 z: Q4 o* O8 K
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 s6 E& C% K; g) ^. AMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& n6 ~% z* C6 x3 ~McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! E" x; i4 B; J% N$ Q| MCASP_PIN_ACLKX: y# K1 z: C% r. _1 I9 u% v
| MCASP_PIN_AHCLKX- X- e: m& I+ Y" f! L) y* R5 w
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
+ C) s! x2 B- g1 X4 w% R3 x( Z4 fMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 L3 ?7 d: q: o0 Z" f! f$ S
| MCASP_TX_CLKFAIL ' M9 k, R, O8 n) ~6 u/ I
| MCASP_TX_SYNCERROR
1 j# o$ ?" {& c, C/ J1 U3 E7 x| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) u: t" h. ^" x( y! b/ t4 h7 I- V# U| MCASP_RX_CLKFAIL
' K. Z9 u. b U) L! h; w" ^| MCASP_RX_SYNCERROR 8 K8 Z0 [/ S" c1 n8 u4 f! q
| MCASP_RX_OVERRUN);
3 a. C# y4 i3 B* b. v- r}
static void I2SDataTxRxActivate(void)
. p( s( G0 U" @{" I/ G6 b+ A' a! i. u6 [2 @
/* Start the clocks */0 Z8 x$ j5 u. R. o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ G& `2 f3 a9 T1 j8 d' o9 X' aMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
. M! } l# m4 m H. LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* ^0 v% W' O7 |; b: X) c" f. dEDMA3_TRIG_MODE_EVENT);
( j c) v1 M8 d8 _# IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) w4 ]- V# A5 B o9 k# h3 dEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */1 \$ w) W' t" F3 q, d8 i% s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) f* I( k5 ]) ?8 @1 R* X
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */8 g4 ~1 J. e1 X& A, }2 A
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */0 c1 a+ A& y ]! B( ~0 @
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' K% S' m5 m7 PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);( N" a1 z. S! o
}
' _5 Z, O8 X) [2 a% z请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 y/ q: h4 t; p/ o
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |