嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,2 W2 I$ y _; W6 \7 t8 F
input mcasp_ahclkx,2 o6 E6 R; P& T- s$ K0 _7 F, ~$ d
input mcasp_aclkx,2 w; f) }1 T: d7 D. P
input axr0,' {3 Z6 U+ M% e5 z$ C
; o; t5 f- j$ n G) Z2 ^output mcasp_afsr,' p) T0 Q$ V. P/ D/ h
output mcasp_ahclkr,
3 G' j( i0 V+ {& boutput mcasp_aclkr,$ J! i; S+ L3 j4 R# L
output axr1,/ d) c0 \- n7 }8 q
assign mcasp_afsr = mcasp_afsx;
" W! J$ D' ]' {3 r+ d' k5 `assign mcasp_aclkr = mcasp_aclkx;0 }( `# Q2 E9 R7 L% v1 |5 Z, G
assign mcasp_ahclkr = mcasp_ahclkx;
7 S! } j' h. ~6 k5 X( Passign axr1 = axr0;
! x+ s V6 L. E0 O9 U2 h
# M) u0 d& n+ }" Y0 ]/ f# p
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 |2 a$ i# R0 \! l. `static void McASPI2SConfigure(void), h( M% P# E1 b* j- I
{
8 b: f9 M. g4 J! _- d2 R; nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
; Y/ g! E# m; M& QMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */2 {% F1 _% y5 d2 [' j+ ?6 D5 j
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 h2 j/ A G$ i$ T
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
, m# v9 S+ |0 g/ v- yMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 I9 Z G3 S. ?2 W! Q9 I, _/ wMCASP_RX_MODE_DMA);
* \! S2 I1 J% D3 }2 L- |8 pMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 O8 @5 H+ ?& N' \( XMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 W' O+ F/ @" J9 `* O! L- [
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 ^8 Z; i9 ^2 t$ I m# PMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);+ L) T, u2 ^3 |6 W( [0 [# c8 e p7 A
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; c8 A- @/ I. r& W; MMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
* @! c8 S8 c1 V; {McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
4 [, D8 i8 A# K i, TMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 Y, B9 A3 R+ S3 Q- S8 OMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, i6 q- G& B# N/ B1 N
0x00, 0xFF);
/* configure the clock for transmitter */
8 J0 |. J; u/ M) PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' @% `8 H9 L3 K
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 L4 P5 K) F. tMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- A2 f" T+ l9 @7 M( |$ I$ t0 G2 `0x00, 0xFF);
& a9 |" L. |1 e1 w" s* K6 ?* f# }6 j3 v
/* Enable synchronization of RX and TX sections */ ( i; n: ]- I7 V
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
) I, K0 Q( N% v" y1 PMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, m9 _0 C; D) N' a6 q2 z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*+ U( J3 h8 y/ S
** Set the serializers, Currently only one serializer is set as, S- H" L" ]' P) C% @$ X c
** transmitter and one serializer as receiver.
) f5 p' G. o Y' `5 e5 z. T*/6 ]2 D5 e$ O& k/ j
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! c( x2 G+ L1 U% O0 |1 K. }9 B4 M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*, U4 M; o5 y0 ~# g$ r
** Configure the McASP pins + _, R% i6 \( O' F: Q
** Input - Frame Sync, Clock and Serializer Rx
& v, H5 d5 S7 |& d9 d# |$ f** Output - Serializer Tx is connected to the input of the codec 5 q; ^% t0 j1 n7 I& O: [
*/. s. d5 @9 d. z) B3 u
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: v' g4 i: K0 k: D$ v. t+ [
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# S; Q' t E; r7 c
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
* j& k- `# E# }5 N6 W! X4 K| MCASP_PIN_ACLKX7 s) m9 Y) m# N
| MCASP_PIN_AHCLKX5 {: C' p" L9 V# y! C
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
! x( `) I+ q! D; [; D2 f! BMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. k! a" ]0 m7 ]( }5 _9 y0 i) ]| MCASP_TX_CLKFAIL
# E5 |- `5 O* n| MCASP_TX_SYNCERROR
. _( ?% K0 O) Y) R| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 }( n4 @+ M i# C* v| MCASP_RX_CLKFAIL
4 C/ M" p: H. M! ~1 K) F! F| MCASP_RX_SYNCERROR 5 a# @. j& M+ Y0 H. j) V
| MCASP_RX_OVERRUN);2 T9 [3 s# o4 }( W7 n
}
static void I2SDataTxRxActivate(void)
9 Q) K% q* b; \2 ^{: y j7 b. D) ?2 a
/* Start the clocks */- J0 ]" S7 ?) e
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
& Y7 y- y2 Y8 `' C& }2 PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
" J" e1 n! s, j" ?* e" S; J6 i7 G5 kEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: m3 Q. c% t( i5 q* s2 x; mEDMA3_TRIG_MODE_EVENT);
0 q5 Q) f, L" \1 F. b( DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 V4 F" Z- R1 C2 j, u
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
8 Y+ e) R; ~% ?* N* {McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 I) | \$ t2 n y7 Q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
3 Q% [/ Q& t; a3 Z0 _: m1 wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
4 g/ P6 b9 V+ `) H @7 ]# lMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
9 o9 g" s6 C" c bMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) n& }% z9 n( e2 s" c9 Y}
V& u( _7 B+ H请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ J1 u" a6 y0 o/ r, m
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |