嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,3 G/ N* Q) |. R- }( v
input mcasp_ahclkx, ~' J! s' @9 q( n4 c, V, `% i! ~
input mcasp_aclkx,
1 R4 i1 K1 V N1 n, {; o, Xinput axr0,+ L; l) a% m9 E6 o$ m8 P! S
6 w7 _8 O8 F5 l+ R) |
output mcasp_afsr, x3 j) Q1 B4 l! h6 ^2 Q1 l
output mcasp_ahclkr,
0 t2 a2 m. _: d0 `output mcasp_aclkr,3 I9 A2 ?! q: k2 V, K: q& m
output axr1,
m/ Q/ r5 V# D( x: u
assign mcasp_afsr = mcasp_afsx;
# L$ q* c$ F; c4 B) s5 Massign mcasp_aclkr = mcasp_aclkx;/ |0 }+ y) R. r& ]& V
assign mcasp_ahclkr = mcasp_ahclkx;
1 s/ g/ B3 F2 r- V. Y% Qassign axr1 = axr0;
S* C& r# {) q# Y2 Y" ^' u1 A+ W ^2 G' w2 P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' Q* Z& f |) h U6 [$ k; Z8 R3 B
static void McASPI2SConfigure(void)% c" s7 D3 Q: k2 a5 S5 I
{" F( ?" R5 {2 U ?) r" s
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
. L7 {! `1 Y+ n7 y4 GMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */0 J7 l& l. u( B$ a$ T) \5 W8 _
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' v6 X _6 C* z$ k7 AMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
4 M- h/ T& l9 D$ I! WMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 M9 g8 H" y0 yMCASP_RX_MODE_DMA);$ l8 V. M$ h* v1 U: k
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 u" d8 F9 d! x2 h3 B! K) n- q$ n
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */, C1 }, ^; w7 C# u; r% e: t* P
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ J6 K9 _5 I* L9 vMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; O6 ^6 ~/ y7 ?; |6 f4 _7 \McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 a+ o+ M& b B) | K
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
3 H" W% j% w f; W2 A, e6 DMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);' ]# n/ p3 _2 T |; w. X! R
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' J5 p! p, @3 D: j. u8 SMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& Y6 x, I! L, p( Y( L( X! T7 n0x00, 0xFF);
/* configure the clock for transmitter */
9 H' v) Q* [6 J+ oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; A* z: |5 |' W5 ]( l! j G( K/ u# v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 m+ ^' k; p* _# {8 p1 f; @ I6 lMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ m$ o8 l7 `& [" J a3 ^3 P0x00, 0xFF);
( P* }6 [+ _' e S/ n2 k ~ g
4 V5 S% i2 f. i* W7 }) v, Y/* Enable synchronization of RX and TX sections */ ; P6 {( U' r! r9 L; _( ]
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */9 q0 p. E1 x; n6 {8 H |
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ O- P7 ]# O; l, I2 l
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*$ X$ t9 u% ]# M
** Set the serializers, Currently only one serializer is set as
; c. g. D8 o& ~9 u0 Z f$ [** transmitter and one serializer as receiver.
6 d7 `% G$ _, N+ Y( `*/$ \3 I3 h1 y- ~* r; l9 K; R
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& A2 G1 O4 c! A0 U' w
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
7 E0 D6 c; H) k$ I7 I3 t* n** Configure the McASP pins
" `1 g3 p) w! i4 `** Input - Frame Sync, Clock and Serializer Rx
6 m. f# q: f; ?4 K** Output - Serializer Tx is connected to the input of the codec " g2 u* w$ t- q s1 U
*/# {; g/ R9 a8 R ^& u
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" L% U, f; ]: \0 L, r5 p$ qMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, b: R$ p( g* p
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* ?, c# Q- n; K; f/ ]. T
| MCASP_PIN_ACLKX
g3 j, P, e# ?" x ~( x( u| MCASP_PIN_AHCLKX9 C! M& ~! e$ B5 V
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */3 g3 G$ t% T8 i& R3 R4 V0 z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 F/ T! E& H7 x+ O5 D" M; K) h3 r
| MCASP_TX_CLKFAIL
7 _& m% a# g" h1 N| MCASP_TX_SYNCERROR! F! s: x1 o. {, [5 [% |
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& U* N; b5 L1 `! s| MCASP_RX_CLKFAIL& Z& ], v5 t6 e( h
| MCASP_RX_SYNCERROR ; N9 A/ D7 L# g6 n
| MCASP_RX_OVERRUN);: j: L: T1 n7 e( T N* w
}
static void I2SDataTxRxActivate(void)
( T* Y7 r, v' k3 G; q6 l# X{
: R. E$ x6 Z' Y/ f/* Start the clocks */1 R+ ]- c, \3 n9 Q0 n" g& Z" R1 j
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
| o( A$ w' a2 G9 U( PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */$ A; B# D3 K1 Y5 \$ f/ u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 s, c: g3 ?$ P) \
EDMA3_TRIG_MODE_EVENT);
/ T4 h- {" s6 r" X* p+ REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ O& r5 E- }3 [- P( I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
2 O) Z7 Y& U e, i6 |. m1 cMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 r5 Z! p7 g7 ?/ M" L( W% M5 x
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */8 |8 o/ V% S3 \* U5 D
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */5 M( X( l5 T+ @) j
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; j3 R9 ~2 j# q( ]McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 p8 ]$ v$ A! y( w}
7 e) B$ c. U+ O请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
C* W/ |" c! V8 v2 @! D- _
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |