嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx, [3 [) M8 g& X, ~, h" H! ?/ O9 G' o
input mcasp_ahclkx,
* p% b1 A7 s8 j6 t- V' V7 Kinput mcasp_aclkx,
2 J7 [+ s" b( w q0 Binput axr0,
/ m) a+ g1 q& E/ k
+ a+ q6 R6 O' u1 G; v; G* H9 D& J! zoutput mcasp_afsr,
' t$ l9 t. Q; s# uoutput mcasp_ahclkr,3 b& U/ o) q+ g
output mcasp_aclkr,8 @! p% T* Q4 E/ f) X( Q3 y
output axr1,3 e8 a: e' E- g3 s$ D& `
assign mcasp_afsr = mcasp_afsx;
* r# ~& ?7 ?- G4 X! y$ O5 {assign mcasp_aclkr = mcasp_aclkx;
6 o: H X' J% ~2 iassign mcasp_ahclkr = mcasp_ahclkx;
5 @( N& T5 P0 P+ {assign axr1 = axr0;
- v+ i- }4 @: b; G6 e+ w5 x5 R; p5 U3 E. y, }" H+ s
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! ?' y/ i1 K* ]0 B# W& astatic void McASPI2SConfigure(void)
9 R% D& g- A4 P2 x" G{. W+ C* Z6 j% x, J9 r
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ b: k8 t: X H) i4 y K% zMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
9 \1 o L1 ]" H: V% K6 eMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' r2 c& Q. A, v6 k) `McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
- U, R( l! d: d; FMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( I. X: T1 H1 c! A9 v; L7 w* Q
MCASP_RX_MODE_DMA);+ H4 u& T0 a6 i
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," v& ^+ y" o: Z# z4 t
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 o' W/ F; \- j. ]
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, {8 G9 X3 B' l- [- Q
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 q% ]% f. s$ {# _' |5 bMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - b G6 x: b) }6 ?, y" H
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */& d. j2 m+ [ f
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ J: y* B- S- B0 ?0 U( p- C8 E( D
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % I+ J: K: C% E1 Q
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* ]% b) o& h5 `; v
0x00, 0xFF);
/* configure the clock for transmitter */
0 D% o1 E7 r. Z N. `# r+ s# SMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& U2 O% m m8 ~& B% D9 _McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
4 o2 j2 }& R; P' Z5 w4 rMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ [! N- i! m& Y: P0 Y/ Z
0x00, 0xFF);
: s( c0 H' B# d% X6 c
( l# n) H- l% Q `( k% {0 u: W5 P; i/* Enable synchronization of RX and TX sections */ 9 h) ]7 s/ X8 d6 [7 j0 N& h0 O; y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */ U" P' c+ p' e2 p
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) p1 P! X4 i2 Q" m# @McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*9 j; u# l3 m8 c( ^
** Set the serializers, Currently only one serializer is set as
+ a% k# t: X$ ]; b8 ]** transmitter and one serializer as receiver.
3 e+ n6 ?4 F. L7 c! s: G*/
$ K4 j( M! y; u6 S) cMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' S& {( G% a3 _. ]4 |% e Y# zMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
7 S' `2 F* w* U4 z8 G** Configure the McASP pins . r1 g. t& b! t: J! f/ o6 v
** Input - Frame Sync, Clock and Serializer Rx
' f' i7 j4 N9 Z! k8 D** Output - Serializer Tx is connected to the input of the codec - ~: V9 m7 T& N5 A' k# l
*/
' \7 `7 P5 H' [ ]7 dMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" Y1 x2 w* ^6 c5 b H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, V$ |! d+ C+ C% |: Y' a
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( o3 T6 w9 f* U0 ~0 C* h| MCASP_PIN_ACLKX
0 b% S/ F1 `6 ?) H( Z& \2 D| MCASP_PIN_AHCLKX
7 S6 M l2 ~5 Z$ M| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */1 L, {6 D* x u# h
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 @2 ^5 Q$ W% z8 Y6 q- W' b| MCASP_TX_CLKFAIL / g4 ~6 W9 r5 p: M2 P: ?" ^# |
| MCASP_TX_SYNCERROR
9 G) p( G2 B/ ]- C+ w| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & ~- N' [6 @2 o q3 T. @
| MCASP_RX_CLKFAIL! L2 K* ?) u' z& X$ Z7 s, B
| MCASP_RX_SYNCERROR ' O3 o: Z$ ~4 r1 f! i8 P
| MCASP_RX_OVERRUN);
3 T9 a& i- `8 m0 x9 v9 S% y3 P+ j}
static void I2SDataTxRxActivate(void)" v: ^3 Z, a8 P; c
{# h6 w% n. |9 d' V0 T- r
/* Start the clocks */4 _8 F* o- F h$ q6 R, o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
( R- j7 S) ]3 P/ Z) dMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */ r) e$ I8 R8 q1 D9 B) z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 _+ ^0 S, X+ B' j/ n) }
EDMA3_TRIG_MODE_EVENT);
: X& R4 B( u. |# W* B' @' xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # h3 s+ P( v- |& A- q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */ L r% {1 b7 d4 N z2 e9 I
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ a* w6 S0 E9 r. c. R$ w3 W2 f
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
3 n* g6 q/ Z: |. Uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */: | h8 a9 ?9 c$ k- m/ i* d
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ e3 C: i& P& O5 M% s9 cMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);" [3 y% s4 f( Y% {
}
; R1 e, _! i4 G1 c& T
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- A7 Y( n6 W6 p8 u- [' e1 Z% v$ T+ C
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |