嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
; f8 F1 G+ i* p1 K" I+ a, zinput mcasp_ahclkx,4 J! d# D' k6 Z6 Y
input mcasp_aclkx,
) U( s' C/ {3 P; ?input axr0,
! p( c. T4 A, `$ W B) {0 i+ y; F/ X0 u. n* L3 S
output mcasp_afsr,
3 A/ j7 |8 c* Aoutput mcasp_ahclkr,# C/ z2 L! D6 e/ i8 l q8 N9 B
output mcasp_aclkr,( `( b6 W; d* x$ G& b I/ j
output axr1,
' x! q* A9 k5 f( i0 j9 h# H$ Q) V
assign mcasp_afsr = mcasp_afsx;
@; i' C' U! V. Y6 uassign mcasp_aclkr = mcasp_aclkx;
% v+ z6 `9 r1 fassign mcasp_ahclkr = mcasp_ahclkx;& z9 j# G; Q7 F+ U
assign axr1 = axr0;
/ i5 ?: Q, y- E L/ U
, _/ X# v* ]# v# i
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! \( Y6 [' c, ~& r, `static void McASPI2SConfigure(void)
, n- |) ^/ z/ J3 d{
3 A( P$ S- q' g2 t. l& BMcASPRxReset(SOC_MCASP_0_CTRL_REGS);- e. ^: a( f1 b1 s' |
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
8 \% p4 w1 ~8 q( X" l9 F$ MMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, Q9 ]- f/ ]: y" ? OMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */4 F# r3 u( @$ v y: o8 |; u
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" b3 k9 Z7 ~5 \ y1 gMCASP_RX_MODE_DMA);/ K0 x- w1 F7 [* F" c$ Q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
b% U; g& T: |( s1 Y! ?8 W& qMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ @$ Q, Y+ t) Q- L- T+ OMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( ], u) A( G$ Z; m+ s$ b
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( e7 _' v' E3 FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, t6 {7 E3 J1 Z1 X+ S2 n9 JMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */' [( d5 `) h/ V. T* c
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
% _+ ^) O! t2 c3 t. yMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 o* H2 L- t2 y( M( b: v( [
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 ]/ }; O" Z; T, k( }
0x00, 0xFF);
/* configure the clock for transmitter */, p! D( v( L- R8 n7 X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) S! r4 e* r" G0 b* E/ Y" U
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + M) `: P U |+ l, F1 O; d/ `
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" z4 W* y g* j7 C# l- P0x00, 0xFF);
' g- ~* C% j; S
/ _8 B2 N5 N+ ?9 S& [/* Enable synchronization of RX and TX sections */ , q: d$ U& N6 `& T1 \! h4 }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, p" o1 S6 @" y6 v# H
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* ~, ~. c3 V1 T4 M9 @McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*. x& Q0 }" V9 O" A# u: N! J% C
** Set the serializers, Currently only one serializer is set as% w! w% o" e1 L' \# G9 B1 u' d
** transmitter and one serializer as receiver.1 G0 V4 t* C% ~
*/
; P( n+ ~0 d5 E/ kMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ |1 o3 O' }6 h* B
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*1 S9 E: U/ v5 x! v, E6 ?
** Configure the McASP pins
0 O* U) I! o7 ~# a$ ^# ~+ R1 l** Input - Frame Sync, Clock and Serializer Rx
0 f4 K$ u- S7 V1 d** Output - Serializer Tx is connected to the input of the codec
4 L( @: [0 t: G& r*/
9 \) Q) P1 T8 |% [6 a% A9 WMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
B9 g$ Y$ ?6 bMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 \. J- n1 E2 O6 KMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 J" u5 w: z6 f! g. x" I. a
| MCASP_PIN_ACLKX" `% ~9 {; V* `" J
| MCASP_PIN_AHCLKX2 ~$ E6 @ P! }+ w+ i
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */- }( l3 T: F4 [5 @# b
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR Y) R" G; x) F2 x0 n/ D
| MCASP_TX_CLKFAIL " A$ q( E+ z' m% Q
| MCASP_TX_SYNCERROR
3 a, T4 g5 e7 Y| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 r9 b2 v2 c% C| MCASP_RX_CLKFAIL! g& c: V4 u/ ?" Y+ D6 f6 z
| MCASP_RX_SYNCERROR * j& D. Q& Q/ W, N
| MCASP_RX_OVERRUN);- q9 A7 p, R# c+ a5 G% U
}
static void I2SDataTxRxActivate(void). L) B- E: I8 K1 l" E& a* t
{' `/ X0 S M# H& d
/* Start the clocks */! ]8 A8 J/ j, n; O. K
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. k# J( B. j8 n
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */* Q. n7 u- F ~5 f6 Z6 }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) M; Q8 f2 a3 v* U( Y1 W; E
EDMA3_TRIG_MODE_EVENT);4 y: E7 C% v( F& K$ F6 p" u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 z9 E" g" e9 k2 x7 B& b: XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
# P5 v( ?$ _3 Y6 R4 t* l) oMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# |0 H1 s% j8 A) g, {) D
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */+ W5 Y% Z1 V6 v" o) D9 t) Q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */# M+ l8 L( [' S8 s
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 ^6 K8 _) b+ a3 Y/ p% E
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 V7 _- @1 W( z3 `+ T}
+ S4 r3 x+ q0 s5 S请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% e; G7 q) Y; G
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |